在 DynamoDB 中为时间序列数据选择组合键
Selecting composite key for time-series data in DynamoDB
我有一个时间序列数据,我想将其存储在 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
存储:
时间序列。
正在访问:
- 我想使用特定的 TeamId 在时间范围内获得所有结果。
例如,通过在
7/16/2019-8/20/2019
之间查询 teamA
,我会得到:
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
- 我想在某个时间范围内为每个 TaskId 获取具有特定 TeamId 的最新结果。
例如,通过在
3/1/2019-8/1/2019
之间查询 teamA
,我会得到:
1 3/23/2019 teamA Data
3 7/24/2019 teamA Data
5 7/24/2019 teamA Data
通过使用 TeamId
作为散列键并使用 Date/Time
作为排序键,您的第一个查询很容易解决。如果您在写入 table.
时希望使用不同的密钥,您也可以使用这些密钥创建 GSI。
您的第二个查询不可能 运行 完全在 DynamoDB 中。你想要的很容易在SQL中表达为:
SELECT taskId, MAX(dateTime), teamId, data FROM tasks WHERE teamId=123 AND dateTime > earlierDate AND dateTime < laterDate GROUP BY taskId
在 DynamoDB 中,可以 select 单个特定任务 日期范围内的最新事件。对于属于特定团队的所有任务,也可以 select 所有时间 的最新事件 使用 table 的 materialized aggregation。
您可以使用 DynamoDB 进行此查询,但为了获得您想要的结果,您需要 select 给定时间范围内团队的所有任务事件,然后 在您的应用程序中 您将需要处理获取每个 taskId 的最新事件。这个是可以的,但是性能不会很好,而且会很贵。
我看到您还有另外两个选择。第一种是将您的数据复制到另一个可以支持分析 and/or 搜索查询的数据库。您可以近乎实时地执行此操作 using DynamoDB Streams, "continuously" (according to the AWS docs) using AWS Database Migration Service, or at periodic intervals using AWS DataPipelines. You can send your data to an analytics database like Amazon Redshift, a search database like ElasticSearch, or the sort-of-a-database solution that is Athena on S3.
另一种选择是使用不同的主数据库。您可能对 Amazon QLDB, which is a fully-managed, serverless database that supports PartiQL (almost a superset of SQL) and Ion (a superset of json) documents. You might also consider Amazon Aurora or Amazon DocumentDB.
感兴趣
我有一个时间序列数据,我想将其存储在 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
存储:
时间序列。
正在访问:
- 我想使用特定的 TeamId 在时间范围内获得所有结果。
例如,通过在
7/16/2019-8/20/2019
之间查询teamA
,我会得到:
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
- 我想在某个时间范围内为每个 TaskId 获取具有特定 TeamId 的最新结果。
例如,通过在
3/1/2019-8/1/2019
之间查询teamA
,我会得到:
1 3/23/2019 teamA Data
3 7/24/2019 teamA Data
5 7/24/2019 teamA Data
通过使用 TeamId
作为散列键并使用 Date/Time
作为排序键,您的第一个查询很容易解决。如果您在写入 table.
您的第二个查询不可能 运行 完全在 DynamoDB 中。你想要的很容易在SQL中表达为:
SELECT taskId, MAX(dateTime), teamId, data FROM tasks WHERE teamId=123 AND dateTime > earlierDate AND dateTime < laterDate GROUP BY taskId
在 DynamoDB 中,可以 select 单个特定任务 日期范围内的最新事件。对于属于特定团队的所有任务,也可以 select 所有时间 的最新事件 使用 table 的 materialized aggregation。
您可以使用 DynamoDB 进行此查询,但为了获得您想要的结果,您需要 select 给定时间范围内团队的所有任务事件,然后 在您的应用程序中 您将需要处理获取每个 taskId 的最新事件。这个是可以的,但是性能不会很好,而且会很贵。
我看到您还有另外两个选择。第一种是将您的数据复制到另一个可以支持分析 and/or 搜索查询的数据库。您可以近乎实时地执行此操作 using DynamoDB Streams, "continuously" (according to the AWS docs) using AWS Database Migration Service, or at periodic intervals using AWS DataPipelines. You can send your data to an analytics database like Amazon Redshift, a search database like ElasticSearch, or the sort-of-a-database solution that is Athena on S3.
另一种选择是使用不同的主数据库。您可能对 Amazon QLDB, which is a fully-managed, serverless database that supports PartiQL (almost a superset of SQL) and Ion (a superset of json) documents. You might also consider Amazon Aurora or Amazon DocumentDB.
感兴趣