Unique 具有唯一二级/三级索引的Dynamodb

Unique 具有唯一二级/三级索引的Dynamodb,unique,amazon-dynamodb,secondary-indexes,Unique,Amazon Dynamodb,Secondary Indexes,我准备重建一个数据库,它有3个不同的表,所有表都包含相同的数据。不同之处在于每个用户的HashKey、UserId、UserName和Email。我正试图将它们合并到一个表中,因为我认为冗余既糟糕又缓慢。我计划做的是将UserId作为HashKey,并将UserName和Email作为二级索引。我还没有找到一种让dynamoDb强制二级索引唯一性的方法,所以计划使用条件写入,在写入数据库之前检查这些索引的唯一性。使用SQL这将非常简单,在DynamoDb中有更好的方法吗?我需要能够根据三个用户名

我准备重建一个数据库,它有3个不同的表,所有表都包含相同的数据。不同之处在于每个用户的HashKey、UserId、UserName和Email。我正试图将它们合并到一个表中,因为我认为冗余既糟糕又缓慢。我计划做的是将UserId作为HashKey,并将UserName和Email作为二级索引。我还没有找到一种让dynamoDb强制二级索引唯一性的方法,所以计划使用条件写入,在写入数据库之前检查这些索引的唯一性。使用SQL这将非常简单,在DynamoDb中有更好的方法吗?我需要能够根据三个用户名、用户名和电子邮件中的任何一个查找用户。我希望将此保留在一个表中,而不要使用另一个将电子邮件引用到UserId或将UserName引用到UserId的表。

您是正确的,DynamoDB没有在全局二级索引上强制唯一性

如果要使用单个DynamoDB表,唯一被强制为唯一的就是主键(散列+可选范围键)。这是因为项目由该键唯一标识。因此,要将您的表合并到一个表中,需要在应用程序逻辑中强制执行

基于每个项维护唯一标识的键的全局二级索引相当于维护第二个表。全局二级索引将需要与创建第二个/第三个表相同的配置吞吐量。使用全局二级索引的好处是您不必自己维护索引


正如一个警告:DynamoDB中的全局二级索引最终是一致的。这意味着,即使您已收到PutItem的200响应,但如果您检查全局二级索引,它可能不会立即显示。这可能导致一种竞争条件,即您检查其中一个值,但它尚未传播到索引。如果您自己维护索引,您也会遇到同样的问题-您需要锁定一些东西,以确保对所有三个表的写入都是事务性的。

Ya我将所有数据库调用包装为跨国的。我想检查二级索引,如果它返回了一些东西,那么我知道它不是唯一的。我想这会让我有两次读取(检查两个二级索引)和一次写入。我认为这比3次写入更好,然后担心做回滚,以及拥有3个值完全相同的表所带来的一切。根据我所知的更正,不应该只有一次写入就有2次读取,条件写入将检查电子邮件和用户名是否唯一。如果是,则写入,如果不是,则写入失败并返回到应用程序。另外一个问题是,如果我只有一个表,最终的一致性是否重要?如果有多个表,这是有意义的,但是对于一个表,它最终是否真的是一致的?我的另一个问题是,您可以使用高级api来实现这一点,还是需要使用低级api?我在高级api文档中找不到太多关于条件写入或二级索引的信息。做更多的研究,条件写入可能不起作用,因为它们似乎只检查“行”,而不会检查整个表以查看是否使用了二级索引值,例如电子邮件。