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

前端之家收集整理的这篇文章主要介绍了sql – 处理数据库中的层次结构数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我很想知道处理层次结构的最佳方法(最佳实践)是关于数据库设计的.这是我通常如何处理它们的一个小例子.

节点表

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

我有兴趣了解您可能已经使用过的其他解决方案.根据我的经验,层次结构可能非常繁琐,任何优化检索的方法都非常重要.

解决方法

正如MarkusQ和n8wrl已经指出的那样,Joe Celko对此有一些好处.我只想补充说,有多种方法可以对层次结构进行建模(Joe的书包含了几个我认为的,而不仅仅是他认为是“最好的”).您的最终决定有望考虑到您自己的特定需求.对其进行建模的一些不同方法对于写入密集型操作更好,而对于频繁或快速读取层次结构的其他方式更好.请记住您的系统将使用它做什么.

猜你在找的MsSQL相关文章