我有一个时间序列数据,我想存储在DynamoDB上,关于开发人员任务的事件(包含在数据中)。我很难决定选择哪个分区键和排序键来服务我的访问,需要最好的方式。我应该选择哪些密钥/ GSI来满足我的访问需求,下面将对此进行解释。
数据:
TaskId Date/Time TeamId Data
1 3/21/2018 teamA Data
1 3/22/2018 teamA Data
1 3/23/2019 teamA Data
5 7/13/2019 teamA Data
5 7/15/2019 teamA Data
3 7/17/2019 teamA Data
4 7/22/2019 teamC Data
3 7/24/2019 teamA Data
4 7/24/2019 teamC Data
2 7/24/2019 teamB Data
5 7/24/2019 teamA Data
6 8/16/2019 teamA Data
6 8/19/2019 teamA Data
6 8/28/2019 teamA Data存储:
时间序列。
访问:
teamA之间查询7/16/2019-8/20/2019,我将得到:3 7/17/2019 teamA Data
3 7/24/2019 teamA Data
5 7/24/2019 teamA Data
6 8/16/2019 teamA Data
6 8/19/2019 teamA DatateamA之间查询3/1/2019-8/1/2019,我将得到:1 3/23/2019 teamA Data
3 7/24/2019 teamA Data
5 7/24/2019 teamA Data发布于 2019-10-01 06:34:37
通过使用TeamId作为散列键和Date/Time作为排序键,您的第一个查询很容易解决。如果您希望在写入表时使用不同的键,也可以使用这些键创建GSI。
您的第二个查询不可能完全在DynamoDB中运行。您想要的在SQL中很容易地表示为:
SELECT taskId, MAX(dateTime), teamId, data FROM tasks WHERE teamId=123 AND dateTime > earlierDate AND dateTime < laterDate GROUP BY taskId在DynamoDB中,可以为单个特定任务在日期范围内选择最新事件。还可以使用表的物化聚合为属于特定团队的所有任务选择所有时间的最新事件。
您可以对此查询使用DynamoDB,但为了获得所需的结果,需要在给定的时间范围内为团队选择所有任务事件,然后在应用程序中需要处理每个taskId的最新事件。这是可能的,但它不会有很好的性能,它将是非常昂贵的。
我看到你还有两种选择。第一种方法是将数据复制到另一个可以支持分析和/或搜索查询的数据库中。您可以在近乎实时的使用DynamoDB流、“连续”(根据AWS文档)使用AWS数据库迁移服务或定期使用AWS DataPipelines执行此操作。您可以将数据发送到分析数据库(如亚马逊红移 )、搜索数据库(如ElasticSearch )或数据库排序方案(即S3上的雅典娜 )。
另一种选择是使用不同的主数据库。您可能对亚马逊QLDB感兴趣,它是一个完全管理的、无服务器的数据库,它支持PartiQL (几乎是SQL的超集)和离子 (json的超集)文档。您还可以考虑亚马逊Aurora或亚马逊DocumentDB。
https://stackoverflow.com/questions/58083114
复制相似问题