首页 > 解决方案 > 每个分区的 DynamoDB 顶部项目

问题描述

我们是 DynamoDB 的新手,并且正在为这似乎是一项简单的任务而苦苦挣扎。

它实际上与股票无关(它是关于随着时间的推移记录机器结果),但股票示例是我能想到的最简单的例子,它说明了我们面临的目标和问题。

两种查询场景是:

假设更新不同步,例如,TSLA 的最后更新记录的时刻可能与 AMZN 的不同。

这 3 个属性只是 { Symbol, Moment, Value }。我们可以制作 hash_key Symbol, range_key Moment,并相信我们可以轻松/高效地实现第一个查询。

我们还假设可以在https://stackoverflow.com/a/12008398之后获得单个指定符号的最新值

获取每个符号的最新值的 SQL 解决方案看起来很像https://stackoverflow.com/a/6841644

但是......我们无法为 DynamoDB 想出任何有效的方法。

是否可以在不检索所有内容或进行多次往返的情况下做到这一点?

到目前为止,我们最好的想法是以某种方式使用更新触发器或流来跟踪每个符号的最新记录,并基本上保持缓存。这可能在单独的表中,也可能在具有额外信息的同一个表中,例如 IsLatestForMachineKey 列(实际上是一个布尔值)。每次插入时,您都会抓取 IsLatestForMachineKey=1 的那个,比较 Moment,如果插入较新,则将新的设置为 1,将旧的设置为 0。

这开始变得足够复杂,以至于我质疑我们是否采取了正确的方法,或者 DynamoDB 本身可能不适合这个,即使用例看起来如此简单和常见。

标签: amazon-dynamodb

解决方案


在我看来,有一种方法相当简单。

与其使用 GSI,不如使用具有(几乎)完全相同架构的两个表。两者的哈希键都应该是symbol. 他们应该都有momentvalue。选择一张表是stocks-current,另一张是stocks-historicalstocks-current没有范围键。stocks-historical用作moment范围键。

每当您编写一个项目时,将其写入两个表。如果您需要两个表之间的强一致性,请使用 TransactWriteItems api。

如果您的数据可能乱序到达,您可以添加 ConditionExpression 以防止新数据stocks-current被乱序数据覆盖。

读取操作非常简单,但我还是会说明它们。要获取所有内容的最新值,请扫描stocks-current表格。要获取股票的历史数据,请查询stocks-historical没有范围键条件的表。


推荐阅读