我需要创建一种方法,让电子邮件和用户名成为表格的所有部分(如果需要,可以是表格)。我似乎无法找到其他方式,只有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。
而且我也需要独立知道哪一个也不独特。
答案 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来保证唯一性和一致性,而不是尝试在应用程序级别实现它。