AWS DynamoDB表结构

时间:2019-04-13 17:11:54

标签: amazon-web-services amazon-dynamodb

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

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

  • 加密货币符号
  • 加密货币交易所提供的
  • 交易ID(仅与加密货币符号结合使用,即唯一,即符号-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem 可以具有交易ID A,符号1000也可以具有交易ID {{ 1}})
  • 执行交易的时间(可以同时进行多笔交易)
  • 价格
  • 数量

而且我每天计划对1个最近的200个商品(按B排序以及大约50个新商品插入)进行一次选择查询。

据我所知,一个表需要有一个唯一的主键,所以我用1000作为分区键,而用time作为排序键,因为它们两者结合在一起就提供了唯一性,但是如果没错,此设置不允许我按cryptocurrency symbol对数据进行排序。

我能想到的一种解决方案是自己生成新的且完全唯一的trade id,而不依赖于交易所提供的time,然后使用trade ids作为排序键,但是我想避免这种情况。

也许有更好的方法吗?

1 个答案:

答案 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作为排序键。您将能够按日期查询主表(但不能查询其他任何内容)。