前一篇文章介紹了比較簡單的鄰接列表模式,物化路徑其實更加容易理解,其實就是在建立節點時,將節點的完整路徑進行記錄。以下圖為例:
按照Path Enumeration 進行儲存後的結果如下:
此種方案藉助了unix檔案目錄的思想,主要時以空間換時間。
查詢某一節點下的所有子節點:(以Fruit為例)
1 2 |
SET @path = (SELECT path FROM pathTree WHERE node_name = 'Fruit'); SELECT * FROM pathTree WHERE path like CONCAT(@path,'/%'); |
如何查詢直屬子節點?需要採用MySQL的正規表示式查詢:
1 2 |
SET @path = (SELECT path FROM pathTree WHERE node_name = 'Fruit'); SELECT * FROM pathTree WHERE path REGEXP CONCAT(@path,'/','[0-9]$'); |
查詢任意節點的所有上級:(以Yellow為例):
1 2 |
SET @path = (SELECT path FROM pathTree WHERE node_name = 'Yellow'); SELECT * FROM pathTree WHERE @path LIKE CONCAT(path, '%') AND path <> @path; |
插入新增資料:
1 2 |
SET @parent_path = ( SELECT path FROM pathTree WHERE node_name = 'Fruit'); INSERT INTO pathtree (path,node_name) VALUES (CONCAT(@parent_path,'/',LAST_INSERT_ID()+1),'White') |
此方案的缺點是樹的層級太深有可能會超過PATH欄位的長度,所以其能支援的最大深度並非無限的。
如果層級數量是確定的,可以再將所有的列都展開,如下圖,比較試用於類似行政區劃、生物分類法(界、門、綱、目、科、屬、種)這些層級確定的內容。
參考文章:
- https://communities.bmc.com/docs/DOC-9902