sql – 处理数据库中的层次结构数据
发布时间:2020-12-12 06:40:05 所属栏目:MsSql教程 来源:网络整理
导读:我很想知道处理层次结构的最佳方法(最佳实践)是关于数据库设计的.这是我通常如何处理它们的一个小例子. 节点表 NodeId int PRIMARY KEYNodeParentId int NULLDisplaySeq int NOT NULLTitle nvarchar(255) 祖先表 NodeId intAncestorId intHops int 与NodeId上
我很想知道处理层次结构的最佳方法(最佳实践)是关于数据库设计的.这是我通常如何处理它们的一个小例子.
节点表 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的书包含了几个我认为的,而不仅仅是他认为是“最好的”).您的最终决定有望考虑到您自己的特定需求.对其进行建模的一些不同方法对于写入密集型操作更好,而对于频繁或快速读取层次结构的其他方式更好.请记住您的系统将使用它做什么.(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |