一种避免递归查询的树状数据表设计与实现 - 行业动态 -

当前位置:首页  >  行业动态  > 正文

一种避免递归查询的树状数据表设计与实现

一种避免递归查询的树状数据表设计与实现
2023-03-14 21:59:09 来源:腾讯云

通常树形结构的存储,是在子节点上存储父节点的编号来确定各节点的父子关系,例如这样的组织结构:


(资料图片仅供参考)

与之对应的表数据(department):

部门表结构(department)

id部门编号name部门名称level所在树层级parent_id上级部门编号

问题来了

这样的方式很不错,可以很直观的体现各个节点之间的关系,通常可以满足大多数需求。但是当业务需求变得多了,数据量庞大了,这样的方式就不再适合用于生产。

例如:PM加了以下需求:

查出指定部门下所有子孙部门查询子孙部门总数判断节点是否叶子节点

查出所有子孙部门

使用指定部门编号,一层一层使用递归往下查,可能是多数人会想到的方法。尽管在mysql8.0支持了 cte(公共表表达式),递归效率比传统递归方式有明显提升,但是查询效率仍会随着部门树层级深度的提高而变差。

另外一种方法,一次性查出所有数据,放入内存中处理(数据量少时,可以选用。数据量多,不怕挨打的人也可以选这种)~

查询子孙部门总数

递归查询每一层的数量,最后相加。

判断是否叶子节点

方法1:可以加字段isLeaf的方式,来表示这个节点是否是叶子节点。

方法2:直接通过查询parent_id=当前id的count是否大于0,大于0表示不是叶子节点,等于0表示为叶子节点。

在日常中,可能会经常使用上述类似方法去解决类似的问题,但我觉得这样的方法在效率上不是最优解。于是乎开始查找更好的方案去解决这些问题。

| 要不试试这个方法?

直到后面查到国外一博客中,见到了所谓的《改进后的先序树遍历》文章(天哪,竟然是一篇2003年发表的文章)~

他具体是怎么做的呢?

还是回到刚刚的组织架构

我们从根节点开始,给董事长左值设为1,下级部门总经理左值设为2,以此类推地沿着边缘开始遍历,给每个节点加上左值,遇到叶子节点处给节点加上右值,再继续向上沿着边缘继续遍历,遍历结束回到根节点右侧,你将得到类似这样的结构。

遍历完后每一个节点都有与之对应的左右值。这个时候可以去除parent_id字段,添加lft,rgt,来存储左右值。

数据和结构准备完毕,我们来试试操作解决上面的需求~

查出所有子孙部门

根据当前表结构的规律,可以发现,要想查出所有子孙部门,只要查左值在 被查寻部门的左\右数之间的节点,查出来都是他的子节点。例如:查询行政总监的所有子部门,行政总监的左右数是9和18,因此只需要用9和18做lft字段的between查询,查询出的结果就是【被查部门本身数据和所有子孙部门】;

SET@lft:=9;SET@rgt:=18;SELECT*FROMdepartmentWHERElftBETWEEN@lftAND@rgtORDERBYlftASC;/*例子中用BETWEEN将被查部门本身也查了出来。实际中可以用大于小于*/完美~

查询子孙部门总数

到这里可能会说,需求1都解决了,查总数自然也就解决了,直接上select count就可以了,确实没有错,但是没有那个必要,因为有个简单公式可以直接计算。

公式:总数 = (右值 - 左值 - 1) / 2

例如:

行政总监的子孙部门数=(18-9-1)/2=4董事长的子孙部门数=(20-1-1)/2=9会计的子部门数=(14-13-1)/2=0可以数数看,确实没错哦~

判断是否叶子节点

通过有了上述计算公式算总数的经验后,现在判断是否叶子节点,有的小伙伴已经知道了怎么做,那就是:

右值 - 1 == 左值那他就是叶子节点,或者左值 + 1 == 右值那他就是叶子节点,反之则不是叶子节点。

例如:

设计部,5 - 1 == 4,因此他是叶子节点。

董事长,20 - 1 != 1,因此他不是叶子节点。

至此已经完美的解决了上述需求问题,接下来再尝试一下业务的基本操作。

其他基本操作

新增部门

当新增一个部门时,需要对新增节点位置的后续边缘进行加2操作,因为每一个节点有左右两个数值。这个操作通常需要放到事务中进行处理。例如:在研发部门下添加一个新部门:

对应sql:

SET@lft:=7;/*新部门的左值*/SET@rgt:=8;/*新部门的左值*/SET@level:=5;/*新部门的层级*/begin;/*将插入的后续边缘的节点左右数+2*/UPDATEdepartmentSETlft=lft+2WHERElft>@lft;UPDATEdepartmentSETrgt=rgt+2WHERErgt>=@lft;/*插入数据*/INSERTINTOdepartment(name,lft,rgt,level)VALUES("新部门",@lft,@rgt,level);/*新增影响行数为0时,必须回滚*/commit;/*rollback;*/

删除部门

删除部门与新增部门类似,不同的是需要对删除节点的后续边缘节点减2操作。例如:删除刚刚添加的新部门:

对应sql

SET@lft:=7;/*要删除的节点左值*/SET@rgt:=8;/*要删除的节点右值*/begin;UPDATEdepartmentSETlft=lft-2WHERElft>@lft;UPDATEdepartmentSETrgt=rgt-2WHERErgt>@lft;/*删除节点*/DELETEFROMdepartmentWHERElft=@lftANDrgt=@rgt;/*删除影响行数为0时,必须回滚*/commit;/*rollback*/

查询直接子部门

查询某部门的直接子部门(即不包含孙子部门),例如:查询总经理下的直接子部门。正常需要返回产品部和行政总监

对应的sql

SET@level:=2;/*总经理的level*/SET@lft:=2;/*总经理的左值*/SET@rgt:=19;/*总经理的右值*/SELECT*FROMdepartmentWHERElft>@lftANDrgt<@rgtANDlevel=@level+1;

查询祖链路径

查询某部门的祖链路径。例如:查询产品部的祖链路径,正常需要返回董事长,总经理

SET@lft:=3;/*产品部左值*/SET@rgt:=8;/*产品部右值*/SELECT*FROMdepartmentWHERElft<@lftANDrgt>@rgtORDERBYlftASC;

树形数据展示(JS示例)

letlist=[//模拟sql查出来的列表。{id:1,name:"root",lft:1,rgt:8,level:1},{id:2,name:"child",lft:2,rgt:7,level:2},{id:3,name:"grandson",lft:3,rgt:4,level:3},{id:4,name:"grandson2",lft:5,rgt:6,level:3}];letrights=[]/*类似于一个栈结构(后进先出)*/letmp={}//list.sort((a,b)=> a.lft - b.lft)//如果你在sql中没有进行排序,需要在这里给他排序。list.forEach(item=>{if(rights.length>0){while(rights[rights.length-1]{let_tree=[];_list.forEach(item=>{if(item.parent_id==parent_id){letchilds=recursive(_list,item.id)_tree.push({...item,children:childs.length>0?childs:(item.isLeaf?null:[])})}})return_tree}console.log(recursive(list))

完结

在我目前看来,这个方法的唯一缺点就是,每一次的新增或删除,操作节点的后续边缘走到的节点都要加/减2操作。

标签:

(责任编辑:news01)
世界快资讯丨杭白菊的保质期是多少?

世界快资讯丨杭白菊的保质期是多少?

成品杭白菊盒装保质期一般为18个月;塑料包装常温下保质期一般为3个月,5℃以下保质期般为18个月。杭白...
03-08 06:50:06
关于成年人的世界句子

关于成年人的世界句子

1、人就是那么奇怪,有时候刚准备自觉去做某件事,突然有人催你去做,瞬间就不想做了。2、脸皮才是人身...
03-08 06:30:14
癌胚抗原是什么意思5.6正常吗_癌胚抗原是什么意思 看热讯

癌胚抗原是什么意思5.6正常吗_癌胚抗原是什么意思 看热讯

1、病情分析:癌胚抗原(CEA)是临床常用的肿瘤标志物。2、它实际上是一种酸性糖蛋白,具有人类胚胎抗原的...
03-08 02:08:15
俞天任 当前热门

俞天任 当前热门

1、俞天任(1963—),笔名“冰冷雨天”,腾讯《大家》专栏作家,自称“老冰”。2、著有《冰眼看日本》...
03-07 22:47:41
六代CR-V第三种动力车型即将开卖!e:PHEV版本1升油可跑62.1公里 当前快看

六代CR-V第三种动力车型即将开卖!e:PHEV版本1升油可跑62.1公里 当前快看

在去年7月首度在北美登场的大改款六代CR-V,不但有着更粗犷的外观设计以及科技感更强的内装设计,全面放...
03-07 21:48:37
焦点热讯:坏蛋是怎样炼成的电影剧情

焦点热讯:坏蛋是怎样炼成的电影剧情

1、王贲(陈立饰)是亿万富豪之子,性情狂傲、放荡不羁;严倩(田甜饰)性格开朗,在遭遇一些事之后,性...
03-07 19:32:37
天天新消息丨转变执法理念 提升办案质量 昆明市西山区进一步增强侦查监督协作与配合

天天新消息丨转变执法理念 提升办案质量 昆明市西山区进一步增强侦查监督协作与配合

转变执法理念提升办案质量昆明市西山区进一步增强侦查监督协作与配合
03-07 19:01:42
辽宁最低工资标准2023年是多少 2023年辽宁最低工资标准一览

辽宁最低工资标准2023年是多少 2023年辽宁最低工资标准一览

辽宁月最低工资标准:一档标准为1910元,二档标准为1710元,三档标准为1580元,四档标准为1420元;小时...
03-07 17:03:29
天天热文:库尔勒商业银行

天天热文:库尔勒商业银行

1、库尔勒银行,原名库尔勒市城市信用社。2、2008年12月,库尔勒市城市信用社改建库尔勒市商业银行。3、...
03-07 16:16:56
刚刚,又热出新纪录了!太子湾的郁金香开了一丢丢,盛花期还要再耐心等等

刚刚,又热出新纪录了!太子湾的郁金香开了一丢丢,盛花期还要再耐心等等

刚刚,又热出新纪录了!太子湾的郁金香开了一丢丢,盛花期还要再耐心等等
03-07 15:20:08
陕西省渭南市_全球热推荐

陕西省渭南市_全球热推荐

1、渭南,陕西省辖地级市,西与西安、咸阳相接,南倚秦岭与商洛为界,北靠桥山与延安、铜川接壤。2、198...
03-07 13:27:23
副业赚钱_副音轨_每日快播

副业赚钱_副音轨_每日快播

1、音轨就是你在音序器软件中看到的一条一条的平行“轨道”。2、每条音轨分别定义了该条音轨的属性,如...
03-07 13:10:22
全球要闻:欧冠赛事分析:本菲卡VS布鲁日_本菲卡有望拿下一城

全球要闻:欧冠赛事分析:本菲卡VS布鲁日_本菲卡有望拿下一城

1、本菲卡在冬窗转入了两名球员,分别为谢尔德鲁普和滕斯泰特。球队目前高居葡超榜首,还剩下11轮的情况...
03-07 10:58:44
泳衣哪个牌子好_焦点播报

泳衣哪个牌子好_焦点播报

Speedo速比涛、Arena阿瑞娜、黛安芬Ttiumph、热流Heatwave、adidasAdidas、洲克ZOKE等。泳衣最关键的是...
03-07 10:03:39
全球聚焦:U20亚洲杯国足2:0战胜沙特 拿下小组出线主动权

全球聚焦:U20亚洲杯国足2:0战胜沙特 拿下小组出线主动权

U20亚洲杯国足2:0战胜沙特拿下小组出线主动权
03-07 08:56:29
美陆战队发射试验

美陆战队发射试验

1、IAR计划。2、全称为InfantryAutomaticRifle计划。文章到此就分享结束,希望对大家有所帮助。
03-07 06:44:02
云游戏板块3月6日跌0.08%,蓝色光标领跌,主力资金净流出1.13亿元 快资讯

云游戏板块3月6日跌0.08%,蓝色光标领跌,主力资金净流出1.13亿元 快资讯

3月6日云游戏板块较上一交易日下跌0 08%,蓝色光标领跌。当日上证指数报收于3322 03,下跌0 19%。深...
03-07 05:15:18
两会好声音丨李运飞代表建议:加强基层消防力量建设 全球热推荐

两会好声音丨李运飞代表建议:加强基层消防力量建设 全球热推荐

天山网讯(记者郭玲报道)“基层治理是国家治理的基石。统筹推进乡镇(街道)和城乡社区治理,是实现国...
03-07 00:12:17
徐露露

徐露露

1、徐露露,女,青海人。2、是一名专职舞者。本文到此结束,希望对大家有所帮助。
03-06 22:54:07
【播资讯】n95的正确戴法?

【播资讯】n95的正确戴法?

戴口罩前先洗手;选择适当尺寸的N95口罩;用手捧着口罩,确保口罩能紧密覆盖口鼻和下巴;先将下端头带向...
03-06 20:51:36
金刚川简介观后感600字_金刚川简介-环球热推荐

金刚川简介观后感600字_金刚川简介-环球热推荐

2 这次战役的背景是,1953年4月,朝鲜战场形势越来越有利于我志愿军和人民军,他们在战略上越来越主动...
03-06 19:39:06
环球新资讯:平安大视野前瞻2023投资策略:资产格局“危中有机”,关注科技、绿色、安全领域

环球新资讯:平安大视野前瞻2023投资策略:资产格局“危中有机”,关注科技、绿色、安全领域

3月3日,平安私人银行全新云端沙龙《平安大视野》第一站在杭州举办,活动聚焦2023年宏观经济展望,邀请...
03-06 18:29:38
农林牧渔行业资金流入榜:北大荒、益生股份等净流入资金居前 天天时讯

农林牧渔行业资金流入榜:北大荒、益生股份等净流入资金居前 天天时讯

沪指3月6日下跌0 19%,申万所属行业中,今日上涨的有9个,涨幅居前的行业为电力设备、国防军工,涨幅为...
03-06 16:35:42
983大学是什么意思|全球观热点

983大学是什么意思|全球观热点

大家都知道我们国家大学分为985大学和211大学,最近肯定有很多小伙伴在网上见过983大学这个梗,i一些小...
03-06 16:34:01
益阳—娄底高速公路_全球快报

益阳—娄底高速公路_全球快报

1、益娄高速公路:是益娄衡高速公路的一段(湖南高速公路编号S71),是我省“五纵七横”高速公路网中京...
03-06 14:58:10
宾努亲王

宾努亲王

1、黄意,普宁洪阳古镇有个富袋村人,富袋村别名“布袋寮”。2、那里的“百里桥”北一公里的半山土丘,...
03-06 13:19:40
全球报道:磨金石教育分享|专业书籍推荐——《流浪地球电影创作手记》

全球报道:磨金石教育分享|专业书籍推荐——《流浪地球电影创作手记》

近些日子,要说叫好又叫座的电影无疑是《流浪地球2》,将故事安排在地球“流浪”之前,用一部“前传”继...
03-06 12:15:24
怎样弄网站_怎样弄网站 怎么办

怎样弄网站_怎样弄网站 怎么办

1、网站建设步骤:网站=域名+网页+虚拟主机————————————————————————————...
03-06 10:30:37
03月06日09时海南乐东疫情数据 阳了以后为什么会腰疼?应该怎么办? 热议

03月06日09时海南乐东疫情数据 阳了以后为什么会腰疼?应该怎么办? 热议

03月06日09时海南乐东疫情数据阳了以后为什么会腰疼?应该怎么办?以下为详情!一、03月06日09时乐东疫...
03-06 10:07:25
成本支撑叠加结构性因素驱动 化工板块内部现分化

成本支撑叠加结构性因素驱动 化工板块内部现分化

成本支撑叠加结构性因素驱动,化工板块内部现分化上周原油强势反弹,对于国内化工品尤其是油端品种形成...
03-06 07:49:29

为您推荐

精彩推送