DynamoDB 单一 table 设计用于 "amount" 项和单独的 "amount update entry" 项

DynamoDB single table design for both an "amount" item and separate "amount update entry" items

我是 DynamoDB 的新手,正在尝试 model/index 单个 table 设计来跟踪单个数字值,但每次更改数字时都有单独的更新条目。每次更新数字值时,都应将更新条目保存到 table(作为它自己的项目,而不是作为单个“跟踪数字”项目上的 属性),当然还有被跟踪的数字值也应该更新。我希望能够按日期和数字更改值查询和排序更新条目。当然,我希望能够查找当前数值。

这种数据和访问模式的良好单一 table 设计是什么?我尝试了几种不同的方法,但发现自己被阻止了,因为要么无法 get/write 到全局二级索引,要么在尝试仅查询更新条目本身时总是返回具有当前数值的项目。我可以很容易地为跟踪号码和号码更新创建一个单独的 tables,但这似乎违反了 DynamoDB 原则。

您可以创建一个包含两种条目的 table:

  1. 当前金额,值的 ID 作为分区键,文字字符串 CURRENT_AMOUNT 作为排序键,属性 current_amount 包含实际值。
  2. update条目以值的ID(与1中相同)作为分区键,时间戳作为排序键,两个属性new_amountold_amount 表示更改后的值。

这样,您可以检索:

  • 当前物品数量: pk={{ID}} AND sk="CURRENT_AMOUNT"
  • 一个项目的历史: pk={{ID}} AND sk <> "CURRENT_AMOUNT"
  • 同时显示项目的当前数量和历史记录:pk={{ID}}

使用二级索引可能会满足其他访问模式。

下面是 table 与某些条目的外观示例:

 -----------------------------------------------------------------------
| pk  | sk                   | current_amount | new_amount | old_amount |
 -----------------------------------------------------------------------
| ID1 | "CURRENT_AMOUNT"     | 7              |-------------------------|
|     | 2020-12-19T14:01:42Z |----------------| 7          | 5          |
|     | 2020-12-17T19:07:32Z |----------------| 5          | 9          |
 -----------------------------------------------------------------------|
| ID2 | "CURRENT_AMOUNT"     | 3              |-------------------------|
|     | 2020-12-19T08:01:12Z |----------------| 3          | 7          |
 -----------------------------------------------------------------------