better_nested_set——用結構設計代替遞歸

有如下一棵樹:

root
|_ Child 1
|_ Child 1.1
|_ Child 1.2
|_ Child 2
|_ Child 2.1
|_ Child 2.2

也可以寫成以下結構:

___________________________________________________________________
| Root |
| ____________________________ ____________________________ |
| | Child 1 | | Child 2 | |
| | __________ _________ | | __________ _________ | |
| | | C 1.1 | | C 1.2 | | | | C 2.1 | | C 2.2 | | |
1 2 3_________4 5________6 7 8 9_________10 11_______12 13 14
| |___________________________| |___________________________| |
|___________________________________________________________________|

數字代表左右邊界,數據庫中表的結構爲:

id | parent_id | lft | rgt | data
1 | | 1 | 14 | root
2 | 1 | 2 | 7 | Child 1
3 | 2 | 3 | 4 | Child 1.1
4 | 2 | 5 | 6 | Child 1.2
5 | 1 | 8 | 13 | Child 2
6 | 5 | 9 | 10 | Child 2.1
7 | 5 | 11 | 12 | Child 2.2

選出一個父結點parent的所有孩子:

SELECT * FROM table_name WHERE lft > parent.lft AND lft < parent.rgt

如選出結點Child 1的所有子結點:

SELECT * FROM table_name WHERE lft > 2 AND lft < 7

結果爲:

id | parent_id | lft | rgt | data
3 | 2 | 3 | 4 | Child 1.1
4 | 2 | 5 | 6 | Child 1.2

計算一個結點的孩子的數目:

(right - left - 1)/2

選出node結點和它所有的父結點:

SELECT * FROM table_name WHERE node.lft BETWEEN lft AND rgt

如選出結點Child 1.2和它所有的父結點:

SELECT * FROM tabla_name WHERE 5 BETWEEN lft AND rgt

結果爲:

id | parent_id | lft | rgt | data
1 | | 1 | 14 | root
2 | 1 | 2 | 7 | Child 1
4 | 2 | 5 | 6 | Child 1.2

這樣比遞歸查詢要快多了。
注意:left和right是數據中的保留字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章