2016-03-06 40 views
0

唯一我需要创建一个方法有(如果需要或台)的电子邮件和用户名是acreoss表的所有partions独特。我似乎无法找到其他方式,然后只制作一个唯一的(主键),然后另一个在分区中唯一。创建和验证2个attirbutes在DynamoDB

我想有一个电子邮件地址检查,使每个用户都拥有唯一的电子邮件和独特的用户名。

因此数据库不能有:

email username 
[email protected] aa 
[email protected] aa 

OR:

email username 
[email protected] a 
[email protected] b 

我需要既要在整个系统/数据库独立唯一的。

这是如何完成的?我正在使用Lambda和DynamoDB。

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

回答

1

我的理解是,你要确保user_names是独一无二的,email_addresses是独一无二的,是一个user_name映射到1,只有1 email_addressemail_address映射到1并且只有user_name

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

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

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

+0

是的,这是我在做什么。我有2桌子的一部分,但我正在计算今天第3段的一致性问题。另外使用GSI扫描/查询又如何?它是否适用于所有的分区,就像电子邮件是散列并且用户名在Email表中是GSI一样。 – cdub

1

dynamodb独特性是在HASH_KEY(或复合键:散列+范围)只。

我认为,在这种情况下,最好的选择是保证应用层上的独特性(对用户名添加GSI并尝试查询新的用户名)。在电子邮件它会很容易检查的独特性,因为它表散列键..

+0

是啊,我新,所以我必须弄清楚如何GSI和哈希键和范围内的工作,并 – cdub