2015-09-10 58 views
3

我正在设计统计仪表板数据库,数据将从我的主系统汇总并保存在Mongo中。MongoDB:设计统计仪表板模式

我试图找到我的数据库模型的最佳方式,我遇到的问题是,用户可以基于像(时间范围,年龄,性别)

此不同的标准筛选图文章是非常有用的时间范围,但我很困惑如何将所有的过滤器混合在一起。

http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-mongodb

例如

生成Total page views per product图,蒙戈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

您是否打开MongoDB以外的其他数据库?有一类时间序列数据库https://en.wikipedia.org/wiki/Time_series_database,这与聚合查询相当有效,这意味着您只能保存原始数据,并让数据库完成剩下的工作。不存储预先计算的聚合的附加好处是您可以在路上更改原始数据,例如,更新/修改,并看到您的总量反映它没有任何不一致。 –

+0

@SergeiRodionov感谢您的回复。是的,我是开放的,但不知道哪一个将是一个不错的选择,因为稳定性是一个关键这里InfluxDB看起来很有前途,但不确定在生产环境中的这个阶段使用它是明智的,因为该项目还是比较新的并且没有通过alpha但是,宁愿开源解决方案,任何建议? – trrrrrrm

+1

基于HBase的系统:OpenTSDB,Bosun(OpenTSDB之上)和ATSD。前两个是FOSS。披露:我为开发ATSD的公司工作。 –

回答

1

您正在寻找存储汇总数据是什么。将搜索标准添加到已经汇总的数据是非常复杂的。您需要在原始数据和汇总数据之间进行权衡。

  • 更多原始数据装置更易于混合和匹配不同的过滤条件,还可能较慢运行时。
  • 更多汇总数据意味着您需要预先定义应该可以过滤的标准。

目前,您只是发现原始数据和预先计算的数据之间的边界,并且您会看到您已经达到了所需条件的最小可能存储大小。如果你想要一个维度,你可能需要X个存储量。如果您需要两个维度,则可能需要X^2个存储量。三个维度需要X^3等。

在某些时候,您可能需要考虑使用面向时间序列的数据库,例如InfluxDB,Splunk或类似的数据库。这些数据库针对存储和索引原始的面向日志的数据进行了优化。