DynamoDB二级索引的唯一性

时间:2014-06-24 18:38:17

标签: amazon-dynamodb

问题:

具有作为复合散列范围键的主键的DynamoDB表是唯一的。这是否也延伸到二级指数?

示例:

我对DynamoDB表进行了评论,其中包含 post_id 主键和 comment_id 范围键。 此外,还有一个带有 date-user_id 范围键的本地二级索引。

每个条目都是用户在帖子上留下的评论。二级索引的目的是计算在特定日期有多少唯一身份用户对帖子发表评论。

条目1 : post_id:1 comment_id:1 date-user_id:2014_06_24-1

条目2 : post_id:1 comment_id:2 date-user_id:2014_06_24-1

条目3 : post_id:1 comment_id:3 date-user_id:2014_06_24-2

当我执行指定二级索引的查询,并传入post_id等于1且date-user_id等于2014_06_24-1的条件时,我得到的计数为2,我期待一个数为1.

为什么辅助索引有两个具有相同主键/范围键的条目。

3 个答案:

答案 0 :(得分:16)

辅助索引不保证唯一性。来自文档:

  

此外,请记住,全局二级索引不会强制实现唯一性

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html

答案 1 :(得分:3)

本地二级索引(LSI)中的每个项目与表格中的相应项目具有1:1的关系。在上面的示例中,虽然LSI中的条目1和条目2具有相同的范围键值,但它们指向的表中的项目是不同的。因此,索引键(散列或散列+范围)不是唯一的。

全球二级指数(GSI)在这方面与LSI类似。每个GSI项都包含表哈希和范围键(对应项)。有关详细信息,请访问http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Projections

答案 2 :(得分:1)

不,他们没有。索引使用dynamodb流异步更新,这意味着它们最终将保持一致,这也意味着dynamodb不会在更新发生时检查唯一性。

另一方面,这也是为什么您只能对GSI索引执行扫描或查询,而不能对GetItem进行扫描的原因(即,GetItem应该返回一个项目,但是可以有许多对应于给定索引值的原因)。