在SQL中儲存與遍歷層次結構
在資料庫中建模和檢索層次資訊對於許多應用程式至關重要。一種流行的方法是改進的先序遍歷演算法 (MPTT)。
MPTT演算法
MPTT 在單一表中組織層次數據,每個節點有三個欄位:
-
ID: 節點的唯一識別碼。
-
Left: 節點子樹中最左側節點的索引。
-
Right: 節點子樹中最右側節點的索引。
插入樹中
要將新的子節點插入樹中,我們需要:
- 找出父節點的 Right 值。
- 將子節點的 Right 值設定為父節點的 Right 1。
- 將父節點的 Right 值設定為父節點的 Right 2。
- 將子節點的 Left 值設定為父節點的 Right - 1。
遍歷樹
MPTT 允許使用明確的 SQL 查詢輕鬆遍歷樹:
-
取得節點的所有子節點: SELECT * FROM table WHERE Left BETWEEN parent.Left AND parent.Right
-
取得節點的所有後代: SELECT * FROM table WHERE Left > parent.Left AND Right
-
取得節點的所有祖先: SELECT * FROM table WHERE Left node.Right
其他建模方法
除了 MPTT 之外,其他儲存層次結構的方法包括:
-
鄰接表模型: 使用兩個表表示層次結構,一個表包含父子關係,另一個表包含附加的節點資料。
-
圖: 將層次結構建模為由邊連接的節點,提供複雜的連接和查詢彈性。
類別庫
各種類別庫可以簡化在 PHP 和 Java 等程式語言中使用 MPTT 和其他層次資料結構:
- PEAR::Tree
- Doctrine ORM
- Hibernate
以上是MPTT演算法如何在SQL中高效率地儲存和導航分層資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!