2013-08-01 62 views
0

說我有一個應用程序接收帶有兩個參數的請求:X和Y.我要做的就是統計這些請求,並且我想使用MongoDB來完成任務。MongoDB數據建模:文檔嵌入困境

我能想到的兩種方法將這些信息存儲在MongoDB中:

1. 有一個文件X和Y的每種組合:

{ 
    _id : "X+Y", 
    count : 34 
} 

2. 嵌入Y考慮X,這意味着每個X都有一個總結所有請求的文檔X:

{ 
    _id : "X", 
    total_count : 47, 
    y: { 
     "Y1" : 34, 
     "Y2" : 13 
    } 
} 

每個t的優缺點是什麼?這些方法?
一種方法是否是最佳實踐?還有另一種我錯過的合法方法嗎?這是一個常見的困境嗎?

我一直在閱讀MongoDB的手動data modeling部分和a FAQ discussing this issue,但我並不滿足。

感謝

更新

我的應用程序,預計處理大約50M請求天,而每個請求擁有一些屬性(如X和Y),但它們的相對少量(4-5),並且每個請求應該被計數(通過插入或更新)。
這些數據將在每個小時左右查詢,並且查詢預計會使用聚合。這些查詢通常會查詢最近幾天(最多一週)的數據。

回答

0

如果您認爲有可能需要獲得按X分組的總數,請使用第二種方法。此外,如果有可能需要將它按Y分組,那麼將數據非規範化並將嵌入Y中的X和嵌入Y中的X存儲在一起並不錯。 這是因爲mongo與聚合性能差。

如果您確定不需要任何類型的聚合,則第1種方法在更快的讀取/寫入和更少的磁盤空間使用方面會更好。

或者如果您不完全確定,請將其存儲爲:{x: "X", y: "Y", count: 42}。確保你爲此創建索引{x: 1, y: 1}。這樣您仍然可以選擇通過「X」或「Y」檢索所有文檔。請注意,具有{x: 1, y: 1}索引意味着您不需要創建{x: 1}索引來查詢「X」,只有{y: 1}查詢「Y」。

+0

第一種方法在讀/寫方面會更好嗎?也許如果我查詢一個特定的X和Y,對不對?因爲如果我查詢多種類型,我必須查詢多個文檔(比第二種方法更多),據我瞭解,查詢的文檔越多,得到的最差,不是? –

0

像這樣的抽象文件使得很難給出建議,但請避免使用非描述性鍵(或值作爲鍵)。請使用真實世界的文檔示例更新您的問題,以及您認爲需要使用哪些查詢(插入,更新和查找)。這些是可用於設計適當模式的唯一標準。

+0

我已經更新了這個問題,儘管我仍然認爲這些方法可以用正反兩詞來描述,而不管現實世界的例子如何。 –