UUID作为DynamoDB中的主键-好还是坏主意?

时间:2019-07-01 03:15:38

标签: amazon-web-services database-design amazon-dynamodb

在新的DynamoDB表中,我的用例已经由以下关键架构设计满足:

  • 分区键:user_id
  • 排序键:entity_id

enter image description here

基本上,访问模式是:

  1. 获取特定用户的特定帖子。
  2. 获取特定用户的特定评论。
  3. 按特定用户列出所有帖子。
  4. 列出特定用户的所有评论。
  5. 列出特定用户的所有实体(发布或评论)。

如果我使用更多的随机ID作为分区键,而对上面的访问模式仅使用GSI,我会得到什么好处?

  • 分区键:pseudo_random_id(实际上这将是一个UUID。请忽略该插图中的UUID)。
  • GSI:
    • 分区键:user_id
    • 排序键:entity_id

enter image description here

2 个答案:

答案 0 :(得分:1)

您不需要UUID或任何伪随机ID。

如果一个用户特别活跃,您曾经有可能拥有一个热分区,但是由于DynamoDB的自适应能力,现在热分区为basically a non-issue。此外,您可能应该限制用户创建评论/帖子的速度,即使没有自适应功能,这也可以防止出现热分区。

(为什么要限制用户可以发布的速率?您不希望恶意行为者每隔几毫秒就可以创建一个新帖子-您应该有某种速率限制以防止拒绝服务攻击。)

答案 1 :(得分:0)

使用UUID不会为您做任何事情...

分区键的随机性无关紧要。重要的是您拥有多少个不同的分区键以及该分区键的条目的数量/速度。

换句话说,唯一值是唯一值。 Dynamo不在乎它是16个字节,36个字节还是128个字节。

Dynamo将其自己的哈希应用于分区键,以确定数据将放置在哪个分区中。