我正在创建一个加密货币机器人,需要在某个地方存储其交易历史。由于AWS DynamoDB在一定程度上可以免费使用,因此我认为它可以满足我的需求,但是在表结构方面存在一些问题。
每笔交易都具有以下属性:
-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
可以具有交易ID A
,符号1000
也可以具有交易ID {{ 1}})而且我每天计划对1个最近的200个商品(按B
排序以及大约50个新商品插入)进行一次选择查询。
据我所知,一个表需要有一个唯一的主键,所以我用1000
作为分区键,而用time
作为排序键,因为它们两者结合在一起就提供了唯一性,但是如果没错,此设置不允许我按cryptocurrency symbol
对数据进行排序。
我能想到的一种解决方案是自己生成新的且完全唯一的trade id
,而不依赖于交易所提供的time
,然后使用trade ids
作为排序键,但是我想避免这种情况。
也许有更好的方法吗?
答案 0 :(得分:0)
您应该使用symbol和tradeId作为主键,并且为了按日期查询,您可以使用yyyy-mm-dd
作为分区键和hh:mm:ss
(或完整的时间戳,如果要创建一个GSI您更喜欢)作为排序键。由于您每天要进行50次插入,因此甚至可以使用yyyy-mm
作为GSI分区键。
为了选择最新的200,请使用关键条件表达式yyyymmdd = :today
查询GSI,sort =下降,限制为200。如果得到的结果少于200,请对前一天重复查询。如果结果仍然少于200,请一次只继续查询一天,直到找到所需的数字为止。 (如果您选择使用yyyy-mm
作为GSI分区键,请将该策略调整为使用几个月而不是几天。)
查看this answer的相关问题,其中提供了有关此方法的更多详细信息。
这种方法可能不能很好地扩展,但是由于您试图停留在DynamoDB的免费层中,因此您可能不必担心可伸缩性。
现在,如果您根本不关心最佳实践,只需使用yyyy-mm-dd
作为主表的分区键,然后使用hh:mm:ss:symbol:tradeId
作为排序键。您将能够按日期查询主表(但不能查询其他任何内容)。