2015-09-10 92 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或類似的數據庫。這些數據庫針對存儲和索引原始的面向日誌的數據進行了優化。