DynamoDB时间序列表设计

时间:2017-07-26 18:23:52

标签: time-series amazon-dynamodb

情境: 我有几个我收集数据的气象站。数据大约每15分钟左右出现一次。每个数据包包含多个测量值,如压力,温度,湿度等。

将以多种方式查询数据:

  1. 显示电台所有测量的最新值
  2. 显示单次测量的历史图表(例如温度)
  3. 其他?
  4. 建议表:

    STATIONS:hash-key:station-id

    包含有关电台的元数据信息

    STATION_X_MEASUREMENT_DATA:hash-key:measurement-type,range-key:timestamp

    其中X是电台ID。每条记录包含特定测量类型和时间的测量值。每个电台都有自己的数据表,以便在电台不再使用时通过丢弃表来删除数据。

    STATION_SUMMARY:hash-key:station_id

    包含每个站的所有测量类型的最新/当前值

    问题:

    1. 我是否应该有两个单独的表格(摘要和个别测量),还是应该在我想显示摘要时查询最新的测量值?

    2. 我应该将测量类型存储为单个记录还是组合成特定时间戳的单个记录?

    3. 如果我将所有测量值存储在时间戳为范围键的组合记录中,是否值得使用分钟或秒作为分区键?我担心这会使查询变得更复杂。

    4. 还有什么我应该改变/改进的吗?还有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

  

我应该有两个单独的表格(摘要和个别测量)   或者我应该在我想要显示时查询最新的测量值   摘要?

我不知道你怎么能有一张桌子。在测量数据中,每次测量都有一个项目,而在摘要表中,每个项目都有关于站点的静态信息。如果要将它们添加到单个表中,是否要复制摘要信息?

还有两个单独的表允许您为表设置不同的RCU / WCU。我猜这个小组摘要很少写,所以你可以设置一个低WCU,更高的RCU,而测量数据经常写,可能不经常读。您的设置可以反映出这一点。

现在,您是否希望为站点和站点摘要提供单独的表格?这取决于您的数据和访问模式,但是将升沉详细信息拆分为单独的表,并将紧凑表示(可能是字段的子集)拆分为不同的表是一种常见模式。如果您有get-all-stations等请求,它可以让您保存一些严重的RCU,因为他们可能不需要详细的信息。

  

我应该将测量类型存储为单个记录还是组合在一起   到特定时间戳的单个记录中?

我看到的唯一区别是您可以将多个测量值压缩为二进制blob并将其存储到一个项目中。如果你的测量有一些重复(LZW算法?)或者数据是否从测量变为测量(delta encoding?)。在后一种情况下,您可以编写22,1,-1或类似的东西而不是写202,203,202。

请注意,某件商品的数量不得超过400KB,因此您无法在一件商品中包含大量数据。

另请注意,对于单个分区键,您不能拥有超过10GB的数据,因此您需要制定一个策略来处理该问题。请注意,这不取决于项目数量或单个项目的大小。

如果您没有大量数据,那么每次测量只需要一个项目即可。如果您有大量数据且需要降低AWS成本,那么压缩测量数组可能会更好

  

如果我要将所有测量结果存储在合并记录中   时间戳作为范围键,是否值得使用分钟或秒   分区键?我担心这会使查询更多   复杂。

很难说。你每秒有多少条记录?每分钟?也许每小时聚合以获得更好的压缩效果是有意义的吗?或者也许是一天?这取决于您的数据。

  

还有什么我应该改变/改进的吗?还有更好的选择吗?

您可以针对不同的时间间隔使用不同的表。较新的数据可以具有较高的WCU / RCU配置,而较旧的数据将具有较低的WCU(您可以在过去写吗?)和较低的RCU。旧数据可以传输到S3。如果需要,您还可以使用DynamoDB TTL自动删除旧表。