Amazon dynamodb DynamoDB键在主索引和全局二级索引中的唯一性

Amazon dynamodb DynamoDB键在主索引和全局二级索引中的唯一性,amazon-dynamodb,Amazon Dynamodb,我正在创建一个DynamoDB表来保存与单个对象关联的注释 注释在特定时间发布到对象,我使用发布时间作为范围,因此注释可以按时间降序排序。我有一个发布评论的用户的userId的全局二级索引,这应该允许我获取给定用户发布的所有评论 我的问题是,这把钥匙是独一无二的吗?我担心的是,从技术上讲,两个用户可以同时向同一objectId发布评论,因此评论哈希和范围键将是相同的 我的希望是,由于同一用户不可能同时在同一对象上发布两条评论,因此全局二级索引将使键唯一 Comment table: H

我正在创建一个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)          |
 ---------------------------------------------------------------------------------------

DynamoDB索引与唯一性无关。和索引允许有重复的散列键和范围键对。只有表本身的哈希键和范围键是唯一的


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

“或者,您可以将表的范围键设置为datePosted的复合值,并与userId连接起来。”,谢谢!“这样,范围键将始终是唯一的,但仍将按日期-时间顺序排序。”-是这样吗?如果将datePosted与userId连接起来,那么它不会成为字符串类型,并且字符串排序与日期时间排序不同。我遗漏了什么吗?你必须使用正确的排序日期格式,即ISO 8601,这在计算机特别是数据库中非常常见。