管理SQL中的层次结构:MPTT /嵌套集与邻接列表对存储路径
|
一段时间以来,我一直在摔跤如何最好地处理SQL中的层次结构.受到邻接列表的限制和MPTT /嵌套集的复杂性的沮丧,我开始考虑简单地存储关键路径,而不是简单的node_key / node_key / …字符串.我决定编制三种技巧的利弊: 创建/删除/移动节点所需的呼叫数: >邻接= 1 获取树所需的通话次数: > Adjacency = [子级数] 获取节点/祖先路径所需的呼叫数: > Adjacency = [超级数] 获取子节点数所需的呼叫数量: > Adjacency = [子级数] 获取节点深度所需的呼叫数: > Adjacency = [超级数] 需要DB字段: > Adjacency = 1(parent) 结论 存储的路径技术在除了一个用例之外使用与其他技术相同或更少的调用.通过这种分析,存储路径是一个明显的赢家.更不用说,实现起来要简单得多,人性化等等 所以问题是,不应该将存储的路径视为比MPTT更强大的技术?为什么存储的路径不是更常用的技术,为什么不能在给定的实例中使用MPTT? 另外,如果你认为这个分析是不完整的,请让我知道. 更新: 这里至少有两件事情,MPTT可以开箱即用,存储的路径解决方案不会: >允许计算每个节点的子节点数,而不需要任何其他查询(如上所述). 解决方法您也可以考虑我在 What is the most efficient/elegant way to parse a flat table into a tree?的答案中描述的Closure Table设计创建/删除/移动节点所需的呼叫: >关闭= 1 要求获取树的通话: >关闭= 1 要获取路径到节点/祖先所需的呼叫: >关闭= 1 需要拨打电话才能获得子节点数: >关闭= 1 获取节点深度所需的呼叫: >关闭= 1 需要DB字段: > Adjancency = 1个字段/行 还有几个其他的考虑: 支持无限深度: > Adjacency = yes 支持引用完整性: > Adjacency = yes 我也在我的演讲Models for Hierarchical Data with SQL and PHP和我的书,SQL Antipatterns: Avoiding the Pitfalls of Database Programming中的封面表. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server-2008 – 何时使用非dbo模式与新数据库的决策标准
- .net – LINQ调用存储过程很慢
- sql-server – 在SQL Server中处理日期
- 如何选择和排序不在Groupy中的列按SQL语句 – Oracle
- sql-server – 如何在一个查询中连接一列内连接中多行的字符
- SQL Server sql ntext数据类型字符替换的简单示例
- mysql处理添加外键时提示error 150 问题的解决方法
- 谈谈sqlserver自定义函数与存储过程的区别
- sql-server – 在SQL Server上的聚簇索引,大表上的DELETE性
- SQL Server使用一个语句块批量插入多条记录的三种方法
