具有每日/每周/每月汇总值的DynamoDB

时间:2017-06-30 08:49:03

标签: amazon-web-services amazon-dynamodb

我的应用程序每10分钟创建一个日志文件,我希望以聚合方式存储在DynamoDB中,例如每天144个日志文件,每周1008个日志文件或每月约4400个日志文件。 我有不同的分区键,但为了简单起见,我在以下示例中仅使用了一个分区键。

直接的解决方案是拥有不同的表格,例如

表“TenMinLogsDay”:

id (=part.key) | date (=sort key) | cntTenMinLogs | data
-------------- | ---------------- | ------------- | -------------------------------
 1             | 2017-04-30       | 144           | some serialized aggregated data
 1             | 2017-05-01       | 144           | some serialized aggregated data
 1             | 2017-05-02       | 144           | some serialized aggregated data
 1             | 2017-05-03       | 144           | some serialized aggregated data

表“TenMinLogsWeek”:

id (=part.key) | date (=sort key) | cntTenMinLogs | data
-------------- | ---------------- | ------------- | -------------------------------
 1             | 2017-05-01       | 1008          | some serialized aggregated data
 1             | 2017-05-08       | 1008          | some serialized aggregated data
 1             | 2017-05-15       | 1008          | some serialized aggregated data

表“TenMinLogsMonth”:

id (=part.key) | date (=sort key) | cntTenMinLogs | data
-------------- | ---------------- | ------------- | -------------------------------
 1             | 2017-05-01       | 4464          | some serialized aggregated data
 1             | 2017-06-01       | 4320          | some serialized aggregated data
 1             | 2017-07-01       | 4464          | some serialized aggregated data

我更喜欢组合表。开箱即用的DynamoDB似乎不支持这一点。 此外,我想查询每日或每周或每月聚合项目,因此我不想使用过滤器功能。

以下解决方案是可行的,但似乎是一个糟糕的黑客:

表“TenMinLogsCombined”:

id (=part.key) | date (=sort key) | week (=LSI sort key) | month (=LSI sort key) | cntTenMinLogs | data
-------------- | ---------------- | -------------------- | --------------------- | ------------- | -----
 1             | 2017-04-30       |   (empty)            |   (empty)             | 144           | ...
 1             | 2017-05-01       |   (empty)            |   (empty)             | 144           | ...
 1             | 0017-05-01       | 2017-05-01           |   (empty)             | 1008          | ...
 1             | 1017-05-01       |   (empty)            | 2017-05-01            | 4464          | ...
 1             | 2017-05-02       |   (empty)            |   (empty)             | 144           | ...
 1             | 2017-05-03       |   (empty)            |   (empty)             | 144           | ...

说明: 通过使用年份“0017”和“1017”代替“2017”,我可以查询日期范围,例如2017-05-01到2017-05-04和DynamoDB不会读取以0017或1017开头的商品 对于周或月范围查询,不需要这样的黑客,因为可以使用空的LSI排序键。

有人知道更好的方法吗?

0 个答案:

没有答案