2012-09-04 219 views
2

我有一個大的mysql表格與父子關係存儲在嵌套集合模型(左值和右值)。嵌套集合的深度

它可以很容易地找到給定項目的所有孩子。

現在,我該如何找到某個物品的深度。該行的

例子:

PARENT_ID,Taxon_ID,Taxon_Name,LFT,RGT

爲somerow(taxon_id)我想知道它是如何遠離根節點。

現在在這裏可能很重要的一點要注意,在我有數據結構的方式中是每個終端節點(一個沒有自己子女的節點)lft = rgt。我知道很多網上發佈的例子都有rgt = lft + 1,但我們決定不爲了簡單起見而不這樣做。

摘要: 嵌套集模型,需要找到給定節點的深度(到達根的節點的數量)。

回答

3

我想通了。

本質上,您必須查詢包含您正在查找的節點的所有節點。例如,我在看一個具有lft = rgt = 7330的節點,我想要它的深度。我只需要

Select count(*) 
from table 
where lft<7330 
AND rgt>7330 

您可能想要在使用它之前將結果加1,因爲它確實告訴您前一代的數量而不是實際的水平。但它的工作和它的速度!

0

MySQL不支持遞歸查詢。我相信PostgreSQL提供的支持有限,但效率不高並且很亂。然而,沒有理由不能以遞歸方式(即以編程方式)執行查詢來達到期望的結果。

如果「這個節點有多深?」是您需要經常回答的問題,您可以考慮調整表格的模式,以便每個節點存儲並保持其深度。然後,您可以讀取該值,而不是用尷尬的遞歸計算它。 (如果您正在洗牌,維護深度值可能會變得乏味,但假設您的寫入操作比讀取操作少得多,這是一種更有效的方法。)

+0

應該有一種非遞歸的方式來檢索節點的深度。 – SimaPro