有没有办法对dynamodb中主键以外的属性(字段)强制执行唯一约束

Ali*_*Ali 38 unique-constraint amazon-dynamodb

在dynamodb中,如果你想在主键之外的字段中强制执行唯一性(就像你有一个用户表并希望用户使用唯一的电子邮件地址而主键是用户ID是一个数字)有其他方法扫描该表以查看该电子邮件是否已被使用?

yad*_*taf 33

简答:不.

DynamoDB是一个关键:价值存储.它非常适合快速检索/保存项目,因为它做了一些妥协.这是你必须自己处理的约束.

Nonethess,根据您的实际模型,使用此字段hash_key或考虑使用a 字段可能是个好主意range_key

如果无法做到这一点,我建议您对数据进行去标准化.你现在有类似的东西:

UserTable

  • hash_key: user_id
  • e-mail
  • ...

要确保单一性,请使用此架构添加新表:

EmailUser

  • hash_key:电子邮件
  • user_id

要确保电子邮件是唯一的,只需GetItemEmailUser之前发出一个.

这种去规范化在No-SQL数据库中很常见.

  • 现在可以使用全球二级索引处理最新的EmailUser信息.但是,这个答案并没有真正解释如何处理最终的一致性.如果两个服务器检查电子邮件地址,找不到它然后两个用户都插入该电子邮件怎么办? (18认同)
  • 如果你在range_key中设置``e-mail``,你只允许user_id拥有多个唯一的电子邮件.这不是你想要做的.如果您不能将电子邮件用作user_id本身,则需要对数据进行反规范化.我用可能的方式更新了我的答案,以实现您的目标. (5认同)
  • 你是对的.您需要维护此索引并手动阻止该电子邮件.将此表用作"自定义索引"将使您免于扫描并将其替换为2 GET.这不仅快得多,而且便宜得多. (2认同)
  • @JeffWalkerCodeRanger:那你在那个例子做什么?处理这些情景的最终一致性的行业标准做法是什么?有没有一种标准方法通过发电机专门处理这种情况?也许你不了解自己,但我想我会问. (2认同)
  • 似乎要处理最终的一致性,您可以进行“高度一致的读取”,以确保读取内容包含所有最新更新。真的吗?如果是这样,将方便的信息放在此答案中。@ JayPrime2012 (2认同)
  • 确实他们不是@SteveBuzonas.在花了很多时间思考这个问题后,我选择了一个表`User`哈希`GUID`和一个表`Email`哈希`emailAddress`.否则,正如您所说,电子邮件地址上的全局二级索引作为"用户"表中的辅助字段不会强制实现唯一性. (2认同)

小智 7

没有这样的方法可以强制其他属性的唯一性,但是使用 python 的 boto3 库,您可以使用客户端执行事务处理项目并使用一些复合键,并尝试复制您的条目并使用 transact_write_items() 将所有条目插入一次。aws对此有非常好的文档: https://aws.amazon.com/fr/blogs/database/simulated-amazon-dynamodb-unique-constraints-using-transactions/


Chi*_*dya 6

我认为下面提到的方法没有被讨论或没有讨论,因此发布相关链接以确保唯一的电子邮件(或任何其他属性)。这不需要创建另一个表,而是将其他项目添加到用户表的主键列中。

确保 DynamoDB 中唯一属性的替代方法