是否可以通过单个查询在 DynamoDB table 中跟踪 Min/Max?
Is it possible to track Min/Max In a DynamoDB table with a single query?
我正在制作一个 table 来跟踪 DyanomDB table 中一天内售出的最低价和最高价。我将有一个数字最小列和一个数字最大列
我的目标是
- 如果我传入的值介于这些数字之间,请忽略并且不要写 table
- 如果高于最大值,则分配给最大值
- 如果低于最小值,则分配给最小值
- 如果该行不存在,则创建它并将数字分配给最小值和最大值。
这可以在一个更新命令中完成吗?
您描述的一次性更新是无法实现的。您可能会考虑使用 conditional updates,但它们
无法管理您需要的 if-this-then-write-here-else-write-there 柔术。以下是您可以使用的一些 DynamoDB 模式*:
(A) 1 个更新,2 个单独的 Min/Max 查询
单个更新将个人分数写入 table,其中 compound sort key。 Min/max 不会持久化,而是在查询时 returned。查询 PK = Product1ID and begins_with(SK, "20211218")
。 Limit=1
。 ScanIndexForward=False
到 return 每日最大值
产品价格(DESC 顺序)。 True
returns 每日最小值(ASC顺序,默认)。
PK SK SalePrice Date
Product1ID 20211217#0400 4.00
Product1ID 20211218#0500 5.00
Product1ID 20211218#0600 6.00
Product2ID 20211218#2500 25.00
Product2ID 20211218#2600 26.00
(B) 2 次更新,1 次查询
table 与 min/max 每天每项有一条记录。使用两个条件更新,一个写每日最大值,一个写每日最小值。查询很简单 PK = Product1ID and SK = "20211218"
.
PK SK Min Max Date
Product1ID 20211217 4.00 5.50
Product1ID 20211218 5.00 6.00
Product2ID 20211218 25.00 26.00
(C) 1 个查询 + 1 个写入更新,1 个读取查询
B 的 2+1 解决方案的变体。 table 设计和查询相同,但更新逻辑不同。更新时,首先查询当前的产品日记录。如果有任何新的 min/max 需要在一次更新中写入,更新函数决定什么。
(D) 厨房水槽
Table既有A的个人记录,也有B的min/max记录。像 A 一样更新。使用 DynamoDB streams 启动 lambda
每个新的更新。 lambda 计算 max/min 并将记录写回 table。查询简单
PK SK SalePrice Min Max Date
Product1ID 20211217 4.00 5.50
Product1ID 20211217#0400 4.00
Product1ID 20211218 5.00 6.00
Product1ID 20211218#0500 5.00
Product1ID 20211218#0600 6.00
Product2ID 20211218 25.00 26.00
Product2ID 20211218#2500 25.00
Product2ID 20211218#2600 26.00
* 通常的健康警告适用:better/worse 的模式取决于用例的 query patterns and data volumes。 queries/update 操作的数量可能会也可能不会
是有效设计的一个很好的衡量标准。请咨询您的医生或药剂师。
我正在制作一个 table 来跟踪 DyanomDB table 中一天内售出的最低价和最高价。我将有一个数字最小列和一个数字最大列
我的目标是
- 如果我传入的值介于这些数字之间,请忽略并且不要写 table
- 如果高于最大值,则分配给最大值
- 如果低于最小值,则分配给最小值
- 如果该行不存在,则创建它并将数字分配给最小值和最大值。
这可以在一个更新命令中完成吗?
您描述的一次性更新是无法实现的。您可能会考虑使用 conditional updates,但它们 无法管理您需要的 if-this-then-write-here-else-write-there 柔术。以下是您可以使用的一些 DynamoDB 模式*:
(A) 1 个更新,2 个单独的 Min/Max 查询
单个更新将个人分数写入 table,其中 compound sort key。 Min/max 不会持久化,而是在查询时 returned。查询 PK = Product1ID and begins_with(SK, "20211218")
。 Limit=1
。 ScanIndexForward=False
到 return 每日最大值
产品价格(DESC 顺序)。 True
returns 每日最小值(ASC顺序,默认)。
PK SK SalePrice Date
Product1ID 20211217#0400 4.00
Product1ID 20211218#0500 5.00
Product1ID 20211218#0600 6.00
Product2ID 20211218#2500 25.00
Product2ID 20211218#2600 26.00
(B) 2 次更新,1 次查询
table 与 min/max 每天每项有一条记录。使用两个条件更新,一个写每日最大值,一个写每日最小值。查询很简单 PK = Product1ID and SK = "20211218"
.
PK SK Min Max Date
Product1ID 20211217 4.00 5.50
Product1ID 20211218 5.00 6.00
Product2ID 20211218 25.00 26.00
(C) 1 个查询 + 1 个写入更新,1 个读取查询
B 的 2+1 解决方案的变体。 table 设计和查询相同,但更新逻辑不同。更新时,首先查询当前的产品日记录。如果有任何新的 min/max 需要在一次更新中写入,更新函数决定什么。
(D) 厨房水槽
Table既有A的个人记录,也有B的min/max记录。像 A 一样更新。使用 DynamoDB streams 启动 lambda 每个新的更新。 lambda 计算 max/min 并将记录写回 table。查询简单
PK SK SalePrice Min Max Date
Product1ID 20211217 4.00 5.50
Product1ID 20211217#0400 4.00
Product1ID 20211218 5.00 6.00
Product1ID 20211218#0500 5.00
Product1ID 20211218#0600 6.00
Product2ID 20211218 25.00 26.00
Product2ID 20211218#2500 25.00
Product2ID 20211218#2600 26.00
* 通常的健康警告适用:better/worse 的模式取决于用例的 query patterns and data volumes。 queries/update 操作的数量可能会也可能不会 是有效设计的一个很好的衡量标准。请咨询您的医生或药剂师。