2013-07-10 61 views
0

我是MongoDB的新手。我有一個主集合user_group。示例文檔如下所示。如何管理MongoDB中的關係?

{group_name:"xyz","previlege":["Add","Delete"],...}

其次收集user_detail

{"user_name":"pt123","group_name":"xyz",...} 

我怎樣才能保持這兩個collections.Should之間的關係我使用USER_GROUP引用到user_detail或任何其他選擇嗎?

+0

你的後端堆棧是什麼? Java的?蟒蛇?什麼庫?等 – jsalonen

+0

我的後端堆棧是java –

+0

很多好東西在這裏:http://docs.mongodb.org/manual/data-modeling/ – WiredPrairie

回答

1

簡單的回答:你沒有。
當您開始查看MongoDB時,整個設計理念會發生變化。如果我是你,我會在user_detail文檔中保留previlege字段。

{"user_name":"abc","group_name":"xyz","previlege" : ["add","delete"]} 

但是,如果您不斷更改組權限,這可能並不理想。但是這個想法是,你設計數據存儲的方式是爲了讓一個「記錄」的所有信息都可以存儲在一個對象中。

+0

我同意你,但我管理user_group,因此需要更新組經常預先安排。 –

3

通常,在MongoDB中,「關係很多」關係在關係數據庫的對面進行管理。一個MongoDB文檔通常會有一個ObjectId或組名稱的數組(或者你用來識別外部文檔的任何東西)。這與另一方通常具有「屬於」列的關係數據庫相反。

要清楚,這不是必需的。在您的示例中,如果您要創建最常見的查詢,則可以在組文檔中存儲一組用戶詳細信息ID。基本上,你應該問的問題是「我可能需要什麼查詢?」並設計你的文件來支持它。

0

作爲NoSQL的MongoDB沒有明確的連接。解決方法是可能的,但不推薦(閱讀MapReduce)。

最好的辦法是從客戶端的mongo集合中檢索這兩個文檔並應用用戶特定的權限。確保你在user_group集合中的group_name上有索引。

或者更好的是,在客戶端應用連接之後,仍然將用戶的權限[讀取,刪除等]存儲在同一文檔中。但是,那麼您無法從外部更新集合,因爲這可能會破壞不變量。每次對用戶組進行更新時,都需要在客戶端自己應用這些權限(權限)並將這些權限保存在同一文檔中。寫入可能會受到影響,但讀取速度會很快(假設有幾個字段被索引,如用戶名)。

+0

使用MR來做連接只是錯誤的...你應該做他們的客戶端 – Sammaye

+0

這就是我在第二段說的。 – bsd