左右值编码树型数据库设计

以下内容是我整理的笔记

一、定义

基于树型结构的前序遍历方法,给每一个节点赋予“左值”和“右值”,实现树型结构的快速查询。

举例,以下是一个食品树型族谱的例子:

 

接下来进行按照下图箭头进行前序遍历:

 

每个节点的左边的值就是“左值”,在这我们用Lft表示,右边的值就是“右值”,在这用Rgt表示,然后构建表:

 

二、适用场景

这种编码方式适合用于快速查询节点所在的层级和某一节点的子孙节点,快速得到图谱,实现无限树,比如

1.查询它的子孙节点,以Fruit为例:

SELECT* FROM Tree WHERE Lft BETWEEN 2 AND 11 ORDER BY Lft ASC。

查询结果如下:

 

2.查询某一节点所在的层级:

思路是查询所有“左值”小于这个节点左值并且“右值”大于这个节点右值的点,然后统计数量,这个数量值就是该节点所在层级。

三、缺点

1.其他查询之外的场景比如对表进行增删,这个方法就存在很大风险,比如一旦新增或删除一个节点,左值或右值小于这个节点右值的节点都要随之更改。目前还没发现很好的解决方法。

2.难以快速得到某一节点的上级(或下级),以这个设计方式,只能拿到上一(或下一)层级所有节点之后再进行筛选,不过这个有方法可以解决,就是将传统的继承型设计和左右值设计结合起来:

 

其实就是在每一行中加入父级节点id。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值