Amazon dynamodb 什么';使用query从Dynamodb获取项与使用getItem逐个获取项的最佳方法是什么?

Amazon dynamodb 什么';使用query从Dynamodb获取项与使用getItem逐个获取项的最佳方法是什么?,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我正在尝试为具有多个位置的代理构建一个应用程序。下面是我的数据 | Partition Key | SortKey | AgentName | LocationAddress | -------------------------------------------------------------- | Agent1 | Agent1 | AgentName | | | Agent1 | Location#

我正在尝试为具有多个位置的代理构建一个应用程序。下面是我的数据

| Partition Key   | SortKey    | AgentName | LocationAddress |
--------------------------------------------------------------
| Agent1          | Agent1     | AgentName |                 |
| Agent1          | Location#1 |           | 123 MainStreet..|
| Agent1          | Location#2 |           | 1 MainStreet..  |
| Agent1          | Location#3 |           | 12 MainStreet.. |
我预计我存储的每个代理不超过20个位置

我的用例如下

  • 将每个位置与外部列表匹配(外部列表可能包含所有存储的位置。业务用例是根据数据库验证外部列表数据。)
访问模式选项:

  • 使用PartitionKey=“Agent1”和SortKey获取所有内容,以=“Location”
  • 使用PartitionKey=“Agent1”和EQ=“Location#1”获取项目
    • 根据StackOverflow问题,GetItem可能是具有PartitionKey和SortKey的更好选择
  • 相比之下,研究表明

    限制为1的GetItem与查询的延迟将相等

    如果一次需要N个位置,您可能会认为查询会更好。其中延迟为1,而延迟为GetItem的N个位置

    在做了所有的研究之后,我认为最好选择第二个选项,因为吞吐量大,而且知道您无论如何都需要所有数据

    查询DB一次将是1吞吐量vs GetItem,每次获取项目时吞吐量为1。
    我想讨论一下选项1是否优于选项2。

    对于GetItem请求,必须指定主键的完整值:分区键和排序键(如果表有)。因此,如果需要获取N个位置,则需要执行N个GetItem请求

    发出N个GetItem请求以获取N个位置将比发出一个查询请求慢N倍(最坏的情况),并且DynamoDB的实际用途并非如此。最佳实践是对数据进行建模,以便在单个请求中获取给定访问模式所需的所有数据。查看您的数据模型,您已经用一个包含代理和许多关联位置的单个项集合以这种方式对数据进行了建模

    通过查询操作,您可以获取多个项,并且必须提供分区密钥。排序键是可选的,但它支持比较运算符(小于、以开头、介于之间等)。这正是您所描述的:
    PartitionKey=“Agent1”和SortKey以=“Location”
    开头

    此外,使用N个GetItem操作将消耗额外的读取容量单位(RCU),因为每个操作将被四舍五入到最小1个RCU(或最终一致读取的0.5个RCU)。通过比较,查询的消耗容量是基于读取的项目的总大小计算的。(感谢纳达夫在评论中对此的更正!)


    因此,我想不出一个好的理由来解释为什么选择选项2(N GetItem请求)而不是选项1(单个查询操作)。

    我只想指出最后一段关于RCU的内容不准确:对于小项目,查询可能比单个项目的GetItem要便宜得多。使用GetItem,项目大小被四舍五入到4KB-读取1KB项目也需要一个RCU。但对于查询,总读取大小除以4KB。因此,如果您有1KB的项目,您可以查询其中100个25个RCU,而不是100个RCU。所以我进一步加强了David的建议:对于这个用例,使用Query,而不是GetItem。