我正准备重建一个数据库,该数据库有 3 个不同的表,所有表都包含相同的数据。不同之处在于每个用户 ID、用户名、电子邮件的 HashKey。我正在尝试将它们全部组合到一张表中,因为我认为冗余既不好又慢。我打算做的是将 UserId 作为 HashKey,并将 UserName 和 Email 作为二级索引。我还没有找到让 dynamoDb 在二级索引上强制唯一性的方法,因此计划使用条件写入来检查那些在写入数据库之前的唯一性。使用 SQL 这将非常容易,在 DynamoDb 中是否有更好的方法来做到这一点?我需要能够根据三个 UserId、UserName 和 Email 中的任何一个来查找用户。我想将此保留在一个表中,而不是使用将电子邮件引用到 UserId 或将 UserName 引用到 UserId 的另一个表。
问问题
1169 次
1 回答
4
您是正确的,DynamoDB 不会对全局二级索引强制执行唯一性。
如果您要使用单个 DynamoDB 表,则唯一强制唯一的是主键(散列 + 可选范围键)。这是因为项目由该键唯一标识。因此,将您的表组合成一个表将需要在应用程序逻辑中强制执行。
为每个项目维护唯一标识的键的全局二级索引相当于维护第二个表。全局二级索引需要与您创建第二个/第三个表相同的预置吞吐量。使用全局二级索引的好处是您不必自己维护索引。
就像一个警告:全局二级索引在 DynamoDB 中最终是一致的。这意味着即使您收到了 PutItem 的 200 响应,但如果您检查全局二级索引,它可能不会立即显示。这可能会导致您检查其中一个值并且它尚未传播到索引的竞争条件。如果您自己维护索引,您将遇到同样的问题 - 您需要锁定某些东西以确保对所有三个表的写入都是事务性的。
于 2015-02-10T23:35:54.547 回答