DynamoDB上的便宜什么(GSI与多个表格相比)

时间:2016-03-09 00:41:18

标签: amazon-web-services amazon-dynamodb nosql

我遇到了使用户名和电子邮件唯一的问题。关系数据库非常简单,只需要进行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

哪个更好(更便宜)?

1 个答案:

答案 0 :(得分:0)

两个问题,所以我将分别解决这些问题。

哪个更便宜?

如果您愿意,可以使用一个GSI或两个表运行单个表,但完全相同的成本,因为GSI的吞吐量的配置方式与主表的吞吐量相同。

成本不应成为决定因素。

哪个更好?

DynamoDB难以让二级属性保持其唯一性是困难的常见问题。由于GSI的异步特性,GSI的HASH或HASH / RANGE组合不是唯一的。在某些情况下可以利用这一点。

如果您使用两个表,则您负责保持两个表同步(在许多情况下这是不容易的)。这带来了一些重要的责任(如果您的应用程序在写入第一个表之后但在写入第二个表之前死亡,会发生什么情况),但这个额外的责任可以让您保持所需的唯一性。

要解释如何在保持准确性的同时实际实现双重唯一性,您可能希望利用条件写入。以下大纲描述了一系列确保您保持唯一性的步骤。

  1. 将记录写入用户名表,条件是用户名不在表中,但包含条件标志设置为false(如果写入失败,我们保释)
  2. 将记录写入电子邮件表,条件是电子邮件不在表中(如果写入失败,我们删除以前的用户名记录)
  3. 更新用户名记录以将条件标志设置为true
  4. 您希望使用带有用户名的条件标志来表明记录未处于有效状态的原因是为了确保您实际保持唯一性。