一个遍历树节点的巧妙设计,同事看了赞不绝口

1,522 阅读2分钟

写在前面

疫情期间,无法正常复工,而作为程序员的我们可以远程办公,此时工作效率就变得格外重要,因为家里没人监督,用巧妙的方法实现了需求,剩下的时间就可以学习(摸鱼)了=。=

故事背景

表和数据结构如下

表现如图

特点:典型的树形结构,层级数不确定(子节点依旧可以添加子节点,可以无限衍生)

需求

查询一个节点的所有子节点

例如:我们查询“四川”这个节点,需要得到的结果为(“成都”,“小吃街1”,“小吃街2”,“广安”)4个结果集

猜想

遇到这个需求以后,最容易想到的办法大概有这么两个:

  • 业务代码实现递归查询,直到查到的结果集都为子节点为止,将所有查询的结果放在集合里放回。(层级关系多了后,执行效率不敢看)
  • 写存储过程解决(百度到的方式,怎么实现我自己也没看明白..)

这两种方式无论是时间复杂度还是业务实现难度都不是我这种懒人能够接受的。。

一个大胆的想法

既然查询的是所有的子节点,那么从根节点到结果集的子节点的路径一定是有一段是相等的。

  • 能不能拓展一个字段,记录从根节点到该节点的路径呢

如图所示:我们在新增的时候记录一下路径

path = 父path + pid (精华所在,细细品味)

接下来就很容易了:查询四川的所有子节点:

  • 根节点到达四川的路径a为(1-32)
  • select * from table where path like "1-32%" 一句话搞定

查询的like前缀还能匹配索引,你说美不美。

什么,你不理解为什么能匹配索引?
这里安利一下我的另一篇文章

如果对你的思路有启发,点个赞再走吧~