2011-09-01 189 views
0

我有這樣的表AA數據庫:查詢SQLite的樹結構

tree{id,name,parent} content{id,content,parent}

tree表包含一個樹狀結構,其中,如果父母是0這是最高級別的元素,如果它是不同的,它是來自同一個表的父代的ID。

content表具有parent列,該列是來自tree表的ID。

我想要得到的是在爲內容提供ID時父母 - 子女元素的整個鏈。

我不認爲這是表格的最佳結構,我想我可以改變這一點。

請問您對此有何看法?

回答

2

首先,我建議你使用parent = NULL,而不是零,表示根節點,將允許tree會對parent外鍵它引用id;參照完整性是有用的。

然後,您可以在每行中包含從根節點到當前節點的materialized path。物化路徑將是一個字符串列,表示從根節點到當前節點的路徑;出於您的目的,您希望爲路徑中的每個節點使用固定寬度的格式,然後您可以按順序對路徑進行排序以按樹形結構排列記錄(如此answer)。

假設您認爲99999足以覆蓋您的所有節點。那麼你可能有這樣的路徑字符串:

'00001000110002300042' 

這將是該ID序列[1, 11, 23, 42]因此節點的父是42,祖父23,依此類推高達1根對整個事件從到根節點分支:搶道,將其分割成塊得到的ID,並在一次排序時物化路徑上,讓他們走出正確的順序拔出所有節點。

這種方法還可以很容易地一次提取整個子樹:只需構建符合您所需子樹的路徑前綴,然後執行path LIKE 'pfx%' ORDER BY path, id即可一次拉出整個子樹。此外,大多數數據庫將使用一個索引來表示根源於開頭的LIKE表達式(即某些XLIKE 'X%'),因此這些類型的查詢可能非常快。您還可以使用簡單的字符串長度和除法計算來計算節點的深度。

你需要做額外的工作來建立物化路徑卻並不多一點點,他們做了很多樹操作的簡單好用,同時保持樹的自然表現的優勢。

+1

物化路徑非常適合查詢 - 特別是在查詢下,但寫入速度較慢。如果樹是動態的,寫入密集型,輕量級讀取並不那麼深,然後簡單的id,父遞歸可能會更好。它高度依賴訪問模式。但往往,一個物化的路徑列好 – bryanmac

+0

@bryanmac:一切都取決於訪問模式:)我平時可和PostgreSQL合作與陣列來實現這樣的遞歸CTE的或物化路徑和觸發器通常做的伎倆。 –

+1

謝謝,畝。[額外的字符,因爲它太短] – Francisc