DynamoDB模式设计是否支持按ID和项目时间戳查找?

时间:2019-04-11 20:22:29

标签: amazon-web-services database-design amazon-dynamodb

我需要设计一个DynamoDB模式来存储其属性为:

  • tid:一个UUID字符串,它是商品的唯一标识符
  • timestamp:一个ISO-8601格式的字符串,表示与该项目相关的日期和时间
  • 其他东西...

以及以下query(确实希望避免执行任何scans)模式:

  • 通过tid
  • 查询
  • 通过精确的timestamp以及<=上的关系排序表达式(例如BETWEENtimestamp等)进行查询。也就是说,查询特定日期时间范围内的所有项目 ,而无需事先知道它们的tid

这是否有可能在DynamoDB中高效地完成,还是有另一个AWS解决方案可以更好地为我服务?

1 个答案:

答案 0 :(得分:0)

给出DynamoDB表,如下所示:

  • 分区键:{},键入字符串
  • 排序键:tid,键入字符串

您可以查询:

  • tid = 5
  • tid = 5,介于2018-12-21T09:00:00Z和2018-12-21T15:00:00Z之间的时间戳

使用awscli进行尝试,例如使用timestamp查询所有项目:

tid=5

要查询aws dynamodb query \ --table-name mytable \ --key-condition-expression "tid = :tid" \ --expression-attribute-values '{":tid":{"S":"5"}}' tid=5的所有项目:

timestamp between 09:00 and 15:00 on 2015-12-21

注意:由于aws dynamodb query \ --table-name mytable \ --key-condition-expression "tid = :tid AND #ts BETWEEN :ts1 AND :ts2" \ --expression-attribute-values '{":tid":{"S":"5"}, ":ts1":{"S":"2015-12-21T09:00:00Z"}, ":ts2":{"S":"2015-12-21T15:00:00Z"}}' \ --expression-attribute-names '{"#ts":"timestamp"}' 在DynamoDB中是reserved keyword,因此必须使用表达式属性名称对其进行转义。

如果愿意,还可以将timestamp属性创建为数字,然后存储纪元时间。

要使用timestamp查询所有项目,而无论timestamp between 09:00 and 15:00 on 2015-12-21是什么,都无法使用相同的分区/排序键架构来完成。您将需要添加Global Secondary Index这样的内容:

  • GSI分区键:tid,键入字符串
  • GSI排序键:yyyymmdd,键入字符串

现在,您可以查询具有给定时间戳范围的项目,只要它们在同一天(它们具有相同的YYYYMMDD,这可能是一个合理的限制)。或者,您可以将YYYYMM作为分区键,以允许更大的时间戳范围。此时,您确实需要了解查询的用例,以确定YYYYMMDD(将查询限制在一天之内)是否正确。有关此想法的更多信息,请参见How to query DynamoDB by date with no obvious hash key