amazon-web-services - Dynamodb 检查主键和另一个字段的唯一性

标签 amazon-web-services amazon-dynamodb

我正在为我在当前 DynamoDB 应用程序设计中发现的问题寻找解决方案。

背景:我有一个 Users 表,其中 username 作为散列键。其他属性包括 emailpassword_digest 和用户详细信息,如 Name。我设置了一个名为 EmailIndexGlobal Secondary Index,将 email 作为散列并将表属性的一个子集投影到它。

我的用例:我需要确保 usernameemail 属性的唯一性。在 username 上做起来很容易,因为它是散列键。我曾假设在保存新用户之前,我可以查找 EmailIndex 以查看用户想要使用的电子邮件是否尚未使用,但我最近才意识到 Global二级索引不支持强一致性读取。这样做的结果是,我将无法检测到两个用户几乎同时使用相同的电子邮件地址注册的情况。当我在处理第二个用户的请求时对 EmailIndex 执行 Query 请求时,它将返回 false,并且我的代码将假定电子邮件地址尚未被占用。但是,在后台,DynamoDB 实际上是在为包含相同电子邮件地址的第一个用户处理 PutItem 请求。

我目前正准备用 UsersEmail 表替换 EmailIndex 并进行两次写入(一次写入 Users 表,一次写入此表新表)为每个用户保存和更新,这样我就可以查找 username(来自 Users 表)和 email(来自 UsersEmail 表)作为强一致性读取。还有其他我忽略的选项吗?

最佳答案

所以基本上你是在要求 UNIQUE 约束。

从这篇旧文章来看,ddb 似乎不支持:

Is there a way to enforce unique constraint on a property (field) other than the primary key in dynamodb

您提到您想要维护一个单独的 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/

相关文章:

python - 使用 Boto3 批量删除 Cloudwatch 日志组 - delete_log_group

amazon-web-services - 您如何找到用于在 Amazon S3 上创建现有多部分对象的部分大小?

node.js - 使用 ExclusiveStartKey 选项的 AWS Dynamodb 扫描

ios - Objective-C 类对象未映射到数组

amazon-dynamodb - 带有rockset和dynamodb的Grafana map

amazon-web-services - 访问拒绝上传到 s3

sql - Amazon Redshift 执行 Hash Join,即使在加入 Dist Key 和 Sort Key 的列时也是如此

amazon-web-services - 使用 docker composer 在 AWS beanstalk 上部署 docker

node.js - DynamoDB 查询相当于 "WHERE author IN [..]"?

node.js - 如何在 dynamoDB 上使用分页