AWS DynamoDB表结构

问题描述 投票:0回答:1

我正在创建一个加密货币机器人,需要在某个地方存储其交易历史。由于AWS DynamoDB可以在一定程度上免费使用,我认为它可以满足我的需求但我在表结构方面存在一些问题。

每笔交易都具有以下属性:

  • 加密货币符号
  • 由加密货币交换提供的交易ID(它仅与加密货币符号组合是唯一的,即符号A可以具有交易ID 1000和符号B也可以具有交易ID 1000
  • 交易执行的时间(多笔交易可以同时发生)
  • 价钱
  • 数量

每天我计划对由time排序的最后200个项目进行1次选择查询,并且还有大约50个新项目插入。

从我读到的表中需要一个唯一的主键,所以我使用cryptocurrency symbol作为分区键,trade id作为排序键,因为它们两者结合提供了唯一性但是如果我没有弄错,这个设置不允许我对数据进行排序通过time

我能想到的一个解决方案是自己生成新的和完全独特的trade ids并且不依赖于交换提供的trade ids然后使用time作为排序键,但我想避免它。

有没有更好的方法来做到这一点?

amazon-web-services amazon-dynamodb
1个回答
0
投票

您应该使用symbol和tradeId作为主键,并且为了按日期查询,您可以使用yyyy-mm-dd作为分区键创建GSI,并使用hh:mm:ss(或者您喜欢的完整时间戳)作为排序键。由于您每天要进行50次插入,因此您甚至可以使用yyyy-mm作为GSI分区键。

要选择最新的200,请使用yyyymmdd = :today的键条件表达式查询GSI,sort = descending,limit 200.如果得到的结果少于200,请重复上一天的查询。如果结果仍然少于200,请继续一次查询,直到找到所需的数字。 (如果您选择使用yyyy-mm作为GSI分区键,请将此策略调整为使用几个月而不是几天。)

查看this answer相关问题,其中包含有关此方法的更多详细信息。

这种方法可能无法很好地扩展,但由于您试图保持在DynamoDB的免费层中,因此您可能不需要担心可伸缩性。

现在,如果您根本不关心最佳实践,只需使用yyyy-mm-dd作为主表的分区键,然后使用hh:mm:ss:symbol:tradeId作为排序键。您将能够按日期查询主表(但不能查询其他任何内容)。

© www.soinside.com 2019 - 2024. All rights reserved.