岳亚荣 发表于 2023-9-14 12:07:55

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

我很好奇,关于数据库设计,什么是处理层次结构的最佳方法(最佳实践)。这是我通常如何处理它们的一个小例子。
节点表
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的书包含了许多我相信的内容,而不仅仅是他认为“最好”的一种方法)。您的最终决定将希望考虑您自己的特定需求。对它进行建模的一些不同方法更适合于写密集型操作,而其他一些方法则适合于频繁或快速地上下读取层次结构。只需记住您的系统将使用它做什么。
页: [1]
查看完整版本: 处理数据库中的层次结构数据