2013-03-09 100 views
28

我需要幫助在mongo中建模我的數據。大多數我的經驗都在關係數據庫中,我剛開始使用w/mongo。我正在模擬不同事件的數據。Mongodb:多個集合或一個大集合w/index

  1. 每個'事件'具有相同的字段。
  2. 每個「事件」將有數百到數百萬個文檔/行
  3. 事件是動態的,即根據需要創建新事件。即 可能會創建一個新的'2016年夏季奧運'活動。

可能最重要的是,當處理事件(CRUD操作)時,用戶必須指定一個事件名稱。

到目前爲止,我可以看到幾種方法來完成此操作,但我不想在設置數據模型時出現「錯誤」方式的重大錯誤。

1)具有所有事件數據的「事件」集合。 「事件」名稱索引。查詢將如下所示:

db.events.find({event: 'Summer Olympics 2012'); 
{event: 'Summer Olympics 2012', attributes: [{name: 'joe smith', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'jane doe', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'john avery', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'ted williams', .... } 

db.events.find({event: 'Summer Olympics 2013'}) 
{event: 'Summer Olympics 2016', attributes: [{name: 'steve smith', .... } 
{event: 'Summer Olympics 2016', attributes: [{name: 'amy jones', .... } 

2)每個新事件的集合,帶有集合以跟蹤所有事件名稱。事件名稱不需要索引,因爲每個事件都存儲在不同的集合中。

// multiple collections, create new as needed 
db.summer2012.find() // get summer 2012 docs 

db.summer2016.find() // get summer 2016 docs 

//'events' collection 
db.events.find() // get all events that I would have collections for 
{name: 'summer2012', title: 'Summer Olympics 2012}; 
{name: 'summer2016', title: 'Summer Olympics 2016}; 

#1我有點擔心,一旦我達到每100個事件與百萬計的「事件」是查找記錄將是緩慢的,即使其中一個事件只有500個文件。

對於#2我每次都創建一個新的集合並在事件出現的時候,通過這裏'mingo'模式來模擬這個mongo模型?

歡迎任何意見/想法,因爲我真的不知道哪一個最終會表現更好,或者如果其中一個會讓我陷入更困難的道路。我環顧四周(包括蒙戈的網站),我真的找不到具體的答案。

+0

這些屬性是什麼?人?那麼你有沒有參加過活動的人?這些人是否在您的系統中註冊?如果你剛剛開始在MongoDB,看看這個:https://code.google.com/p/morphia/wiki/QuickStart – rbento 2013-03-09 19:23:47

+0

對不起壞例子:(真的是它的地理空間數據。所以我會有一個x ,y代表每個文檔,用戶可以很容易地在地圖上添加/刪除一個地圖的當前位置,並附上關於該地點的一些元數據,例如圖片/視頻,標題,天氣等等。所以想象一下,奧運會的一羣人添加新數據人員/地點相同差異問題是因爲每個「事件」可能有數百萬個文檔,如果每個獨立事件都存在於自己的集合中,或者將所有事件文檔放入同一個集合中?一個集合包含1000萬個文檔,每個文檔都有大約100萬個文檔 – lostintranslation 2013-03-09 19:31:05

+0

也是剛開始使用Mongo,我認爲手冊的這一部分很重要:http://docs.mongodb.org/manual/applications/indexes/它讓我感受到了這種印象MongoDb db的設計可以,而且應該和db設計非常相似,所以我會的首先選擇脈搏,特別是如果你打算做「交叉事件」quesries – 2013-03-09 19:35:59

回答

38

從這裏蒙戈文檔:data modeling

在某些情況下,您可以選擇存儲在 幾個集合的信息,而不是一個單一的收藏。

請考慮一個示例收集日誌,其中存儲了各種環境和應用程序的日誌文檔 。日誌收集包含以下形式的 文檔:

{log:「dev」,ts:...,info:...} {log:「debug」,ts:...,info:。 ..}

如果文檔總數很少,您可以按照類型將文檔分組到 集合中。對於日誌,請考慮維護不同的日誌集合,例如logs.dev和logs.debug。 logs.dev集合 將只包含與開發環境相關的文檔。

一般而言,擁有大量收藏並沒有顯着的性能損失並導致非常好的性能。不同的 集合對於高吞吐量批處理非常重要。

也談到了10gen傢伙。對於真正的大型藏品,他列舉了多種益處,將其分爲更小的更具體的藏品。他對所有數據使用一個集合並使用索引的評論是:

僅僅因爲你可以做某件事並不意味着你應該這樣做。型號 適當的數據。可能很容易存儲在一個大集合 和索引中,但這並不總是最好的方法。