如何使用Amazon DynamoDB对1到N的关系进行建模以满足单次读写?

时间:2019-09-03 10:11:56

标签: amazon-dynamodb dynamodb-queries amazon-dynamodb-index

我正在尝试从标准RDBMS背景中学习正确的DynamoDB建模。

我要反规范化的关系数据库如下:

TwoFactorDetail

  • 编号(pk)
  • 状态
  • PhoneNumberId(fk)

电话号码

  • 编号(pk)
  • 电话号码
  • 类型
  • AuthAttempts

登录

  • 编号(pk)
  • TwoFactorDetailId(fk)
  • EventType
  • CreatedAt

我的单表模式如下:

https://i.stack.imgur.com/8p3WY.png

如您所见,许多 TwoFactorDetail 实体可以使用相同的 PhoneNumber

考虑以下两种读/写模式:

  • 读取 TwoFactorDetail 元数据,包括电话号码,电话号码类型和TwoFactorDetail.Id的尝试次数。
  • 通过电话号码更新 PhoneNumber 次尝试

您可以在模型中看到,我用一种已知的方法满足了读取模式,其中链接到 TwoFactorDetail PhoneNumber 实体成为该分区中的一项。这意味着我可以使用以下条件通过一次往返数据库的操作来读取特定 TwoFactorDetail.Id 的所有详细信息: PK =“ DET#12345” AND(SK =“ DET”或SK以“ PHO”开头)

现在我的问题是如何使 PhoneNumber 元数据在各个分区之间保持一致。

即。因为电话号码可以在许多两个要素详细信息实体之间共享,并且我想在每个分区中复制此数据以简化读取,所以我不确定如何以一种聪明的方式更新与电话号码匹配的所有项目,以便我使用较少的请求数量。

1 个答案:

答案 0 :(得分:0)

我的解决方案是按如下方式更改我的表模型:

  • PhoneNumber 元数据项移至 TwoFactorDetail 元数据项作为附加属性,而不是单独的项。
  • PhoneNumber 属性上创建GSI,将 PhneNumber 用作分区键,这样我就可以跨分区使用所有 TwoFactorDetail 实体。

此图片不言自明:https://i.stack.imgur.com/nAGc6.png

我对此更改感到满意,因为我只需一次往返数据库就可以获取所有 TwoFactorDetail 元数据。

另一方面,这是我决定要在 TwoFactorDetail 实体之间保持相同的 PhoneNumber 元数据一致的方法:

  1. 根据电话号码 GSI
  2. 查询主表
  3. 根据需要修改 TwoFactorDetail 检索到的项目的属性
  4. 发送批量写入请求到DynamoDb