2010-10-09 60 views
8

我試圖與PHP的分級列表和SQLite表的設置是這樣的:創建列表樹使用SQLite

| itemid | parentid | name | 
    ----------------------------------------- 
    | 1  | null  | Item1 | 
    | 2  | null  | Item2 | 
    | 3  | 1   | Item3 | 
    | 4  | 1   | Item4 | 
    | 5  | 2   | Item5 | 
    | 6  | 5   | Item6 | 

名單將與無序列表建成並允許這種類型的樹結構:

Item1 
    |_Item3 
    |_Item4 
Item2 
    |_Item5 
     |_Item6 

我已經看到了這個與目錄和平面陣列工作要做,但我似乎無法作出正確選擇這種結構沒有深度限制工作。

+0

出了什麼問題? – Anon 2010-10-09 21:41:11

回答

13

您正在使用教科書設計在SQL數據庫中存儲分層數據。這種設計被稱爲鄰接表,即層次結構中的每個節點具有到其直接父節點的外部關鍵字parentid

使用這種設計,您不能像您描述的那樣生成樹並支持樹的任意深度。你已經知道了這一點。

大多數其他SQL數據庫(PostgreSQL,Microsoft,Oracle,IBM DB2)都支持遞歸查詢,這可以解決這個問題。但SQLite和MySQL不支持SQL的這個功能。

因此,您需要另一種解決方案來存儲層次結構。有幾種解決方案。有關說明和示例,請參閱我的演示文稿Models for Hierarchical Data with PHP and MySQL

我通常更喜歡我稱之爲閉合表的設計,但每個設計都有其優缺點。哪一個最適合您的項目取決於您需要對數據進行哪些有效的查詢。所以你應該去研究解決方案併爲自己選擇一個。

+0

謝謝你的信息。正是我需要的。 – syllabic 2010-10-10 00:44:34