rea*_*not 2 amazon-web-services amazon-dynamodb
我正在寻找解决我在当前DynamoDB应用程序设计中发现的问题的解决方案.
背景:我有一个Users表username作为哈希键.其他属性包括email,password_digest和用户详细信息Name.我已经成立了一个全球二级索引称为EmailIndex具有email作为哈希和预测表的属性,它的一个子集.
我的用例:我需要确保属性username和email属性的唯一性.这很容易做到username因为它是哈希键.我假设在保存新用户之前,我可以查找以EmailIndex查看用户想要使用的电子邮件是否尚未使用,但我最近才意识到全局二级索引不支持强一致性读取.这样做的结果是,我将无法检测到两个用户使用相同的电子邮件地址几乎同时注册的情况.当我做了Query该请求EmailIndex在处理第二用户的要求,它会返回false和我的代码将假设电子邮件地址没有被抢走.但是,在后台,DynamoDB实际上正在处理PutItem包含相同电子邮件地址的第一个用户的请求.
目前,我正在朝更换标题EmailIndex用UsersEmail表,做两次写入(一次为Users表和一到这个新表)为每个用户保存和更新,只是让我可以做一个查找username(从Users表)和email(从该UsersEmail表)为强一致性读取.还有其他我忽略的选择吗?
所以基本上你要求UNIQUE约束.
从这篇旧帖子来看,似乎ddb不支持:
有没有办法对dynamodb中主键以外的属性(字段)强制执行唯一约束
您提到要将电子邮件维护为单独的UsersEmail表作为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).
| 归档时间: |
|
| 查看次数: |
4055 次 |
| 最近记录: |