sql – 处理数据库中的层次结构数据
发布时间:2020-05-24 14:03:08 所属栏目: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的书包含了几个我认为的,而不仅仅是他认为是“最好的”).您的最终决定有望考虑到您自己的特定需求.对其进行建模的一些不同方法对于写入密集型操作更好,而对于频繁或快速读取层次结构的其他方式更好.请记住您的系统将使用它做什么.(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
