2012-03-14 86 views
0

在一個新項目中,我決定使用mongodb作爲主數據庫,但是由於缺乏經驗,導致我在如何構建不同集合之間的關係時出現混淆。MongoDB中的關係

在我來說,我有一個用戶收藏,一個「註釋」集合和一個組集合。註釋可以對不同的用戶和組開放。如果用戶是組的一部分,並且該組具有對該筆記的讀取權限,則用戶也是如此。如果用戶從組中移除,則他們不再有權訪問該筆記。但是,用戶可以以用戶的身份訪問筆記,即使他們從具有訪問權限的組中移除,仍可以看到筆記。希望這是有道理的。

我面對的是建立權限,以便所有這一切都是可能的問題。權限是否應該存儲在筆記集合中?如果它存儲的如下:

note: {id: xxxx, followers:[{id:user1, permission:write},{id:groupA, permission:read}]} 

然後在一個user2的是A組的一部分的情況下,我需要檢查,看看他們是否與通過其ID的節點相關聯,如果沒有,我會檢查每個可以看到該註釋並查看其成員的組,並且如果不同的組具有不同的權限,則必須獲得最高權限。這看起來效率不高。

的用戶集合看起來是這樣的:

user: {id:user1, projects:[xxxxx, xxxxx], groups:[xxxxx,xxxx...]} 

Groups集合:

group: {id:groupA, projects:[xxxxx, xxxx...], users:[user2...]} 

我打算聯同項目和用戶文件組的文件,這樣,如果組將被刪除從一個項目中,該項目將從該組中移除。這似乎是一個dbref是最好的方式來做到這一點。

我已經看過最佳實踐,我覺得我的整體結構是混亂的,但我想不出另一種方式來做到這一點。

+0

是否有一個原因,用戶可以不只是一人組? – Derick 2012-03-14 09:16:45

+0

用戶登錄後,兩個集合將會有完全不同的字段。我僅將該示例僅限於權限的相關信息。我不認爲有用戶作爲一個羣體會限制必要的,我如何設置權限,因爲我仍然會檢查每個組檢查的量。 – aelnaiem 2012-03-14 22:24:46

+0

你的查詢是什麼樣的?你是否更經常地搜索特定的筆記以查看哪些組和用戶有權訪問它,或者查找特定的組或用戶以查看哪些筆記有權訪問? – Barrie 2012-03-19 15:12:07

回答

1

根據您的要求,如果組的用戶多於用戶的組,那麼您應該考慮在用戶中存儲group_id。

您可以結合用戶和組爲一個集合,有兩個不同的模式和類似的is_group屬性,但可以想象有可能有一天會收藏級鎖和下面會給你更多的靈活性。

要弄清楚,如果用戶有權訪問你只需要查詢的項目集合,看到了組ID他們的成員是否寫入內或項目文件檢索後讀陣列。

項目:

{ 
    "_id": ObjectId, 
    "write": [group_id, group_id, ...], 
    "read": [group_id, group_id, ...] 
} 

用戶:

{ 
    "_id": ObjectId, 
    "groups": [] 
} 

組:

{ 
    "_id": ObjectId, 
}