我正在创建一个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) |
---------------------------------------------------------------------------------------
答案 0 :(得分:22)
DynamoDB索引与唯一性无关。允许Global和local索引具有重复的哈希密钥&范围密钥对。只有表本身的散列键和范围键是唯一的。
在您的示例中,两个不同的用户可以在同一时刻对某个对象进行注释,并生成一个重复的objectId,datePosted键。有几种方法可以解决这个问题。您可以使用PutItem请求,其条件是主键为空,如API reference中所述。这将导致第二个注释保存失败,您可以向用户报告错误,或者只是使用更新的时间戳再次尝试。没有条件,第二个注释将覆盖第一个注释。或者,您可以使表的范围键成为datePosted与userId连接的复合值。这样,范围键将始终是唯一的,但仍将按日期时间顺序排序。这是DynamoDB的常见做法。