[英]DynamoDB Model Chronological Shipment Update Data
我最近刚开始学习 DynamoDB 单表设计。 现在,我正在尝试对具有以下属性的 Shipment Update 数据进行建模:
访问模式:
我在尝试解决上述两种访问模式时遇到了困难。 如果,就其本身而言,我每个货件只有 1 条记录,那么我可以将货件更新项目的排序键更新为shpm#55abc
,并且 eta 可以直接检索给定帐户的所有货件,即通过gsi accountEta
。
如何解决此问题以获得所需的访问模式? 我是否应该考虑为货件更新审核设置一个单独的表格,即仅存储货件更新? 因此,当我需要访问模式 #2 时,我会通过货件 ID 查询此审计表以获取所有按时间顺序的更新。 但是,我觉得这违背了单表设计的目的。
单表设计非常适合这些访问模式。 使用可重载的通用键名,如 PK 和 SK。 这是一种方法* :
装运有“当前”记录。 添加全局二级索引 ( GSI1
) 以创建备用主键,以便按 ETA 顺序按帐户查询(模式 #1)。 对装运的所有更改都将作为对此“当前”记录的更新执行。
# shipment "current" record
PK SK GSI1PK GSI1SK
shpmt#55abc x_current account#123 x_eta#2022-07-01
接下来,在表上启用DynamoDB Streams以捕获发货更改。 每次更新“当前”记录时,支持 Stream 的 Lambda 会将OLD_IMAGE
作为更改控制记录写入表。 这将通过发货和帐户启用模式#2。
# shipment update record
PK SK GSI1PK GSI1SK
shpmt#55abc update#2022-06-28T06:10:33.247Z account#123 update#2022-06-28T06:10:33.247Z
这种方法的一个优点是单个查询操作可以以相反的顺序检索当前装运记录及其全部/部分更改历史记录。 这就是当前记录的键上有x_
前缀的原因。 键表达式为PK = shpmt#55abc AND SK >= "update"
的查询,使用ScanIndexForward=False
和限制为 2 的 DESC 排序返回当前记录 ( x_current
) 和最新的更新记录。
* 这对您来说是否是一个好的解决方案还取决于预期的读/写量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.