我不认为这里需要递归,因为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