3

我是 noSQL 数据建模的新手,所以如果我的问题是微不足道的,请原谅我。我在 dynamodb 中找到的一个建议是在查询时始终提供“PartitionId”,否则它将扫描整个表。但是在某些情况下,我们需要列出我们的项目,例如在电子商务网站的情况下,我们需要在列表页面上列出我们的产品(带有分页)。

我们应该如何通过避免扫描或有效地使用来执行此列表?

4

1 回答 1

11

基本上,有三种从 DynamoDB 读取数据的方法

  • GetItem– 从表中检索单个项目。这是读取单个项目的最有效方式,因为它提供了对项目物理位置的直接访问。
  • Query– 检索具有特定分区键的所有项目。在这些项目中,您可以将条件应用于排序键并仅检索数据的子集。查询提供对存储数据的分区的快速、有效的访问。
  • Scan– 检索指定表中的所有项目。(此操作不应该用于大型表,因为它会消耗大量系统资源。

就是这样。如您所见,您应该始终更喜欢GetItem( BatchGetItem)QueryQuery- Scan

如果您向数据添加排序键,则可以使用查询。即,您可以使用类别作为哈希键和产品名称作为排序键,以便显示特定类别项目的页面可以使用该类别和产品名称的查询。但是这种设计是脆弱的,因为您可能需要其他页面的其他键,例如,如果用户寻找特定的手机,您可能需要供应商+价格查询。索引在这里可以提供帮助,但它们有自己的权衡和限制

此外,在查询/扫描操作完成后但在您获得结果之前应用任意表达式过滤,因此您需要为整个查询/扫描付费。这就像在应用程序中自己过滤数据,而不是在数据库端过滤数据。

我会说 DynamoDB 并不适用于多种工作负载。可能,它也不适合您的情况。将其视为丰富的键值(键到对象)存储,而不是“经典”RDBMS,其中索引成本较低且限制较少,并为开发人员提供丰富的查询功能。

有一篇很好的文章描述了 DynamoDB 的潜在问题,看看。它包含一个很棒的决策树,可以指导您完成 DynamoDB 论证。我将它粘贴在这里,但请注意,原作者是Forrest Brazeal

在此处输入图像描述

另一篇值得一读的文章。

最后,查看这个关于 DynamoDB 用例和问题的简短答案。

PS 进行扫描并没有犯罪(实际上我在我的一个项目中每天按计划进行一次),但这是一个例外情况,我对在这种情况下使用 DynamoDB 的决定感到遗憾。它在速度、金钱、支持和“肮脏”方面效率不高。我必须在工作之前增加容量并在工作之后减少它,但这是另一回事......</p>

于 2018-12-02T18:38:12.223 回答