2

我有一个时间序列数据,我想存储在 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

存储:

时间序列。

访问:

  1. 我想在具有特定 TeamId 的时间范围内获得所有结果。例如,通过查询teamAbetween 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          Data
  1. 对于每个 TaskId,我想在具有特定 TeamId 的时间范围内获得最新结果。例如,通过查询teamAbetween 3/1/2019-8/1/2019,我会得到:
1            3/23/2019   teamA          Data
3            7/24/2019   teamA          Data
5            7/24/2019   teamA          Data
4

1 回答 1

1

您的第一个查询很容易通过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 进行此查询,但为了获得所需的结果,您需要在给定时间范围内为团队选择所有任务事件,然后在您的应用程序中处理获取最新事件每个任务 ID。这是可能的,但它不会有很好的性能,而且会非常昂贵。

你有两个我看到的其他选择。首先是将您的数据复制到另一个可以支持分析和/或搜索查询的数据库。您可以使用 DynamoDB Streams近乎实时地执行此操作,使用AWS Database Migration Service以“连续”方式(根据 AWS 文档)执行此操作,或者使用AWS DataPipelines定期执行此操作。您可以将数据发送到Amazon Redshift之类的分析数据库、 ElasticSearch之类的搜索数据库或S3 上的 Athena数据库排序解决方案。

另一种选择是使用不同的主数据库。您可能对Amazon QLDB感兴趣,它是一个完全托管的无服务器数据库,支持PartiQL(几乎是 SQL 的超集)和Ion(json 的超集)文档。您还可以考虑使用 Amazon AuroraAmazon DocumentDB

于 2019-10-01T06:34:37.130 回答