2012-05-17 78 views
1

我認爲可以公平地說,我對今天下午安裝數據庫的MongoDB非常陌生。如何在MongoDB中存儲多對多的關係

我正在努力掌握存儲和檢索對象,但我正在努力尋找存儲具有多對多關係的對象的最佳方式。

我已經穿過DBRef對象,並得到了工作,但這似乎只支持懶加載的方法。

有沒有辦法鼓勵MongoDB急切地加載DBRefs?
有更好的/不同的方式來存儲多對多的關係嗎?

非常感謝

羅布

+0

您可以更具體地說明您想要存儲的關係類型嗎? Mongo的文檔結構是靈活的,並不是所有的多對多關係都必須以相同的方式表示。這裏有很多不同模式的好例子:http://www.mongodb.org/display/DOCS/Schema+Design – matulef

+0

蓋茨副總裁發佈了一個鏈接,其中有一個完美的例子「user - campaign - userCampaign」。在這裏它被建議存儲一個id列表,存儲一個ID比存儲一個DBRef更好? –

回答

1

因此,首先,我認爲你需要看this question over here,其中談到了很多一對多的關係。

要理解的另一件事是「DBRefs」的本質。 MongoDB數據庫不提供任何連接功能

DBRef只是幾年前幾個庫/驅動程序實現者達成一致的標準。 DBRef只是一個特定符號的JSON對象,它提供了指向某個集合中某個其他文檔的指針。因此,「懶惰與渴望」加載的實現完全針對您正在使用的驅動程序/包裝庫。

這表明,「渴望加載」的概念對MongoDB來說是毫無意義的。在SQL中,您可以通過使用某種形式的熱切加載和「事先」加入來潛在地節省總查詢。同樣,數據庫不支持連接,所以「急切加載」與「延遲加載」採用相同數量的查詢。

+1

我也想指出,即使是mongo文檔,如果您知道集合將保持不變,那麼只需手動存儲標識可以更高效。就個人而言,我不使用DBref並只存儲ID,並在需要時解決它們。 – jdi

+1

那引發了一個有趣的觀點。這是否意味着,如果MongoDB託管在與Web服務器不同的計算機上,那麼每個文檔請求都會有一次往返?我注意到,執行find()會返回一個遊標,每個文檔都在迭代中被檢索。 –

+0

@RobForrest這取決於你的實現。如果你有兩個集合:A和B,你從A *加載所有東西,然後從B中加載所有東西,你可以在兩個查詢中做到這一點。然而,如果你在'for'循環中進行簡單的「懶惰」加載,你肯定會招致很多開銷。所以你可能想要實現「加入」和「批量加入」功能。 –