首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DynamoDB上更便宜的是什么(GSI和多个表)

问DynamoDB上更便宜的是什么(GSI和多个表)
EN

Stack Overflow用户
提问于 2016-03-09 00:41:18
回答 1查看 1.5K关注 0票数 0

我有一个问题,使一个用户名和电子邮件独特。使用关系数据库非常容易,只需执行2次查询并将每个查询的计数返回。

代码语言:javascript
复制
select count(email) from users;
select count(username) from users;

但在DynamoDB (NoSQL)中,有两个这样的表更好(也就是更便宜):

代码语言:javascript
复制
 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

还是我

代码语言:javascript
复制
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

哪个更好(更便宜)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-09 01:32:54

两个问题,我将分别回答它们。

哪一个更便宜?

如果愿意,可以使用一个GSI或两个表运行一个表或两个表,因为GSI的吞吐量提供方式与主表的吞吐量相同。

成本不应成为决定因素。

哪一个更好?

事实上,DynamoDB使得很难保留一个次要属性,它的唯一性是一个常见的问题。由于GSI的异步性质,GSI的散列或散列/范围组合并不是唯一的。在某些情况下可以利用这一点。

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

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

  1. 将记录写入用户名表,条件是用户名不在该表中,但包含设置为false的条件标志(如果写入失败,我们将退出)
  2. 将记录写入电子邮件表,条件是电子邮件不在该表中(如果写入失败,我们将删除先前的用户名记录)
  3. 更新用户名记录以将条件标志设置为true

您希望使用带有用户名的条件标志来从本质上表示记录不处于有效状态的原因是为了确保您实际上保持了唯一性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35880860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档