2017-04-07 56 views
0

假設我需要將經理/員工關係存儲在mongoDB數據庫中,並且爲了舉例說明可以說這些是兩個不同的集合。我一般儘量通過構造文件/ DB這樣來顯示這種關係:用於存儲子關係的MongoDB體系結構最佳實踐?

經理收集文件:

{ 
    id: 1, 
    name: "Bill Smith" 
} 

員工託收:

{ 
    id: 1, 
    name: "Abe Smith", 
    managerId: 1 
}, 
{ 
    id: 2, 
    name: "Hank Smith", 
    managerId: 1 
} 

但我經常看到有人存儲這種關係通過這種方式:

方法#2

經理收集文件:

{ 
    id: 1, 
    name: "Bill Smith", 
    employees: [1, 2] 
} 

員工託收:

{ 
    id: 1, 
    name: "Abe Smith" 
}, 
{ 
    id: 2, 
    name: "Hank Smith" 
} 

的缺點,我用第二種方法看到的是employees陣列可以不同步的,如果一個員工從刪除它是集合,但不是數組。

我很好奇,如果任何人都可以指出兩種不同方法的優缺點,並且一般認爲是在MongoDB中存儲像這樣的子關係的最佳實踐嗎?

+2

第一種方法中的同樣缺點,如果管理器被刪除。如果您使用任何類型的ODM(更新整個文檔),則第二種方法可能不太方便。使用併發更新時,可能會丟失employees數組中的一些元素。沒有$ push/$ pull更新的問題。另外第一種方法對於$ lookup聚合更簡單。如果一個人有很多管理者,第二種方法似乎很好。作爲一個經驗法則,模式應該支持查詢,而不僅僅反映關係,這與SQL方法略有不同。 –

+0

關於模式應該支持查詢的真正好點不僅僅是反映關係。 –

回答

0

有一本關於mongoDB最佳實踐的好書。 你可以閱讀這本書,並得到最好的想法。

書名:50提示和技巧MongoDB的開發通過 克里斯蒂娜·喬多羅

爲註釋,選擇方法#2是密切相關的員工數組的大小,你多久修改這個字段?如何在員工中搜索?和更多的過濾器。

我推薦方法#1,每個員工都用簡單的數據類型直接引用他/她的經理。字符串/對象與數組

相關問題