2017-07-26 58 views
0

场景: 我有一些我正在收集数据的气象站。数据大约每15分钟左右发送一次。每个数据包包含几个测量如压力,温度,湿度等DynamoDB时间序列表设计

的数据将通过多种方式被查询:

  1. 显示最新值对于所有测量在一个车站
  2. 显示历史图表用于单次测量(例如温度)
  3. 其他?

表建议:

STATIONS:散列键:站-ID

包含有关工作站的元数据信息

STATION_X_MEASUREMENT_DATA:散列键:测量型,增程键:时间戳

其中X是站ID。每个记录包含特定测量类型和时间的测量值。每个电台都有自己的数据表,这样当电台不再使用时,可以通过删除一个表来删除数据。

STATION_SUMMARY:哈希键:station_id

包含最新/电流值,所有测量类型的每个站

问题:

  1. 我应该有两个单独的表(总结和个人测量),还是我应该查询最新的测量结果?

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

  3. 如果我将所有测量结果存储在带有时间戳记的组合记录中作为范围键,那么使用分钟还是秒钟作为分区键值得?恐怕会让查询更加复杂。

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

回答

1

我应该有两个单独的表(汇总和个别观测值) 或者我应该只是查询最新的测量时,我想显示 总结?

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

另外有两个单独的表格允许您为表格设置不同的RCU/WCU。我想这个电台摘要很少写,所以你可以设置一个低的WCU,并且RCU高一些,而测量数据经常被写入,并且可能不经常被读取。再次您的设置可以反映这一点。

现在,你想有单独的台站和车站摘要表吗?它取决于你的数据和访问模式,但是将详细信息分解成单独的表格和将紧凑表示(可能是字段子集)分解到不同表格中是一种常见模式。如果您有像全站仪那样的要求,它可以让您节省一些RCU,因为他们可能不需要详细信息。

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

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

请记住,一个项目被限制为400KB,所以你不能在一个项目中堵塞很多数据。

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

如果你没有很多数据,你可能没有问题,每次测量只有一个项目。如果你有大量的数据,你需要减少AWS成本,那么你可能会得到更好的具有压缩的测量

如果我所有的测量存储在一个联合的纪录与 时间戳范围键阵列,作为分区密钥的 是否值得使用分钟或秒钟?恐怕这会让更多的查询更复杂。

很难说。每秒有多少条记录?每分钟?也许有必要每小时汇总以获得更好的压缩效果?或者也许一天?这取决于你的数据。

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

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