MongoDB:设计统计信息仪表板架构

时间:2015-09-10 04:38:56

标签: mongodb database

我正在为统计信息中心设计数据库,数据将从我的主系统聚合并保存在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
                }
            }
        },
    }
}

我可以看到的问题是,如果用户混合(年龄范围,年龄组和性别),

1 个答案:

答案 0 :(得分:1)

您希望存储汇总数据。向已经聚合的数据添加搜索条件是非常复杂的。您需要在原始数据和聚合数据之间进行权衡。

  • 更多原始数据意味着更容易混合和匹配不同的过滤条件,但运行时间也可能更慢。
  • 更多汇总数据意味着您需要预定义应该过滤的条件。

目前您刚刚发现原始数据和预先计算数据之间的边界,您将看到已经达到所需条件的最小可能存储大小。如果您想要一个维度,则可能需要X个存储空间。如果您需要两个维度,则可能需要X ^ 2个存储量。三个维度需要X ^ 3,依此类推。

在某些时候,您可能需要考虑使用面向时间序列的数据库,例如InfluxDB,Splunk或类似数据库。此类数据库已经过优化,可用于存储和索引原始的面向日志的数据。