2011-10-17 34 views
0

我需要創建表示像這樣的樹結構MySQL表:數據庫表設計爲有序樹列表

Root 
|- Chapter 1 
|  |- Chapter 1.1 
|  | |- Article 1.1.1 
|  | |- Article 1.1.2 
|  |- Article 1.2 
|  |- Chapter 1.3 
|   |- Chapter 1.3.1 
|   |  |- Article 1.3.1.1 
|   |  |- Article 1.3.1.2 
|   |- Article 1.3.2 
|   |- Article 1.3.3 
|- Chapter 2 
     |-Chapter 2.1 
     |  |- ... 
     |- Chapter 2.2 
     |- ... 

簡單地說,有兩種類型的實體:章及第二十。文章是其中沒有孩子的最小實體,而章可以包含子章節或文章作爲兒童實體。每個實體都有一個ID和一個名稱。

孩子的順序沒有設置規則,它可以是章節,然後是文章,然後是章節。

另一個挑戰是,當一章從一章重新定位到另一章時,所有的孩子也應該相應地重新定位。例如,當我將第1.3.1章移到第1.1章(因此第1.3.1章變爲第1.1.3章)時,第1.3.1.1條和第1.3.1.2條也應該移動併成爲第1.1.3.1條和第1.1.3.2。同時第1.3.2條和第1.3.3條分別成爲第1.3.1條和第1.3.2條。

所以我問的是,如何設計數據庫表以呈現這些關係?以及SQL如何添加新元素/刪除元素並重新定位元素? (我可以使用Ajax來處理重新定位交互,並使用PHP來生成這些層次結構編號)

另外,由於樹通常很長,我希望避免只更新所有元素,因爲只有一個元素重新定位。 (不確定這個願望在技術上是否可行。)

回答

0

關於在數據庫中表示樹結構的最佳信息是Joe Celko's Trees and Hierarchies in SQL for Smarties

你或許可以在網上找到足夠的信息,但是我建議你拿到這本書,我發現它在實現嵌套集合層次結構時非常有用。

您可以使用鄰接表或嵌套集合在數據庫中的樹模型,我假設如果你想成爲您使用的是鄰接表(其中每個條目有parent屬性)

能夠將整棵子樹從一個父母移動到另一個父親,然後它就像改變parent_id(或者你正在使用的任何PK)來引用新的父親一樣簡單。當移動子樹時,嵌套集模型需要對所有節點進行更改。

但是,其他操作在嵌套集上更容易,例如選擇特定父級下的所有子節點。對於鄰接列表模型來說,這可能更困難,但隨着遞歸CTE的出現,它變得更加容易。

如果您不擔心內容的順序,我會避免將章節編號與您的數據一起存儲。當您選擇數據時應用它們,然後避免在樹更改時更新每個節點。

+0

thx爲您的圖書推薦。可悲的是,我不能等這本書來解決我的問題。我會嘗試谷歌你所建議的技術。是的,章節編號將由PHP生成而不是存儲在數據庫中 – LazNiko