gpt4 book ai didi

amazon-dynamodb - 每个分区的 DynamoDB 顶级项目

转载 作者:行者123 更新时间:2023-12-05 07:27:23 25 4
gpt4 key购买 nike

我们是 DynamoDB 的新手,正在为看似简单的任务而苦苦挣扎。

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

两种查询场景是:

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

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

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

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

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

但是……我们想不出任何对 DynamoDB 有效的方法。

是否可以在不检索所有内容或进行多次往返的情况下执行此操作?

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

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

最佳答案

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

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

每当你写一个项目时,把它写到两个表中。如果您需要两个表之间的强一致性,请使用 TransactWriteItems api。

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

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

关于amazon-dynamodb - 每个分区的 DynamoDB 顶级项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53981499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com