【发布时间】:2016-01-14 00:12:37
【问题描述】:
我有兴趣计算两个时间点之间与唯一可识别资源的用户交互。
我的用例是:
- 检索个人
resourceId的总计数(在时间 x 和时间 y 之间) - 生成按计数排序的前
resourceIds 列表(在时间 x 和时间 y 之间)
理想情况下,我希望使用 DynamoDB 来实现这一点。在发电机中对时间序列数据进行排序看起来有挑战,我在尝试对数据建模时遇到了一些反最佳实践。
到目前为止的数据模型
下采样表可能如下所示,其中count 是在timebin 范围内与resourceId 的交互次数。
| resourceId | timebin | count |
|---------------|-----------|-------|
|(Partition Key)| (Sort Key)| |
每个资源的总交互计数是每个具有相同resourceId 的项目中的计数属性的总和。由于感兴趣的是无限的“所有时间”计数,因此较旧的事件永远不会过时,但它们可以进一步下采样并滚动到更大的时间段中。
使用上述架构,用例 1 是通过使用其哈希键对资源进行排队并使用排序键强制执行时间限制来实现的。然后可以在应用端计算总计数。
对于用例 2,我希望实现相当于 SQL GROUP BY resourceId, SUM(count) 的效果。为此,数据库需要返回与提供的timebin 约束匹配的所有项目,而不考虑resourceId。然后可以在应用程序端执行计数的分组和求和。
问题:使用上述架构需要进行全表扫描。
这显然是我想避免的。
可能的解决方案
- 大量缓存用例 2 的查询,以便使用扫描,但很少使用(例如,每天一次)。
- 维护一个聚合表,例如,将预定义的
timeRanges 作为分区键,将相应的count作为排序键。
即
| resourceId | timeRange (partition) | count (sort) |
|------------|------------------------|--------------|
| 1234 | "all_time" | 9999 |
| 1234 | "past_day" | 533 |
这里,“all_time”有一个固定的 FROM 日期,因此可以在每次收到 resourceId 事件时递增。然而,“past_day”有一个移动的 FROM 日期,因此需要使用更新的 FROM 和 TO 标记定期重新聚合。
我的问题
有没有更有效的方法来为这些数据建模?
【问题讨论】:
标签: time-series amazon-dynamodb