2009-10-20 86 views
3

我只是建立一個表來存儲分層數據使用修改預訂樹遍歷(MPTT) - 你知道一個:每個節點存儲leftright ID找到它的後代。我使用的是CakePHP建議的模型,它與標準方法不同,將parent_id包括在每一行中。MPTT表建議索引

這裏的建議表結構:

CREATE TABLE categories (
    id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    parent_id INTEGER(10) DEFAULT NULL, 
    lft INTEGER(10) DEFAULT NULL, 
    rght INTEGER(10) DEFAULT NULL, 
    name VARCHAR(255) DEFAULT '', 
    PRIMARY KEY (id) 
); 

面前從來沒有使用過這種風格,不知道究竟是如何被搜索到,我不知道哪些字段應該是我的索引?只是主鍵足夠了,還是應該包括lftrght呢?

回答

1

我一般只索引左欄。我通常使用mysql,它只允許執行計劃中每個表的一個索引用戶,而左邊的索引可以幫助我爲MPTT表編寫每個查詢,並且在該索引中包含正確的權限是最小的。簡而言之,根據我的經驗,左邊的單個索引是插入/更新速度與選擇速度之間的最佳平衡,幾乎適用於所有用例。

4

您將始終使用左欄,但我經常需要找到所有葉節點。

WHERE lft = (rgt -1) 

所以我通常只是創建一個索引與對lft,rgt。

+3

這。大多數樹的讀取量比寫入的要多得多,因此左右兩列索引(不是兩個單獨的索引)是很好的。另外,如果您要在同一個表中存儲多棵樹,例如按用戶分組,使其成爲grouping_id上的三列索引,左側,右側。 – Walf 2011-04-29 01:26:32