2011-11-16 51 views
1

使用其他關係數據庫中,表是這樣的:表設計爲樹狀數據

{ 
    ID : 1, 
    Name : "root", 
    Children : [ 
     { 
     ID : 2 
     Name : "a", 
     Children : [ ... ] 
     }, 
     { 
     ID : 3 
     Name : "b", 
     Children : [ ... ] 
     } 
    ] 
} 

ID  Name   ParentID 
1   root   NULL 
2   a    1 
3   b    1 
4   aa    2 
5   aaa   4 

同時使用蒙戈DB,將它,如果我們設計這樣的文檔更容易

,這樣該文檔只包含一條記錄。如果水平過高,會不會帶來一些麻煩?在這個設計中,我怎樣才能快速找到一件物品?這種設計的優點是什麼?

回答

2

如果將模式上面去,你將有與具有嵌套層次元素> 1.您可以更新對嵌套像這樣的1級任何文件的原子更新的煩惱:

db.items.update({_id: 1, Children.ID: 2 }, {Children.$.Name: "b"},false,false); 

但對於嵌套級別= 2你不能這樣做,因爲位置運算符現在不支持它(但它將在未來我猜)。

你肯定可以隨時更新整個文檔,但它會導致併發問題。

還有另一種模式的方法來避免這種情況:

{ 
    _id : 1, 
    Name : "root", 
    ParentId: null 
}, 
{ 
    _id : 2, 
    Name : "nested", 
    ParentId: 1 
} 

通過上面的模式,你可以輕鬆更新樹中的任何元素,但你需要在客戶端建立樹。 您的架構在原子更新方面存在問題,但工作速度會更快,因爲您不需要在客戶端構建樹,並且由於嵌入通常更快+可以輕鬆完成分頁。我的模式更新更靈活,但對於讀取不太好。選擇什麼取決於某些情況。