你如何查询DynamoDB?

时间:2012-02-03 15:34:29

标签: database nosql amazon-dynamodb

我正在关注亚马逊的DynamoDB,因为它看起来像是消除了维护和扩展数据库服务器的所有麻烦。我目前正在使用MySQL,维护和扩展数据库是一个彻头彻尾的问题。

我已经阅读了文档,并且我很难尝试如何构建数据,以便轻松检索。

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

从Dynamo文档中,您可以只查询主哈希键上的表,以及使用有限数量的比较运算符查询主范围键。

或者您可以运行全表扫描并对其应用过滤器。问题是它一次只扫描1Mb,因此您可能需要重复扫描才能找到X个结果。

我意识到这些限制使他们能够提供可预测的性能,但似乎很难将数据输出。并且执行全表扫描似乎就好像效率非常低,并且随着时间的推移,随着时间的推移,效率会降低。

对于Instance,说我有一个Flickr克隆。我的图像表可能类似于:

  • 图片ID(编号,主哈希密钥)
  • 添加日期(号码,主要范围键)
  • 用户ID(字符串)
  • 标签(字符串集)

因此,使用查询我可以列出过去7天内的所有图像,并且很容易将其限制为X个结果。

但是,如果我想列出来自特定用户的所有图像,我需要进行全表扫描并按用户名进行过滤。标签也是如此。

由于您一次只能扫描1Mb,因此您可能需要进行多次扫描才能找到X个图像。我也没有看到一种方法可以轻松停止X个图像。如果您尝试抓取30张图片,则第一次扫描可能会找到5张,而第二次扫描可能会找到40张。

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

或者我完全不在这里?

3 个答案:

答案 0 :(得分:18)

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

但是有一些技巧可以减轻疼痛 - 二级指数/非规范化可能是最重要的。

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

您必须决定所需的查询,然后围绕它们设计数据模型。

答案 1 :(得分:6)

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

此表“架构”可以是:

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

-

通过这种方式,您可以按用户ID进行查询,也可以按日期过滤

答案 2 :(得分:5)

您可以使用 复合哈希范围键 作为主索引。

来自DynamoDB页面:

  

主键可以是单属性哈希键或复合键   哈希范围密钥。单个属性哈希主键可以是for   例如,“UserID”。这将允许您快速读取和写入数据   对于与给定用户ID关联的项目。

     

复合散列范围密钥被索引为散列键元素和a   范围关键要素。这个多部分密钥维护着一个层次结构   第一个和第二个元素值。例如,复合材料   哈希范围键可以是“UserID”(哈希)和的组合   “时间戳”(范围)。保持哈希键元素不变,你可以   搜索范围键元素以检索项目。 这会   允许您使用查询API,例如,检索所有项目   跨越一系列时间戳的单个UserID。