你如何查询DynamoDB?

我正在研究Amazon的DynamoDB,因为它看起来像是消除了维护和扩展数据库服务器的麻烦。 我目前正在使用MySQL,维护和扩展数据库是一个完整的头痛。

我已经通过了文档,我很难试图围绕如何构build数据,以便于检索。

我对NoSQL和非关系数据库是全新的。

从Dynamo文档中,您听起来像只能查询主散列键上的表,而使用有限数量的比较运算符来查询主范围键。

或者,您可以运行全表扫描并对其应用filter。 值得注意的是,它一次只能扫描1Mb,因此您可能需要重复扫描才能findX个结果。

我意识到这些限制使它们能够提供可预测的性能,但是看起来好像让数据难以获取。 进行全表扫描看起来好像效率不高,随着表的增长,效率会随着时间的推移而降低。

例如,我有一个Flickr克隆。 我的图像表可能看起来像这样:

  • 图像ID(数字,主哈希键)
  • 添加date(数字,主要范围键)
  • 用户ID(string)
  • 标签(string设置)
  • 等等

所以使用查询我将能够列出过去7天的所有图像,并将其限制在X数量的结果中。

但是,如果我想列出来自特定用户的所有图像,我需要做一个全表扫描和用户名过滤。 标签也一样。

而且由于一次只能扫描1Mb,因此可能需要执行多次扫描才能findX个图像。 我也没有看到一个方法可以轻松停止在X的图像。 如果您想抓取30张图片,您的第一次扫描可能会find5张图片,而您的第二张图片可能会find40张图片。

我有这个权利吗? 这基本上是一个权衡? 您可以获得真正快速的可预测数据库性能,几乎免维护。 但是权衡是你需要build立更多的逻辑来处理结果?

还是我完全脱离基地?

是的,您在性能和查询灵活性之间的权衡是正确的。

但是有一些技巧可以减轻痛苦 – 二级索引/非规范化可能是最重要的。

例如,您可以在用户标识上键入另一个表格,列出其所有图像。 添加图像时,可以更新此表格,也可以在图像ID上键入表格中添加一行。

你必须决定你需要什么查询,然后devise他们周围的数据模型。

我认为你需要使用另一个表创build你自己的二级索引

这个表“模式”可能是:

User ID (String, Primary Key) Date Added (Number, Range Key) Image ID (Number) 

这样,您可以通过用户ID进行查询并按date筛选

您可以使用组合散列范围键作为主索引。

从DynamoDB页面:

主键可以是单属性散列键或组合散列范围键。 单个属性散列主键可以是例如“UserID”。 这将允许您快速读取和写入与给定用户ID关联的项目的数据。

组合散列范围键索引为散列键元素和范围键元素。 这个多部分的键维护第一个和第二个元素值之间的层次结构。 例如,组合散列范围键可以是“用户ID”(哈希)和“时间戳”(范围)的组合。 保持散列键元素不变,您可以search范围键元素来检索项目。 这将允许您使用查询API,例如,在一系列时间戳中检索单个用户ID的所有项目。