我的应用程序每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排序键。
有人知道更好的方法吗?