以下内容是我整理的笔记
一、定义
基于树型结构的前序遍历方法,给每一个节点赋予“左值”和“右值”,实现树型结构的快速查询。
举例,以下是一个食品树型族谱的例子:
接下来进行按照下图箭头进行前序遍历:
每个节点的左边的值就是“左值”,在这我们用Lft表示,右边的值就是“右值”,在这用Rgt表示,然后构建表:
二、适用场景
这种编码方式适合用于快速查询节点所在的层级和某一节点的子孙节点,快速得到图谱,实现无限树,比如
1.查询它的子孙节点,以Fruit为例:
SELECT* FROM Tree WHERE Lft BETWEEN 2 AND 11 ORDER BY Lft ASC。
查询结果如下:
2.查询某一节点所在的层级:
思路是查询所有“左值”小于这个节点左值并且“右值”大于这个节点右值的点,然后统计数量,这个数量值就是该节点所在层级。
三、缺点
1.其他查询之外的场景比如对表进行增删,这个方法就存在很大风险,比如一旦新增或删除一个节点,左值或右值小于这个节点右值的节点都要随之更改。目前还没发现很好的解决方法。
2.难以快速得到某一节点的上级(或下级),以这个设计方式,只能拿到上一(或下一)层级所有节点之后再进行筛选,不过这个有方法可以解决,就是将传统的继承型设计和左右值设计结合起来:
其实就是在每一行中加入父级节点id。