amazon-dynamodb - 每个分区的 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 本身可能不适合这个,即使用例看起来如此简单和常见。
解决方案
在我看来,有一种方法相当简单。
与其使用 GSI,不如使用具有(几乎)完全相同架构的两个表。两者的哈希键都应该是symbol
. 他们应该都有moment
和value
。选择一张表是stocks-current
,另一张是stocks-historical
。stocks-current
没有范围键。stocks-historical
用作moment
范围键。
每当您编写一个项目时,将其写入两个表。如果您需要两个表之间的强一致性,请使用 TransactWriteItems api。
如果您的数据可能乱序到达,您可以添加 ConditionExpression 以防止新数据stocks-current
被乱序数据覆盖。
读取操作非常简单,但我还是会说明它们。要获取所有内容的最新值,请扫描stocks-current
表格。要获取股票的历史数据,请查询stocks-historical
没有范围键条件的表。
推荐阅读
- microsoft-graph-api - 如何在 Microsoft Teams 中将 PDF-Viewer 选项卡添加到频道?
- python - 在命名中读取具有特定字符的多个 csv 文件
- php - 引用资源中的资源时 Laravel 错误
- xml - 如何在菜单中添加选项,Eclipse 插件
- git - 从回购中提取的 VSTS 步骤
- python - Python Web Scraping - 出现错误时的电子邮件通知
- wordpress - 从 Divi 主题更改标题模板
- firebase - 如何在后端使用 Firebase 云功能通过直接函数调用应用身份验证中间件
- sql - 后端 api 是否应该存储布局信息?
- vb.net - 如何计算借方和贷方列以在 ListView 的第三列中显示每一行?