我正在为我在当前 DynamoDB 应用程序设计中发现的问题寻找解决方案。
背景:我有一个 Users
表,其中 username
作为散列键。其他属性包括 email
、password_digest
和用户详细信息,如 Name
。我设置了一个名为 EmailIndex
的 Global Secondary Index,将 email
作为散列并将表属性的一个子集投影到它。
我的用例:我需要确保 username
和 email
属性的唯一性。在 username
上做起来很容易,因为它是散列键。我曾假设在保存新用户之前,我可以查找 EmailIndex
以查看用户想要使用的电子邮件是否尚未使用,但我最近才意识到 Global二级索引不支持强一致性读取。这样做的结果是,我将无法检测到两个用户几乎同时使用相同的电子邮件地址注册的情况。当我在处理第二个用户的请求时对 EmailIndex
执行 Query
请求时,它将返回 false,并且我的代码将假定电子邮件地址尚未被占用。但是,在后台,DynamoDB 实际上是在为包含相同电子邮件地址的第一个用户处理 PutItem
请求。
我目前正准备用 UsersEmail
表替换 EmailIndex
并进行两次写入(一次写入 Users
表,一次写入此表新表)为每个用户保存和更新,这样我就可以查找 username
(来自 Users
表)和 email
(来自 UsersEmail
表)作为强一致性读取。还有其他我忽略的选项吗?
最佳答案
所以基本上你是在要求 UNIQUE 约束。
从这篇旧文章来看,ddb 似乎不支持:
您提到您想要维护一个单独的 UsersEmail 表,并将 email 作为 hashKey。我认为它肯定会起作用。您可能需要考虑的另一种情况。
假设 user_1 和 user_2 使用相同的电子邮件注册
t0: UsersEmail 中不存在电子邮件
t1:user_1 检查。不存在
t2:user_2 检查。不存在
t3:user_1 插入电子邮件。
t4:user_2 插入电子邮件。
在上面的场景中,您仍然会看到两个用户共享同一封电子邮件。解决方案是使用 Conditional Put .只有当该电子邮件不在表中时,user_2 才能插入到 UsersEmail。如果它在表中,请不要插入,您可能需要在 User 表中进行一些额外的清理(删除 user_2)。
关于amazon-web-services - Dynamodb 检查主键和另一个字段的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24067283/