主要和全局二级索引的DynamoDB密钥唯一性

fra*_*cis 7 amazon-dynamodb

我正在创建一个DynamoDB表来保存与单个对象关联的注释.

评论在特定时间发布到对象,我使用发布的时间作为范围,因此评论按时间降序排序.我有一个发布评论的用户的userId的全局二级索引,这应该允许我获取给定用户发布的所有评论.

我的问题是,这个密钥是否独一无二?我担心,因为技术上两个用户可以同时向同一个objectId发布评论,所以评论散列和范围键将是相同的.

我的希望是,由于同一个用户不可能同时在同一个对象上发布两条评论,因此全局二级索引将使密钥唯一.

 Comment table:

   Hash Key                   Range Key                      Global Secondary Index Hash
 ---------------------------------------------------------------------------------------
|   objectId   |              datePosted                 |           userId             |
| (not unique) |      (not unique if multiple users      | (unique across objectId and  |
|              |  post for the same object @ same time)  |         datePosted)          |
 ---------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

Jef*_*ger 25

DynamoDB索引与唯一性无关. 允许全局索引和本地索引具有重复的散列键和范围键对.只有表本身的散列键和范围键是唯一的.

在您的示例中,两个不同的用户可以在同一时刻对对象进行注释,并生成重复的objectId,datePosted键.有几种方法可以解决这个问题.您可以使用PutItem请求,其条件是主键为空,如API参考中所述.这将导致第二个注释保存失败,您可以向用户报告错误,或者只是使用更新的时间戳再次尝试.没有条件,第二个注释将覆盖第一个注释.或者,您可以使表的范围键成为datePosted与userId连接的复合值.这样,范围键将始终是唯一的,但仍将按日期时间顺序排序.这是DynamoDB的常见做法.

  • “或者,您可以将表的范围键设为 datePosted 与 userId 连接的复合值。”,谢谢! (2认同)