在 dynamodb 中,如果您想在除主键之外的字段中强制执行唯一性(例如,您是否有一个 users 表并且想要用户的唯一电子邮件地址,而主键是一个用户 ID,它是一个数字)除了扫描之外还有其他方法吗表格查看电子邮件是否已在使用中?
4 回答
简短的回答:没有。
DynamoDB 是一个键值存储。它非常擅长快速检索/保存项目,因为它做了一些妥协。这是您必须自己处理的约束。
尽管如此,根据您的实际模型,您最好使用此字段hash_key
或考虑使用range_key
如果这是不可能的,我建议你去规范化你的数据。你目前有类似的东西:
UserTable
hash_key
:user_id
e-mail
- ...
为确保唯一性,请使用此架构添加一个新表:
EmailUser
hash_key
: 电子邮件user_id
为确保电子邮件是唯一的,只需在之前发出一个GetItem
至EmailUser
。
这种反规范化在 No-SQL 数据库中很常见。
没有这样的方法可以强制其他属性的唯一性,但是使用 python 的 boto3 库,您可以使用客户端来处理项目并使用一些复合键并尝试复制您的条目并使用 transact_write_items() 一次性插入所有条目。aws 有非常好的文档: https ://aws.amazon.com/fr/blogs/database/simulating-amazon-dynamodb-unique-constraints-using-transactions/
我不认为是否讨论了下面提到的方法,因此发布相关链接以确保唯一的电子邮件(或任何其他属性)。这不需要创建另一个表,而是在主键列的用户表中添加其他项目。
DynamoDB 本身不支持唯一性约束,但您可以通过使用atomic counter
此计数器值并将其合并到您的数据中以某种方式确保唯一性。
就我而言,我必须确保两者username
都userId
没有重复。是我的分区键,所以使用防止覆盖username
不会有任何问题;attribute_not_exists(username)
因为userId
我将首先从原子计数器中检索一个新值,然后将其作为我的 userId 值。它可能不是完全顺序的,但在这个意义上它可以保证唯一性。