DynamoDB二级索引的唯一性

use*_*393 16 amazon-web-services 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.

为什么二级索引有两个具有相同主键/范围键的条目.

Mik*_*ade 20

二级索引不保证唯一性.来自文档:

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

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

  • @justin.m.chase 您应该为此使用事务:https://aws.amazon.com/fr/blogs/database/simulated-amazon-dynamodb-unique-constraints-using-transactions/ (2认同)

San*_*rma 5

不,他们没有。索引使用dynamodb流进行异步更新,这意味着它们最终将保持一致,这也意味着dynamodb在进行更新调用时将无法强制执行唯一性(它不会检查辅助数据库上的唯一性)索引,因为这是一个异步操作;如果这样做,它将无法返回失败,因为实时调用已经完成了)。

附带说明,这也是为什么您只能对GSI索引执行扫描或查询,而不能对GetItem进行扫描的原因(即,GetItem应该返回一个项目,但是在缺少唯一性的情况下,可能有许多对应于给定的二级索引)约束)。


小智 0

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

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