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

Creating and verifying that 2 attirbutes are unique in DynamoDB

我需要创建一种方法,使电子邮件和用户名在 table(或 table 的所有部分都是唯一的,如果需要的话)。除了使 1 个唯一(主键)然后另一个在分区中唯一之外,我似乎找不到其他方法。

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

所以数据库不能有:

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

或:

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

我需要两者在整个 system/database 中都是独立唯一的。

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

而且我还需要独立地知道哪一个也不是唯一的。

dynamodb 唯一性仅在 hash_key(或复合键:hash+range)上。

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

我的理解是,您想确保 user_names 是唯一的并且 email_addresses 是唯一的并且 user_name 映射到 1 且仅映射到 1 email_addressemail_address 映射到 1,并且仅映射到 user_name

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

创建新用户时,您可以在 table A 上执行条件 attribute_not_exists(user_name) 如果失败,则 user_name 已经存在,因此新记录不会被创建。如果成功,则 user_name 是唯一的。然后,您可以对 table B 进行条件放置,条件为 attribute_not_exists(email_address)。如果失败,则 email_address 已在使用中,您必须从 table A 中删除记录或以其他方式解决与用户的电子邮件地址冲突。如果条件 PUT 成功,则您知道 email_address 是唯一的,并且您已成功创建新的唯一用户记录。

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