【问题标题】:Selecting composite key for time-series data in DynamoDB为 DynamoDB 中的时间序列数据选择复合键
【发布时间】:2020-01-24 17:51:29
【问题描述】:

我有一个时间序列数据,我想将其存储在 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 的时间范围内获得所有结果。 例如,通过在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
  1. 我想在某个时间范围内为每个 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

【问题讨论】:

  • teamX 可以在同一日期有多个任务(比如 TaskId 3 和 4)吗? teamX 可以在同一日期多次拥有相同的 TaskId(比如 TaskId 2)吗?当您说“日期”时,它实际上是日期,而不是日期/时间?
  • 很抱歉给您带来了困惑。它是一个时间戳。它可能是唯一的,并且 teamX 不能在完全相同的时间拥有相同的 taskId。

标签: amazon-web-services time-series amazon-dynamodb key-value document-store


【解决方案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 中,可以为单个特定任务选择日期范围内的最新事件。也可以使用您表的materialized aggregation 为属于特定团队的所有任务选择最新的事件所有时间

您可以使用 DynamoDB 进行此查询,但为了获得您想要的结果,您需要在给定时间范围内选择团队的所有任务事件,然后在您的应用程序中您将需要处理获取每个 taskId 的最新事件。这是可能的,但它不会有很好的性能,而且会很昂贵。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2016-10-09
    • 2015-09-06
    相关资源
    最近更新 更多