【问题标题】:AWS DynamoDB Query based on non-primary keys基于非主键的 AWS DynamoDB 查询
【发布时间】:2017-11-27 22:53:02
【问题描述】:

我是 AWS DynamoDB 的新手,想澄清一些事情。是否可以根据非主键属性查询表和过滤器。我的表如下所示

商店 标识:主键 名称:简单字符串 位置:简单字符串

现在我想查询名称,但我想我也必须根据我所知道的提供密钥?除此之外,我可以使用扫描,但随后我将加载所有数据。

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    来自docs

    查询操作根据主键值查找项目。您可以查询具有复合主键(分区键和排序键)的任何表或二级索引。

    DynamoDB 要求查询始终使用分区键。

    在您的情况下,您的选择是:

    • 创建一个使用名称作为主键的全局二级索引
    • 如果表相对较小,或者如果您希望结果集包含表中的大部分记录,请使用扫描 + 过滤器

    【讨论】:

    • 名称可以重复,唯一的是ID或名称+位置。
    • GSI 可能包含重复键
    • 感谢您并为我指明了正确的方向,我在名称上创建了一个 GSI,但遇到了另一个问题,我想使用包含进行过滤,但据我所知 KeyConditionExpression 不允许我要做到这一点,有没有更好的方法来做到这一点?我的场景是用户输入了一个商店名称,我想使用包含进行过滤,最好忽略大小写
    • 不确定我是否理解正确,但如果您想进一步过滤查询返回的结果,那么KeyConditionExpression 不是放置条件的正确位置。而是查看 FilterExpression:docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
    • 但是,如果您所追求的是一种编写查询的方法,该查询对密钥本身进行通配符匹配,那么答案又是一次,不幸的是 DynamoDB 不支持这种类型的操作。在这种情况下,您必须重新考虑 DynamoDB。也许基于 ElasticSearch 的解决方案可能会更好。
    【解决方案2】:

    在使用 DynamoDB 时,您可以遵循的设计原则很少。如果您来自关系背景,那么您已经见证了主键属性的查询限制。

    • 设计您的表,用于查询和分离冷热数据。
    • 为查询非关键属性创建索引(您有两个选项,可以随时定义的全局二级索引和需要在创建表时指定的本地二级索引)。

    使用全局二级索引,您可以将任何非键属性提升为索引的分区键,并为排序键选择另一个属性进行查询。对于本地二级索引,您可以将任何非键属性提升为保持相同分区键的排序键。

    • 使用索引进行查询对于提高使用预置吞吐量的效率也很重要。
    • 虽然拥有索引会消耗表中的读取吞吐量,但它也可以节省读取通过 put from 的方式,如果您投射适当数量的要读取的属性,它可以在读取中带来巨大的好处。检查以下示例。

    假设您有一个包含 40KB 项目的 DynamoDB 表。如果直接从表中读取列出 10 个项目,它会消耗 100 个读取吞吐量单元(对于一个项目 10 个单元,因为一个单元可以读取 4KB 并乘以 10)。如果您定义的索引只是为了投影需要列出的属性,每个项目将具有 4KB,那么它将仅消耗 10 个读取吞吐量单位(每个项目一个单位),这会在成本方面产生巨大差异。

    • 对于 DynamoDB,您如何定义索引以优化查询不仅从查询功能而且在吞吐量方面进行优化,这一点非常重要。

    【讨论】:

    • 我只是不明白它是如何变得如此受欢迎的。开始工作是一件非常痛苦的事情,更不用说设置和维护数据的查询是荒谬的,并且不允许像 SUM 或 COUNT 等聚合......老实说,这比它的价值更麻烦95% 的功能可以通过在关系数据库中的表上使用连接来复制。我的意思是什么数据库需要你告诉它它应该在解析器中返回什么?我已经在查询中告诉了你我想要什么!
    【解决方案3】:

    您不能在 Dynamo Db 中查询基于非主键的属性。

    如果您仍然想这样做,您可以使用扫描查询来完成,但扫描在 DyanmoDB 中是昂贵的操作,如果表很大,那么它会影响性能,不推荐,因为它会扫描表中的每个项目和 AWS 成本您为该查询扫描的所有项目。

    有两种实现方式

    1. 保留 Store Id 作为 Dyanmo DB 表的 PrimaryKey/ Partaion 键,并添加 Name/Location 作为排序键(只有一个作为 Dyanmo DB 设计时只接受一个属性作为排序键。
    2. 创建全局二级索引以从您更经常需要的非关键属性中查询。

    在 Dyanamo DB 中创建 GSI 有 3 种方法,在您的情况下,选择带有选项 INCLUDE 的 GSI 并在 Idex 中添加 Name 、 Location 和 store ID。

    • KEYS_ONLY – 索引中的每个项目仅由表分区键和排序键值以及索引键值组成。 KEYS_ONLY 选项会产生最小的二级索引。

    • INCLUDE – 除了 KEYS_ONLY 中描述的属性外,二级索引还将包括您指定的其他非键属性。

    • ALL – 二级索引包括源表中的所有属性。由于索引中的所有表数据都是重复的,因此 ALL 投影会产生最大可能的二级索引。

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2019-04-29
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多