2013-08-16 30 views
2

我對NoSQL,MongoDB非常新穎。如何處理2個或多個集合/文檔之間的多對多關係?我們最好使用DBRefs還是嵌入?實際上我已經閱讀過MongoDB手冊,但是我沒有發現關於多對多關係的內容。我錯過了一些觀點?或者MongoDB中沒有這種關係?謝謝!MongoDB,文檔或集合之間的關係

+2

這是一個很常見的問題,谷歌搜索一點點就會讓你的閱讀300個鏈接至少;比任何人都可以提供一個答案。你如何關聯太依賴於你的數據和訪問模式,因爲這個問題在當前語境中太模糊了 – Sammaye

+0

你是對的,許多關係都沒有被mongodb文檔所觸及。如果你在關係模型中有這樣的關係,那麼當使用非關係數據庫時它可能會發生相當大的變化。爲了獲得幫助,你必須解釋你的模型。 – citykid

+0

http://stackoverflow.com/questions/9475286/how-to-convert-many-to-many-relation-form-sql-to-mongodb-colllection – citykid

回答

3

嵌入與參考

這是嵌入與引用的問題,和它的混亂的MongoDB的新用戶的公共源。有一個簡單的經驗法則適用於大多數架構設計方案:嵌入時,子對象總是出現在父對象的上下文中。否則,將子對象存儲在單獨的集合中。

嵌入或引用它取決於應用程序。假設您正在MongoDB中構建一個存儲博客文章和評論的簡單應用程序。如果評論總是出現在博客文章中,並且他們不需要以任意方式進行排序(按發佈日期,評論排名等上),然後嵌入很好。但是,如果您希望能夠顯示最近的評論,無論他們出現在哪個帖子上,那麼您都需要參考。嵌入可能會帶來輕微的性能優勢,但引用更加靈活。

許多一對多

在RDBMS中,你可以使用一個連接表來表示許多一對多的關係;在MongoDB中,你使用數組鍵。例如,每個產品都包含一個類別ID的數組,產品和類別都有自己的集合。如果你有兩個簡單的類文件

{ _id: ObjectId("4d6574baa6b804ea563c132a"), 
title: "Epiphytes" 
} 

{ _id: ObjectId("4d6574baa6b804ea563c459d"), 
title: "Greenhouse flowers" 
} 

則屬於這兩類產品將是這樣的:

{ _id: ObjectId("4d6574baa6b804ea563ca982"), 
name: "Dragon Orchid", 
category_ids: [ ObjectId("4d6574baa6b804ea563c132a"), 
ObjectId("4d6574baa6b804ea563c459d") ] 
}