在关系数据库中为层次数据选择正确的方法
许多应用程序都使用层次数据结构。 但是,将这些数据有效存储在关系数据库中会带来独特的挑战。 本文探讨了几种常见的存储方法,概述了它们的优势和缺点。
>
>邻接列表方法
列:id,parentid
-
优点:>简单实现;添加,删除和重新定位节点的有效效率。
>
-
>缺点:检索祖先,后代和路径信息在计算上很昂贵;具有许多查询的性能瓶颈的潜力(尤其是在缺乏常见表表达式的数据库中)。
嵌套集(修改的预订树遍历)
列:左,右
- 优点:有效地检索祖先和后代。
由于动态编码方案,
> > > - 插入,删除和移动节点是非常昂贵的操作。>
桥接表(带有触发器的闭合表)
列:祖先,descendantid,depth(可选)
>
>优点:
有效的祖先和后代检索;归一化编码可以改善查询优化。-
缺点:每个节点需要多行;插入,更新和删除操作具有对数时间复杂性。
- 谱系柱(物有意义的路径,路径枚举)>
列:Lineage(例如,
)
>
优点:/parent/child/grandchild/etc...
使用前缀查询有效的后代检索。
- >缺点:插入,更新和删除操作具有对数时间复杂度;依赖数组数据类型或串行字符串的非相关方法。>
>嵌套的间隔方法-
>类似于嵌套集,但使用浮点数而不是整数来降低编码的波动。
与标准嵌套集相比
平桌接近
带有添加
和
廉价的迭代和分页。
>
缺点:Level
昂贵的移动和删除操作。Rank
以上是我如何最好地将层次数据存储在关系数据库中?的详细内容。更多信息请关注PHP中文网其他相关文章!