我正在创建一个加密货币机器人,需要在某个地方存储其交易历史。由于AWS DynamoDB可以在一定程度上免费使用,我认为它可以满足我的需求但我在表结构方面存在一些问题。
每笔交易都具有以下属性:
A
可以具有交易ID 1000
和符号B
也可以具有交易ID 1000
)每天我计划对由time
排序的最后200个项目进行1次选择查询,并且还有大约50个新项目插入。
从我读到的表中需要一个唯一的主键,所以我使用cryptocurrency symbol
作为分区键,trade id
作为排序键,因为它们两者结合提供了唯一性但是如果我没有弄错,这个设置不允许我对数据进行排序通过time
。
我能想到的一个解决方案是自己生成新的和完全独特的trade ids
并且不依赖于交换提供的trade ids
然后使用time
作为排序键,但我想避免它。
有没有更好的方法来做到这一点?
您应该使用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
作为排序键。您将能够按日期查询主表(但不能查询其他任何内容)。