【问题标题】:Dynamodb with unique secondary/third index具有唯一二级/第三索引的 Dynamodb
【发布时间】:2015-04-11 02:45:01
【问题描述】:

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

【问题讨论】:

  • 我的另一个问题是您可以使用高级 api 来执行此操作,还是需要使用低级 api?我在高级 api 文档中没有找到关于条件写入或二级索引的太多信息。
  • 做更多研究,看起来条件写入可能不起作用,因为它们似乎只检查“行”并且不会检查整个表以查看是否使用了二级索引值 IE。电子邮件。

标签: unique amazon-dynamodb secondary-indexes


【解决方案1】:

您说得对,DynamoDB 不对全局二级索引强制执行唯一性。

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

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

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

【讨论】:

  • 是的,我将我们所有的数据库调用都包装为跨国的。我想检查二级索引以仅通过该索引进行获取,如果它返回某些内容,那么我知道它不是唯一的。我认为这会让我有 2 次读取(检查两个二级索引)和 1 次写入。我认为这比 3 次写入要好,然后担心回滚以及拥有 3 个完全相同值的表所带来的一切。
  • 据我所知更正,不应该只有 2 次读取,只有一次写入,有条件的写入将检查电子邮件和用户名是否唯一。如果是,则写入,否则失败并返回到应用程序。
  • 还有另一个问题如果我只有一张桌子,最终的一致性是否重要?如果有多个表是有道理的,但只有一个表真的最终一致吗?
猜你喜欢
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
相关资源
最近更新 更多