我不認爲這裏需要遞歸,因爲barry-brown發佈的解決方案似乎足夠了。如果你需要一個組來成爲一個組的成員,那麼Dems提供的樹遍歷方法就可以很好地工作。這種方案的插入,刪除和更新非常簡單,只需一次選擇即可完成檢索整個層次結構。
我建議在你的group_members表中包含一個parent_id字段(假設這是發生遞歸關係的點)。在導航編輯,我已經創建了一個節點的表像這樣:
tbl_nodes
----------
node_id
parent_id
left
right
level
...
我的編輯從C#節點類創建分層相關對象
class node {
public int NodeID { get; set; }
public Node Parent { get; set; }
public int Left { get; set; }
public int Right { get; set; }
public Dictionary<int,Node> Nodes { get; set; }
public int Level {
get {
return (Parent!=null) ? Parent.Level+1 : 1;
}
}
}
節點屬性包含子節點的列表。當業務層加載層次結構時,它會糾正父/子關係。當導航編輯器保存時,我遞歸設置左右屬性值,然後保存到數據庫。這讓我能夠以正確的順序獲取數據,這意味着我可以在檢索過程中設置父/子引用,而不必進行第二次傳遞。也意味着需要顯示層次結構的其他任何內容(例如報表)都可以輕鬆地按照正確的順序獲取節點列表。
如果沒有PARENT_ID場,你可以檢索瀏覽路徑當前節點與
select n1.*
from nodes n1, nodes n2
where d1.lft <= d2.lft and d1.rgt >= d2.rgt
and d2.id = @id
order by lft;
其中@id是你感興趣的節點的ID。
很明顯的東西,真的,但它適用於可能不明顯的嵌套組成員資格等項目,正如其他人所說的那樣消除了減慢遞歸SQL的速度。
您能否定義一個實體以及它的關係? – Brettski 2009-08-24 16:04:56
你在使用什麼數據庫引擎? – 2009-08-24 16:53:54
實體只是用戶和組之間的共同抽象,那麼成員可以是組或用戶。我正在使用PostgreSQL – 2009-08-24 17:54:33