Dynamodb检查主键和另一个字段的唯一性

时间:2014-06-05 18:14:48

标签: amazon-web-services amazon-dynamodb

我正在寻找解决我目前使用DynamoDB应用程序设计时遇到的问题的解决方案。

背景:我有一个Users表,其中username作为哈希键。其他属性包括emailpassword_digestName等用户详细信息。我设置了一个名为EmailIndex全球二级索引,其中email为哈希值,并将表格属性的一部分投射到其中。< / p>

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

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

1 个答案:

答案 0 :(得分:6)

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

从这篇旧帖子来看,似乎ddb并不支持:

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

您提到要维护一个单独的UsersEmail表,其中包含电子邮件作为hashKey。我认为这肯定会奏效。您可能需要考虑的另一个案例。

让我们说user_1和user_2使用相同的电子邮件注册

t0:用户电子邮件中没有电子邮件

t1:user_1检查。不存在

t2:user_2检查。不存在

t3:user_1插入电子邮件。

t4:user_2插入电子邮件。

在上面的场景中,您仍然会有两个用户共享同一封电子邮件。解决方案是使用Conditional Put。 user_2只有在该电子邮件尚未存在于表中时才能插入UsersEmail。如果它在表中,请不要插入,您可能需要在User表中进行一些额外的清理(删除user_2)。