DynamoDB-UUID并避免全表扫描

时间:2020-07-28 08:59:26

标签: amazon-web-services aws-lambda amazon-dynamodb

这是我的用例:

我有一个带有200k对象的JSON Api。数据集看起来像这样:日期,自行车型号,以分钟为单位的生产时间。我使用Lambda从JSON Api读取并通过http请求写入DynamoDB。 Lambda函数每天运行,并使用最新数据更新DynamoDB。

然后我要按日期检索数据,因为我想计算每天的平均生产时间并将其放在第二张表中。 Alexa技能连接到第二张表,并读出每天的平均值。

第一个问题:由于同一辆自行车每天生产多次,因此使用带日期和自行车型号的复合主钥匙不会给我唯一的钥匙。我应该为条目创建一个UUID吗?还是有更好的解决方案?

第二个问题:为了进行计算,我每次都需要进行全表扫描,这非常昂贵,很多人建议不要这样做。不进行全表扫描怎么办?

第三个问题:对于我的用例,完全避免使用DynamoDB更好吗?那么,哪个AWS数据库更适合我的用例?

2 个答案:

答案 0 :(得分:3)

  1. 是的,可以使用uuid或其他任何唯一标识符(例如,日期+自行车模型+创建的时间)作为pk。

  2. 看来,您的日常工作就是做一些数据分析工作,而不是真正的交易工作。我建议使用服务支持数据分析,例如Amazon Redshift。您应该能够使用Dynamodb流将数据添加到此类数据库服务中。另外,您也可以将数据流式传输到s3中,并使用Athena之类的服务来获取每日平均值。

答案 1 :(得分:3)

有一个简单的数据库模型可用于此任务:

  • PartitionKey:UUID或使用提供唯一性的字段的任意组合。
  • SortKey:生产日期,以字符串形式,即2020-07-28

如果您随后创建将生产日期用作PK并包括生产时间的二级索引,则可以查询(不扫描)特定日期的二级索引并执行任何计算需要生产时间。然后,您可以在辅助索引和表上分别配置所需的读/写容量。

关于您的第三个问题,对于该任务使用DynamoDB并没有真正的好处。任何RDS(例如MySQL),Redshift甚至S3 + Athena都可以轻松处理这种用例。如果您需要实时分析,甚至可以考虑使用AWS Kinesis。