2011-10-02 49 views
4

我剛開始學習關於nosql數據庫,特別是MongoDB(沒有具體的MongoDB原因)。我瀏覽一些教程網站,但仍然無法弄清楚,它是如何處理兩個文件之間的關係/實體MongoDB - 如何處理關係

比方說,例如: 1.一個員工工作在一個部門 2.一名僱員在許多部門工作

我不知道術語'關係'對mongodb是否合理。

有人可以請您給一些關於連接,關係。

+0

您正在使用哪種語言? – Tilo

回答

7

答案很簡單:用「NoSQL的」你不會那樣做。

,你會怎麼做,而不是連接或關係添加部門用戶在用戶對象是什麼。

您還可以將用戶添加到一個字段中的「部門」的對象,如果你需要看用戶從那個方向。

這樣規格化數據處於「nosql的」數據庫典型。

見這個非常密切相關的問題:How do I perform the SQL Join equivalent in MongoDB?

1
一般

,要在非規範化的集合(=表)數據。您的集合應該進行優化,以便您不需要進行連接(NoSQL中無法進行連接)。

在MongoDB中您可以參考其他收藏品(=表格),或者你可以將它們嵌入到對方 - 無論更有意義,在您的域名。有大小限制的集合中的條目,所以你不能只是嵌入大英百科全書;-)

如果你看API文檔和示例供你選擇的編程語言,這也可能是最好的。 對於Ruby,我建議使用Mondoid庫:http://mongoid.org/docs/relations.html

1

在某些情況下,您希望/需要將文檔分開,在這種情況下,您將從一個對象中獲取_id並將其作爲值添加在你的另一個物體中。例如:

db.authors { _id:的ObjectId(21EC2020-3AEA-1069-A2DD-08002B30309D) 名: '喬治RR馬丁' }

db.books { 名:」與龍 的AuthorID的狂舞:物件(21EC2020-3AEA-1069-A2DD-08002B30309D) }

沒有從作者的圖書和作者它就是_id的副本之間的官方關係到圖書的AuthorID值。

希望有所幫助。

+0

但是,如何決定何時選擇一個id或何時構建嵌套文檔? – tester

+0

這一切都取決於您的數據。一些最佳實踐包括:不要有不斷增長的子文檔,因爲它們會減慢系統速度並可能導致長期問題。如果子文檔中的數據對其他文檔通用,並且可能會頻繁更改,那麼爲該數據提供單一來源是很好的。我嘗試檢查如何獲取數據。有時在列出文檔時,存儲ID和常用數據(如名稱)非常方便。再次,這一切都取決於你需要做些什麼。 – SomethingOn

1

一般來說,如果你決定學習NoSQL數據庫你應該遵循「的NoSql方式」,即學習超越運動和行動的原則來設計,而不是簡單地嘗試RDBMS映射到你的第一個項目的NoSql。

簡單地說 - 你應該學習如何嵌入和非規範化數據(如上面提到的Will),而不是簡單地複製id來模擬外鍵。

如果你這樣做「foreign _id way」,下一步是搜索事務以確保兩個「行」被一致地插入/更新。 Oracle/MySql等待之後的幾個步驟。 :)