我正在为统计信息中心设计数据库,数据将从我的主系统聚合并保存在Mongo中。
我试图找到建模我的数据库的最佳方式,我遇到的问题是用户可以根据不同的标准过滤图表,如(时间范围,年龄组,性别)
这篇文章对时间范围非常有帮助,但我很困惑如何将所有过滤器混合在一起。
http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-mongodb
例如
生成Total page views per product
图,mongo db记录应类似于:
{
timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
type: “page_views”,
product_id: 1550
values: {
0: { 0: 999999, 1: 999999, …, 59: 1000000 },
1: { 0: 2000000, 1: 2000000, …, 59: 1000000 },
…,
58: { 0: 1600000, 1: 1200000, …, 59: 1100000 },
59: { 0: 1300000, 1: 1400000, …, 59: 1500000 }
}
}
如果用户只能过滤时间范围,但如果用户将其与年龄组或性别混合,那么这将非常有效
{
timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
type: “page_views”,
product_id: 1550
values: {
0: {
0: {
total: 999999,
age_group: {
teenagers: 4032932,
adults: 432942,
...
},
gender: {
male: 4239423,
female: 4342343
}
},
1: {
total: 999999,
age_group: {
teenagers: 4032932,
adults: 432942,
...
},
gender: {
male: 4239423,
female: 4342343
}
},
....
59: {
total: 999999,
age_group: {
teenagers: 4032932,
adults: 432942,
...
},
gender: {
male: 4239423,
female: 4342343
}
}
},
....
59: {
0: {
total: 999999,
age_group: {
teenagers: 4032932,
adults: 432942,
...
},
gender: {
male: 4239423,
female: 4342343
}
},
1: {
total: 999999,
age_group: {
teenagers: 4032932,
adults: 432942,
...
},
gender: {
male: 4239423,
female: 4342343
}
},
....
59: {
total: 999999,
age_group: {
teenagers: 4032932,
adults: 432942,
...
},
gender: {
male: 4239423,
female: 4342343
}
}
},
}
}
我可以看到的问题是,如果用户混合(年龄范围,年龄组和性别),
答案 0 :(得分:1)
您希望存储汇总数据。向已经聚合的数据添加搜索条件是非常复杂的。您需要在原始数据和聚合数据之间进行权衡。
目前您刚刚发现原始数据和预先计算数据之间的边界,您将看到已经达到所需条件的最小可能存储大小。如果您想要一个维度,则可能需要X个存储空间。如果您需要两个维度,则可能需要X ^ 2个存储量。三个维度需要X ^ 3,依此类推。
在某些时候,您可能需要考虑使用面向时间序列的数据库,例如InfluxDB,Splunk或类似数据库。此类数据库已经过优化,可用于存储和索引原始的面向日志的数据。