在數據庫中存儲樹形結構的數據,這是一個很是廣泛的需求,典型的好比論壇系統的版塊關係。在傳統的關係型數據庫中,就已經產生了各類解決方案。sql
此文以存儲樹形結構數據爲需求,分別描述了利用關係型數據庫和文檔型數據庫做爲存儲的幾種設計模式。數據庫
id | name | parent_id |
1 | A | NULL |
2 | B | 1 |
3 | C | 1 |
4 | D | 2 |
上圖表示了傳統的設計方法之一,就是將樹形結構的每個結點做爲關係型數據庫中的一行進行存儲,每個結點保存一個其父結點的指針。設計模式
id | name | parent_id | left | right |
1 | A | NULL | 1 | 8 |
2 | B | 1 | 2 | 5 |
3 | C | 1 | 6 | 7 |
4 | D | 2 | 3 | 4 |
上圖在模式1的基礎上多了兩列,left和right,至關於btree中的左右分支,分別存儲了左右分支結點的最大值和最小值。併發
{ "name": "A", "children": [ {"name": "B", "children": [{"name": "D"}]}, {"name": "C"} ] }
將整個樹結構存成一個文檔,文檔結構既樹型結構,簡明易懂。less
{"_id": "A", "children": ["B", "C"]} {"_id": "B", "children": ["D"]} {"_id": "C"} {"_id": "D"}
將每一個結點的全部子結點存起來nosql
{ "leaf": "A", "children": [ {"leaf": "B", "children": [{"leaf": "D"}] }, {"leaf": "C"} ] } {"_id": "A", ...} {"_id": "B", ...} {"_id": "C", ...} {"_id": "D", ...}
充分利用文檔型存儲schema-less的優勢,先利用上面C方案存存儲一個大的樹形文檔,再將每個結點的其餘信息單獨存儲。數據庫設計