创建并验证2个attirbute在DynamoDB中是唯一的

时间:2016-03-06 09:07:44

标签: amazon-web-services amazon-dynamodb aws-lambda

我需要创建一种方法,让电子邮件和用户名成为表格的所有部分(如果需要,可以是表格)。我似乎无法找到其他方式,只有1个唯一(主键),然后另一个只在partion中唯一。

我希望检查一个电子邮件地址,以便每个用户都有一个唯一的电子邮件和一个唯一的用户名。

所以数据库不能有:

email    username
a@a.com  aa
b@b.com  aa

OR:

email    username
a@a.com  a
a@a.com  b

我需要两者在整个系统/数据库中独立存在。

这是怎么做到的?我正在使用Lambda和DynamoDB。

而且我也需要独立知道哪一个也不独特。

2 个答案:

答案 0 :(得分:1)

dynamodb唯一性仅适用于hash_key(或复合键:hash + range)。

我认为在这种情况下最好的选择是确保应用程序级别的唯一性(在用户名上添加GSI并尝试查询新用户名)。在电子邮件上,它很容易检查唯一性,因为它表哈希键..

答案 1 :(得分:1)

我的理解是,您希望确保user_names是唯一的且email_addresses是唯一的,并且user_name映射到1且只有1 email_address和{{{ 1}}映射到1且仅email_address

执行此操作的一种方法是使用两个DynamoDB表。第一个(表A)将使用user_name作为HASH,与之关联的记录将包含有关该用户的所有信息。第二个表(表B)将使用user_name作为HASH,并包含一个附加属性email_address

创建新用户时,您可以对表A进行条件放置,条件为user_name如果失败,则attribute_not_exists(user_name)已存在,因此不会创建新记录。如果成功,则user_name是唯一的。然后,您可以使用条件user_name对表B执行条件放置。如果失败,则attribute_not_exists(email_address)已在使用中,您必须从表A中删除该记录,否则将解决与该用户的电子邮件地址冲突。如果条件PUT成功,那么您就知道email_address是唯一的,并且您已成功创建了一个新的唯一用户记录。

这有点复杂,但它确实允许您依靠DynamoDB来保证唯一性和一致性,而不是尝试在应用程序级别实现它。