我很想知道处理层次结构的最佳方法(最佳实践)是关于数据库设计的.这是我通常如何处理它们的一个小例子.
节点表
NodeId int PRIMARY KEY NodeParentId int NULL DisplaySeq int NOT NULL Title nvarchar(255)
祖先表
NodeId int AncestorId int Hops int
使用NodeId上的索引,AncestorId,Hops
表格如下所示:
节点表
NodeId NodeParentId DisplaySeq Title 1 NULL 1 'Root' 2 1 1 'Child 1' 3 1 2 'Child 2' 4 2 1 'Grandchild 1' 5 2 2 'Grandchild 2'
祖先表
NodeId AncestorId Hops 1 NULL 0 1 1 0 2 1 1 2 2 0 3 1 1 3 3 0 4 1 2 4 2 1 4 4 0 5 1 2 5 2 1 5 5 0
通过这种设计,我发现使用大型层次结构,通过连接AncestorId = target NodeId的Ancestor表,可以非常快速地获得层次结构的整个部分,如:
SELECT * FROM Node n INNER JOIN Ancestor a on a.NodeId=n.NodeId WHERE a.AncestorId = @TargetNodeId
这也很容易让直接的孩子
SELECT * FROM Node n INNER JOIN Ancestor a on a.NodeId=n.NodeId WHERE a.AncestorId = @TargetNodeId AND Hops = 1
我很想知道你可能用过的其他解决方案是什么类型的东西.根据我的经验,层次结构可能非常繁琐,任何优化检索的方法都非常重要.
有一些特定于供应商的扩展可以做到这一点,但我最喜欢的db-neutral方式来自Joe Celko - 谷歌'Joe Celko Trees and Hierarchies'或者购买这本书:链接文本
这是一个非常聪明的基于集合的方式.易于查询层次结构.我添加了'parentID'字段,因为我问了'直接孩子'和'父母'问题,并加快了这些问题.但这是一种获得'祖先'或'descdent'查询的好方法.
您可能还想查看"嵌套集"模式:
http://www.intelligententerprise.com/001020/celko.jhtml(Broken Link)
或者你可以谷歌更多.
PS:诅咒,n8wrl,你输的比我快!