每个分区的DynamoDB顶级项目

时间:2018-12-30 21:16:35

标签: amazon-dynamodb

我们是DynamoDB的新手,正在努力完成似乎很简单的任务。

它实际上与存货无关(这是随着时间记录机器的结果),但是我可以想到的最简单的存货示例说明了我们面临的目标和问题。

两个查询方案是:

  • 给定股票代码的所有历史值<=我们认为我们已经弄清楚了
  • 所有股票代码的最新值 <=我们在这里没有好的解决方案!

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

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

我们还假定可以获取https://stackoverflow.com/a/12008398

之后的单个指定符号的最新值。

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

但是...对于DynamoDB,我们无法提供任何有效的方法。

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

到目前为止,我们最好的主意是以某种方式使用更新触发器或流来跟踪每个Symbol的最新记录,并从根本上保留该记录。可以在单独的表中,也可以在具有额外信息的同一表中,例如IsLatestForMachineKey列(实际上是布尔值)。对于每个插入,您都将抓住IsLatestForMachineKey = 1的那个,比较一下矩,如果插入是新的,则将新的设置为1,将旧的设置为0。

这已经开始变得非常复杂,以至于我怀疑我们是否采取了正确的方法,或者DynamoDB本身不适合这样做,即使用例看起来如此简单和普遍。

1 个答案:

答案 0 :(得分:0)

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

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

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

如果数据可能不按顺序到达,则可以添加ConditionExpression以防止stocks-current中的较新数据被不按顺序的数据覆盖。

读取操作非常简单,但无论如何我都会说明。要获取所有内容的最新值,请扫描stocks-current表。要获取股票的历史数据,请查询stocks-historical表,且不带范围键条件。