使用Modified Preorder Tree簡直是必須的。
網(wǎng)上可以搜一下modified preorder tree travesal找到相關(guān)資料。參考 http://www.sitepoint.com/hierarchical...
id,本節(jié)點的primary key
parent_id,其值為父節(jié)點的primary key
key,忘了學(xué)名叫啥了,你可以稱為線索
level,表示當前節(jié)點到根節(jié)點的距離
其中,key字段的值為:從跟節(jié)點到父節(jié)點的primary key,中間用任意非數(shù)字符號分割。
例如以下樹狀結(jié)構(gòu)
├── a
│ ├── d
│ │ ├── p
│ │ ├── q
│ │ └── r
│ ├── e
│ └── f
├── b
│ ├── x
│ ├── y
│ └── z
├── c
對應(yīng)的數(shù)據(jù)庫表值為:
| id | value | parent_id | key | level |
| 1 | a | 0 | "-" | 1 |
| 2 | b | 0 | "-" | 1 |
| 3 | c | 0 | "-" | 1 |
| 4 | d | 1 | "1-" | 2 |
| 5 | e | 1 | "1-" | 2 |
| 6 | f | 1 | "1-" | 2 |
| 7 | x | 2 | "2-" | 2 |
| 8 | y | 2 | "2-" | 2 |
| 9 | z | 2 | "2-" | 2 |
| 10 | p | 4 | "1-4-" | 3 |
| 11 | q | 4 | "1-4-" | 3 |
| 12 | r | 4 | "1-4-" | 3 |
于是,在給定一個節(jié)點d的時候,
查找d的所有子孫節(jié)點:select * from table_name where key like "${d.key}-${d.id}-%"
查找某個節(jié)點的所有子節(jié)點:select * from table_name where key like "${d.key}-${d.id}-%" and level=${d.level}+1
這個設(shè)計,結(jié)構(gòu)非常簡單。key和level是輔助字段,維護這兩個字段成本很低,即使全部重建要比MPT簡單多了。