DynamoDB中的主键和GSI设计

时间:2015-11-14 05:49:39

标签: primary-key amazon-dynamodb secondary-indexes

我最近开始学习DynamoDB,并创建了一个表格'评论'具有以下属性(以及DynamoDB类型):

productId - String
username - String
feedbackText - String
lastModifiedDate - Number (I'm storing the UNIX timestamp)
createdDate - Number
active - Number (0/1 value, 1 for all records by default)

以下是我希望在此表上运行的查询:

1. Get all reviews for a 'productId'
2. Get all reviews submitted by a 'username' (sorted asc/desc by lastModifiedDate)
3. Get N most recent reviews across products and users (using lastModifiedDate)

现在,为了能够运行这些查询,我在'评论'上创建了以下内容:表:

1. A Primary Key with 'productId' as the Hash Key and 'username' as the Range Key
2. A GSI with 'username' as the Hash Key and 'lastModifiedDate' as the Range Key
3. A GSI with 'active' as the Hash Key and 'lastModifiedDate' as the Range Key

最后一个指数有点像黑客,因为我介绍了“活跃的'我的表中的属性只是为了使值可以是' 1'对于所有记录,我可以将其用作GSI的哈希密钥。

我的问题很简单。我已经阅读了一些关于DynamoDB的内容,这是我能想到的最好的设计。我想问一下,我是否可以在这里使用更好的主键/索引设计。如果DynamoDB中有一个我可能错过的概念,那么在这个特定的用例中可能是有益的。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你的设计是正确的:

  • 第2点的表格密钥和GSI将涵盖您的前两个查询。这里没有惊喜,这是非常标准的。
  • 我认为你最后一次查询的设计是正确的,即使有点hacky,可能不是最好的性能。考虑DynamoDB限制,您需要使用相同的散列键值。您希望能够按顺序获取值,因此您需要使用范围键。由于您只想使用范围键,因此需要为哈希键提供相同的值。您应该注意,当您的表扩展到许多分区时,此可能不能很好地扩展(尽管我没有任何数据可以支持该语句)。