是否可以通过单个查询跟踪 DynamoDB 表中的最小值/最大值?

Posted

技术标签:

【中文标题】是否可以通过单个查询跟踪 DynamoDB 表中的最小值/最大值?【英文标题】:Is it possible to track Min/Max In a DynamoDB table with a single query? 【发布时间】:2022-01-20 20:47:50 【问题描述】:

我正在制作一个表格来跟踪 DyanomDB 表格中一天内售出的最低和最高价格。我将有一个数字最小值列和一个数字最大值列

我的目标是

    如果我传入的值在这些数字之间,忽略不写表 如果高于最大值,则分配给最大值 如果低于最小值,则为其分配最小值 如果该行不存在,则创建该行并将编号分配给最小值和最大值。

这可以在一个更新命令中完成吗?

【问题讨论】:

【参考方案1】:

无法实现像您描述的一次性更新。您可能会考虑使用conditional updates,但他们 无法管理您需要的 if-this-then-write-here-else-write-there 柔术。以下是您可以使用的一些 DynamoDB 模式*

(A) 1 次更新,2 次单独的最小/最大查询

单个更新将单个分数写入表中,该表具有compound sort key。最小值/最大值不会持久化,而是在查询时返回。查询PK = Product1ID and begins_with(SK, "20211218")Limit=1ScanIndexForward=False 返回每​​日最大值 产品价格(DESC 订单)。 True 返回每​​日最小值(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 次查询

该表每天每个项目都有一条记录,其中包含最小值/最大值。使用两个条件更新,一个写每日最大值,一个写每日最小值。查询很简单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 解决方案的变体。相同的表设计和查询,但不同的更新逻辑。在更新时,首先查询当前的产品日记录。如果需要写入任何新的最小值/最大值,更新函数会决定一次性更新中的内容。

(D) 厨房水槽

表同时包含 A 的个人和 B 的最小/最大记录。更新如 A. 使用 DynamoDB streams 启动 lambda a 每个新的更新。 lambda 计算最大值/最小值并将记录写回到表中。查询很简单。

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

* 适用通常的健康警告:哪些模式更好/更差取决于用例的query patterns and data volumes。查询/更新操作的数量可能会也可能不会 是有效设计的一个很好的衡量标准。请咨询您的医生或药剂师。

【讨论】:

以上是关于是否可以通过单个查询跟踪 DynamoDB 表中的最小值/最大值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DynamoDB 中的单个属性上查询(getItems)两个条件(不存在 + 某个值)?

使用 lambda 扫描/查询 dynamodb 表中的特定条目

是否可以在亚马逊 dynamodb 中更新哈希键

将 spark 数据帧行写入 dynamoDB 表中的项目

SQL 将许多 tsv 文件连接到数据库中的单个表中,同时跟踪文件源 (MonetDBLite)

在单个查询中查找各种表中的总记录