在dynamodb中,如果你想在主键以外的字段中强制执行唯一性(就像你有一个用户表并希望用户使用唯一的电子邮件地址而主键是用户ID是一个数字)有没有办法扫描表格以查看电子邮件是否已被使用?
答案 0 :(得分:32)
简短回答:不。
DynamoDB是一个关键:值存储。它非常适合快速检索/保存项目,因为它做了一些妥协。这是你必须自己处理的一个约束。
Nonethess,根据您的实际型号,最好在hash_key
使用此字段或考虑使用range_key
如果无法做到这一点,我建议您对数据进行反规范化。你现在有类似的东西:
<强> UserTable
强>
hash_key
:user_id
e-mail
要确保显示单一性,请使用此架构添加新表:
<强> EmailUser
强>
hash_key
:电子邮件user_id
要确保电子邮件是唯一的,请先向{strong> GetItem
发出EmailUser
。
这种去规范化在No-SQL数据库中很常见。
答案 1 :(得分:2)
没有其他方法可以对其他属性实施唯一性,但是使用python的boto3库,您可以使用客户端执行事务项并使用某些复合键,并尝试复制您的条目,并使用transact_write_items将所有条目一次插入()。 aws提供了非常好的文档: https://aws.amazon.com/fr/blogs/database/simulating-amazon-dynamodb-unique-constraints-using-transactions/
答案 2 :(得分:0)
DynamoDB本身不支持唯一约束,但是您可以通过使用atomic counter
以某种方式确保唯一性,并将此计数器值合并到您的数据中。
就我而言,我必须确保username
和userId
都没有重复项。 username
是我的分区键,因此使用attribute_not_exists(username)
来防止覆盖不会有任何问题;
对于userId
,我将首先从原子计数器中检索一个新值,然后将其作为我的userId值。在这种意义上,它可能不是完全顺序的,但可以保证唯一性。
答案 3 :(得分:0)
我不认为不会讨论以下提到的方法,因此请发布相关链接以确保唯一的电子邮件(或任何其他属性)。这将不需要创建另一个表,而是需要在主键列的“用户”表中添加其他项。
Alternative approach to ensure unique attributes in DynamoDB