無論你要構建自己的論壇,在你的網站上發布消息還是書寫自己的CMS程序,你都會遇到要在數據庫中存儲層次數據的情況。同時,除非你使用一種像XML的數據庫,否則關系數據庫中的表都不是層次結構的,他們只是一個平坦的列表。所以你必須找到一種把層次數據庫轉化的方法。
存儲樹形結構是一個很常見的問題,他有好幾種解決方案。主要有兩種方法:鄰接列表模型和改進前序遍歷樹算法
在本文中,我們將探討這兩種保存層次數據的方法。我將舉一個在線食品店樹形圖的例子。這個食品店通過類別、顏色和品種來組織食品。樹形圖如下:
本文包含了一些代碼的例子來演示如何保存和獲取數據。我選擇PHP來寫例子,因為我常用這個語言,而且很多人也都使用或者知道這個語言。你可以很方便地把它們翻譯成你自己用的語言。
鄰接列表模型(The Adjacency List Model)
我們要嘗試的第一個——也是最優美的——方法稱為“鄰接列表模型”或稱為“遞歸方法”。它是一個很優雅的方法因為你只需要一個簡單的方法來在你的樹中進行迭代。在我們的食品店中,鄰接列表的表格如下:
如你所見,對每個節點保存一個“父”節點。我們可以看到“Pear”是“Green”的一個子節點,而後者又是“Fruit”的子節點,如此類推。 根節點,“Food”,則他的父節點沒有值。為了簡單,我只用了“title”值來標識每個節點。當然,在實際的數據庫中,你要使用數字的ID。