2010-11-23 42 views
8

請原諒我的英語,我仍然試圖掌握它。對象的MongoDB關係

我已經開始學習MongoDB(來自C#背景),我喜歡什麼是MongoDB的想法。我在互聯網上的例子有一些問題。

以流行的博客文章/評論爲例。發佈沒有或多個與它相關的評論。我創建Post對象,在Post中向IList添加一些Comment對象。沒關係。

難道我補充一點,只是一個「帖子」收藏MonoDB或者我應該有兩個集合 - 一個是blog.posts和blog.posts.comments?

我有一個公平的複雜對象模型,最簡單的方法就是將其視爲一個銀行系統 - 我們正在開採。我試圖用方括號來突出顯示錶格。

[用戶]有具有一個或多個[交易]其具有一個和僅一個[類型]一個或多個[帳戶][Transactions]可以有一個或多個[Tag]分配給交易。 [網友]創建自己的[標籤]特有的用戶帳戶,我們有時需要提供這些代碼的報表(如五月,標籤鑽井費用爲$ 123456.78)。

索引,我還以爲他們分隔條件將是一件好事,但我很擔心,這是不好的做法,從舊RBDMS天這一思想。

以某種方式,它就像博客的例子。我不知道我是否應該有1 [帳戶]收集並堅持所有信息,或者有一箇中間步驟將其分解爲單獨的收集。

其他相關查詢是,當你持續來回時,你通常會回覆與該記錄相關的所有 - 即使不需要或者你是否限制?

+2

在我看來,你的數據模型是非常相關的。我不認爲基於文檔的數據存儲是適合它的(請參閱@Hightechrider的迴應)。 NoSQL意味着「非關係數據存儲」,而不是「SQL備選」。這就是爲什麼NoSQL是這種系統的牛市銷售術語。 – rubayeet 2010-11-23 07:18:51

回答

12

這取決於。

這取決於您期望擁有的每種類型的對象的數量。您是否可以將它們全部整合到給定用戶的單個MongoDB文檔中?可能不會。

這取決於關係 - 是用戶帳戶一對多還是多對多的關係?如果它是一對多並且帳戶數量很小,則可以選擇將它們放入用戶文檔的IList中。

您仍然可以使用單獨的集合在MongoDB中建模關係,但是數據庫中沒有聯接,因此您必須在代碼中執行此操作。從性能的角度來看,加載用戶然後加載他們的賬戶可能會很好。

您可以在文檔上索引INTO數組。不要以爲索引只是一個文檔簡單字段上的索引(如SQL)。您可以使用文檔上的標籤集合,並將其索引到標籤中。 (見http://www.mongodb.org/display/DOCS/Indexes#Indexes-Arrays

當您檢索或寫入數據,你可以做一個部分讀取和任何文件的部分寫。(請參閱http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields

最後,當您無法看到如何使用集合和索引獲取所需內容時,可以使用map reduce實現它。例如,要查找當前正在使用的所有標籤按其使用頻率排序,您可以使用地圖每個發佈其中使用的標籤的文檔,然後您將減少設置爲獲得您想要的結果。然後,您可能會永久存儲該地圖縮放的結果,並且只在需要時才更新它。

還有一個問題:您提到了通過標記計算總數。如果您希望具有會計質量的交易一致性,MongoDB可能不是您的正確選擇。 「最終一致性」是NoSQL數據存儲的遊戲名稱,它們通常不適合金融交易。例如,如果一個用戶看到3條評論的博客帖子,而另一個用戶看到4個博客帖子並不重要,因爲他們點擊不同步的副本副本,但對於財務報告,這種一致性確實很重要 - 您的報告可能不會加起來!