Pra*_*tic 2 amazon-dynamodb dynamodb-queries
我是noSQL数据建模的新手,所以如果我的问题不重要,请原谅。我在dynamodb中发现的一个建议是在查询时始终提供“ PartitionId”,否则它将扫描整个表。但是在某些情况下,我们需要列出我们的商品,例如在ecom网站上,我们需要在列表页面上列出我们的产品(带有分页)。
我们应该如何通过避免扫描或有效使用来执行此列表?
基本上,有三种从DynamoDB读取数据的方式:
GetItem–从表中检索单个项目。这是读取单个项目的最有效方法,因为它可以直接访问项目的物理位置。Query–检索具有特定分区键的所有项目。在这些项目中,您可以将条件应用于排序键,并且仅检索数据的子集。通过查询,可以快速,有效地访问存储数据的分区。Scan–检索指定表中的所有项目。(此操作不应与大表一起使用,因为它会消耗大量系统资源。就是这样。如您所见,您应该始终偏爱GetItem(BatchGetItem)Query和Query- Scan。
如果您向数据添加排序键,则可以使用查询。也就是说,您可以将类别用作哈希键,将产品名称用作排序键,以便显示特定类别项目的页面可以使用按该类别和产品名称的查询。但是这种设计很脆弱,因为您可能需要其他页面的其他键,例如,如果用户正在寻找特定的手机,则可能需要供应商+价格查询。索引可以在这里提供帮助,但是它们都有自己的权衡和限制。
此外,在查询 / 扫描操作完成之后但在获得结果之前,将应用通过任意表达式进行过滤,因此您需要为整个查询/扫描付费。从字面上看,这就像自己在应用程序中而不是在数据库端过滤数据。
我要说的是,DynamoDB并不适合多种工作负载。可能也不适合您的情况。可以将其视为丰富的键值(对象的键)存储,而不是“经典” RDBMS,在这种RDBMS中索引成本更低,限制更少,并且为开发人员提供了丰富的查询功能。
有一篇很好的文章介绍了DynamoDB的潜在问题,请看一下。它包含一个很棒的决策树,可以指导您完成DynamoDB的论证。我将其粘贴在此处,但是请注意,原始作者是Forrest Brazeal。
最后,在SO上查看有关DynamoDB用例和问题的简短答案。
PS进行扫描没有任何犯罪行为(我实际上在我的一个项目中每天按计划进行一次扫描),但这是一个特例,对于在这种情况下使用DynamoDB的决定,我感到遗憾。在速度,金钱,支持和“肮脏”方面,它效率不高。我不得不在工作之前增加容量,然后在工作之后减少容量,但这是另一个故事……
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |