当前位置:  开发笔记 > 前端 > 正文

处理数据库中的层次结构数据

如何解决《处理数据库中的层次结构数据》经验,为你挑选了2个好方法。

我很想知道处理层次结构的最佳方法(最佳实践)是关于数据库设计的.这是我通常如何处理它们的一个小例子.

节点表

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

我很想知道你可能用过的其他解决方案是什么类型的东西.根据我的经验,层次结构可能非常繁琐,任何优化检索的方法都非常重要.



1> n8wrl..:

有一些特定于供应商的扩展可以做到这一点,但我最喜欢的db-neutral方式来自Joe Celko - 谷歌'Joe Celko Trees and Hierarchies'或者购买这本书:链接文本

这是一个非常聪明的基于集合的方式.易于查询层次结构.我添加了'parentID'字段,因为我问了'直接孩子'和'父母'问题,并加快了这些问题.但这是一种获得'祖先'或'descdent'查询的好方法.



2> MarkusQ..:

您可能还想查看"嵌套集"模式:

http://www.intelligententerprise.com/001020/celko.jhtml(Broken Link)

或者你可以谷歌更多.

PS:诅咒,n8wrl,你输的比我快!

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有