我们是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本身不适合这样做,即使用例看起来如此简单和普遍。
答案 0 :(得分:0)
在我看来,有一种方法相当简单。
不是使用GSI,而是使用两个表(几乎)具有完全相同的架构。两者的哈希键都应为symbol
。它们都应具有moment
和value
。选择其中一个表为stocks-current
,选择另一个表为stocks-historical
。 stocks-current
没有范围键。 stocks-historical
使用moment
作为范围键。
每当写入一个项目时,都将其写入两个表中。如果您需要两个表之间的强一致性,请使用TransactWriteItems api。
如果数据可能不按顺序到达,则可以添加ConditionExpression以防止stocks-current
中的较新数据被不按顺序的数据覆盖。
读取操作非常简单,但无论如何我都会说明。要获取所有内容的最新值,请扫描stocks-current
表。要获取股票的历史数据,请查询stocks-historical
表,且不带范围键条件。