0

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

我试图非规范化的关系数据库如下:

双因素细节

  • 标识 (pk)
  • 地位
  • 电话号码 ID (fk)

电话号码

  • 标识 (pk)
  • 电话号码
  • 类型
  • 授权尝试

日志

  • 标识 (pk)
  • TwoFactorDetailId (fk)
  • 事件类型
  • 创建时间

我的单表架构如下:

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

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

考虑这两种读/写模式:

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

正如您在模型中看到的那样,我使用一种已知方法来满足读取模式,其中链接到TwoFactorDetail的PhoneNumber实体成为该分区中的一个项目。这意味着我可以使用以下条件读取特定TwoFactorDetail.Id的所有详细信息,只需往返一次到数据库: PK = "DET#12345" AND (SK = "DET" OR SK Begins with "PHO")

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

IE。因为电话号码可以在许多两个因素详细信息实体之间共享,并且我想在每个分区中复制这些数据以方便阅读,所以我不确定如何以智能方式更新与电话号码匹配的所有项目,以便我使用 less请求的数量。

4

1 回答 1

0

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

  • PhoneNumber元数据项作为附加属性移动到TwoFactorDetail元数据项,而不是单独的项。
  • 在PhoneNumber属性上创建一个 GSI,使PhneNumber成为分区键,以便我可以跨分区使用它来获取所有TwoFactorDetail实体。

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

我对这一更改感到满意,因为我只需一次往返数据库即可获得所有TwoFactorDetail元数据。

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

  1. 根据PhoneNumber GSI查询主表
  2. 根据需要修改TwoFactorDetail检索项目的属性
  3. 向 DynamoDb 发送批量写入请求
于 2019-09-04T14:15:17.217 回答