2012-03-23 25 views
4

我正在記錄用戶在我們網站上做出的不同操作。每個操作可以是不同的類型:評論,搜索查詢,頁面視圖,投票等......這些類型中的每一個都有其自己的模式和公共信息。例如:Mongodb:針對性能/索引的多個特定集合或一個「全部存儲」集合

comment : {"_id":(mongoId), "type":"comment", "date":4/7/2012, 
      "user":"Franck", "text":"This is a sample comment"} 

search : {"_id":(mongoId), "type":"search", "date":4/6/2012, 
      "user":"Franck", "query":"mongodb"} etc... 

基本上,在面向對象或RDBMS,我會設計一個Action類/表和一組繼承的類/表(點評,搜索,投票)的。

由於MongoDb沒有模式,我傾向於設置一個獨特的集合(「Actions」),我將存儲這些對象而不是多個集合(collection Actions + collection帶有鏈接鍵的註釋, ...)。

我的問題是:如果我嘗試按特定列搜索,性能/響應時間又如何?

據我瞭解索引最佳實踐,如果我想「每個用戶搜索mongodb」,我會索引列「type」+「查詢」。但它不會涉及整套數據,只有那些類型爲「搜索」的數據。

MongoDb引擎會掃描整個表還是隻關注具有此特定模式的數據?

回答

3

如果您創建sparse indexes mongo將忽略任何沒有密鑰的行。儘管they can only index one field有稀疏指標的具體限制。

但是,如果您只打算使用公共字段查詢,絕對沒有理由不使用單個集合。

I.e.如果用戶+型(或日期+用戶+型)的索引將滿足您所有的查詢需求 - 我們沒有理由來創建多個集合

提示:日期使用日期對象,使用對象id,而不是名稱在適當情況下。

+0

謝謝!有趣的功能和技巧。 – theAndroid 2012-03-23 11:13:32

0

這裏是MongoDB's Best Practices

存儲的所有數據一些有用的信息,在一個文檔中的記錄。

MongoDB在文檔級提供原子操作。當記錄的數據 存儲在單個文檔中時,整個記錄可以是在單個查找操作中檢索的 ,這非常有效。在某些 的情況下,將所有數據存儲在單個文檔中可能不切實際,或者可能會對其他操作產生負面影響。進行權衡, 最適合您的應用。

避免大型文檔。

MongoDB中文檔的最大尺寸爲16MB。在實踐中,大多數 文件是幾千字節或更少。考慮文檔更像表中的 行,而不是表格本身。而不是在單個文檔中維護 記錄列表,而是使每個記錄成爲 文檔。對於大型媒體文件(例如視頻),請考慮使用 GridFS,這是由所有驅動程序實施的慣例,這些驅動程序將 二進制數據存儲在許多較小的文檔中。

相關問題