2013-03-14 144 views
2

我正在爲日誌管理系統設計我的第一個MongoDB數據庫模式,並且我想將日誌文件中的信息存儲到mongoDB,我無法決定我應該使用哪種模式文件(嵌入與參考)。MongoDB嵌入與大型數據文檔的參考模式

注:項目有許多來源和來源(超過1個000 000日誌在某些情況下),有許多日誌

{  
     "_id" : ObjectId("5141e051e2f56cbb680b77f9"), 
     "name" : "projectName", 
     "source" : [{ 
      "name" : "sourceName", 
      "log" : [{ 
       "time" : ISODate("2012-07-20T13:15:37Z"), 
       "host" : "127.0.0.1", 
       "status" : 200.0, 
       "level" : "INFO", 
       "message" : "test" 
      }, { 
       "time" : ISODate("2012-07-20T13:15:37Z"), 
       "host" : "127.0.0.1", 
       "status" : 200.0, 
       "level" : "ERROR", 
       "message" : "test" 
      }] 
     }] 
    } 

我focuse是表現在從數據庫(不寫),例如讀取數據過濾,搜索,分頁等用戶可以按日期,狀態等過濾源日誌(所以我想專注於讀取性能,當用戶搜索或過濾數據)

我知道,MongoDB有一個16M字節的文檔大小限制,所以我擔心如果我要爲一個源提供1 000 000個日誌,這將如何工作(因爲我可以有一個項目的許多來源和來源可以有多個日誌)。我應該使用嵌入式還是參考模式時,如何處理大型文檔並希望具有良好的閱讀性能,哪種解決方案更好?謝謝

回答

3

你的問題的答案既不是。除了嵌入或使用引用之外,您應該將架構展平爲每個日誌條目的一個文檔,以便擴展超出16MB文檔限制的範圍,以便您可以訪問MongoDB查詢功能的全部功能和性能。

因此擺脫陣列領域,並使用類似的方法移動一切都交給頂級域:

{  
    "_id" : ObjectId("5141e051e2f56cbb680b77f9"), 
    "name" : "projectName", 
    "sourcename" : "sourceName", 
    "time" : ISODate("2012-07-20T13:15:37Z"), 
    "host" : "127.0.0.1", 
    "status" : 200.0, 
    "level" : "INFO", 
    "message" : "test" 
    }, { 
    "_id" : ObjectId("5141e051e2f56cbb680b77fa"), 
    "name" : "projectName", 
    "sourcename" : "sourceName", 
    "time" : ISODate("2012-07-20T13:15:37Z"), 
    "host" : "127.0.0.1", 
    "status" : 200.0, 
    "level" : "ERROR", 
    "message" : "test" 
} 
1

我認爲,在一個陣列,具有日誌可能會messy..If項目和源實體唐「T比名字以外的其他任何屬性(鍵)和日誌不會被長期保存,可以使用具有capped collection一個日誌文件每:

{_id: ObjectId("5141e051e2f56cbb680b77f9"), p: "project_name", s: "source_name", "time" : ISODate("2012-07-20T13:15:37Z"), "host" : "127.0.0.1", "status" : 200.0, "level" : "INFO", "message" : "test"}

請參閱本以及:http://docs.mongodb.org/manual/use-cases/storing-log-data/

封頂收藏保持自然秩序。所以你不需要時間戳索引來按照自然順序返回日誌。就你而言,你可能想從特定的源/項目中檢索所有日誌。您可以創建索引{p:1,s:1}以加快此查詢。

但我建議你做一些'基準測試'來檢查性能。嘗試上面的封頂收集方法。還可以嘗試使用您建議的完全嵌入架構的文檔分段。這種技術被用在經典的blog-comments問題中。因此,只有在單個文檔中存儲了每個源的很多日誌,並且每當自定義大小超過時,就會溢出到新文檔。