【问题标题】:DynamoDB single table design for both an "amount" item and separate "amount update entry" items“金额”项目和单独的“金额更新条目”项目的 DynamoDB 单表设计
【发布时间】:2021-03-29 20:33:56
【问题描述】:
我是 DynamoDB 的新手,并尝试对单个表设计进行建模/索引以跟踪单个数字值,但每次更改数字时都有单独的更新条目。每次更新数字值时,都应该将更新条目保存到表中(作为它自己的项目,而不是作为单个“跟踪数字”项目的属性),当然跟踪数字值也应该更新。我希望能够按日期和数字更改值查询和排序更新条目。当然,我希望能够查看当前的数值。
对于这种数据和访问模式,什么是好的单表设计?我尝试了几种不同的方法,但发现自己被阻止了,因为要么无法获取/写入全局二级索引,要么在尝试仅查询更新条目本身时总是返回具有当前数值的项目。我可以很容易地为跟踪号码和号码更新创建一个单独的表,但这似乎违反了 DynamoDB 原则。
【问题讨论】:
标签:
amazon-web-services
database-design
nosql
amazon-dynamodb
dynamodb-queries
【解决方案1】:
您可以创建一个包含两种类型条目的表:
-
当前金额,其中值的 ID 作为分区键,文字字符串
CURRENT_AMOUNT 作为排序键,以及包含实际值的属性 current_amount。
-
更新条目,其值的 ID(与 1. 中相同)作为分区键,时间戳作为排序键,两个属性
new_amount 和 old_amount 表示更改的值。
这样,你可以检索:
-
当前物品数量:
pk={{ID}} AND sk="CURRENT_AMOUNT"
-
一个项目的历史:
pk={{ID}} AND sk <> "CURRENT_AMOUNT"
- 同时显示项目的当前金额和历史记录:
pk={{ID}}
使用二级索引可能会满足其他访问模式。
下面是一个包含一些条目的表格的示例:
-----------------------------------------------------------------------
| 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 |
-----------------------------------------------------------------------