我有一个问题,使一个用户名和电子邮件独特。使用关系数据库非常容易,只需执行2次查询并将每个查询的计数返回。
select count(email) from users;
select count(username) from users;但在DynamoDB (NoSQL)中,有两个这样的表更好(也就是更便宜):
username table (where username is the hash) and check that table with a PUT and attribute_does_not_exist
AND
email table (where email is the hash) and check that table after the first one with a PUT and attribute_does_not_exist还是我
email table (hash) and username (GSI in that table). Then query the GSI first and if it doesn't exist then do a PUT with email and username哪个更好(更便宜)?
发布于 2016-03-09 01:32:54
两个问题,我将分别回答它们。
哪一个更便宜?
如果愿意,可以使用一个GSI或两个表运行一个表或两个表,因为GSI的吞吐量提供方式与主表的吞吐量相同。
成本不应成为决定因素。
哪一个更好?
事实上,DynamoDB使得很难保留一个次要属性,它的唯一性是一个常见的问题。由于GSI的异步性质,GSI的散列或散列/范围组合并不是唯一的。在某些情况下可以利用这一点。
如果使用两个表,则需要负责保持两个表保持同步(在许多情况下不容易做到)。这会带来一些重要的责任(如果您的应用程序在写到第一个表之后而在它写到第二个表之前死了怎么办),但是这个额外的责任可以让您保持您想要的唯一性。
要解释如何在保持准确性的同时实际实现双重唯一性,您需要利用条件写入。下面的大纲描述了一系列确保您保持唯一性的步骤。
您希望使用带有用户名的条件标志来从本质上表示记录不处于有效状态的原因是为了确保您实际上保持了唯一性。
https://stackoverflow.com/questions/35880860
复制相似问题