【MySQL疑难杂症】如何将树形结构存储在数据库中(方案二 Path Enumeration)

  今天来介绍把树形结构存入数据库的第二种方法——路径枚举法。

  还是借用上一篇的栗子,为了方便大家查阅,我把图又原样搬过来了。

  需要回答的问题依旧是这样几个:

  1.查询小天的直接上司。

  2.查询老宋管理下的直属员工。

  3.查询小天的所有上司。

  4.查询老王管理的所有员工。

方案二、 Path Enumeration 路径枚举法,记录下根节点到每个子节点的路径。

  先创建表:

CREATE TABLE employees2(
eid INT,
ename VARCHAR(100),
position VARCHAR(100),
path VARCHAR(200)
)

  然后插入数据:

image.png

  现在我们来回答一下之前的问题:

  1.查询小天的直接上司。

  在上一个解决方案中能轻而易举做到的事情,在这个方案中却有些麻烦了,因为需要对path字段进行字符串处理,去掉“/”+自身id才是直接上司的path值。又开始一顿骚操作:

  SELECT e1.eid,e1.ename FROM employees2 e1,employees2 e2 WHERE e2.ename = '小天' AND e1.path = REPLACE(e2.path,CONCAT('/',e2.eid),'');

  好像这个操作还不够sao,2333,结果如下:

image.png

  2.查询老宋管理下的直属员工。

  怎么查管理下的直属员工呢?那就要用模糊查询了:

  SELECT e2.eid,e2.ename FROM employees2 e1,employees2 e2 WHERE e1.ename = '老宋' AND e2.path REGEXP CONCAT(e1.path,'/[0-9]{1,}$');

  这里用了正则匹配,匹配所有path符合规则的记录,结果如下:

image.png

  3.查询小天的所有上司。

  SELECT e1.eid,e1.ename FROM employees2 e1,employees2 e2 WHERE e2.ename='小天' AND e2.path like concat(e1.path,'/%');

  这里就能体现这种存储结构的优势了。不看效率的话,还是很方便的。

image.png

  4.查询老王管理的所有员工。

  SELECT e2.eid,e2.ename FROM employees2 e1,employees2 e2 WHERE e1.ename='老王' AND e2.path like concat(e1.path,'/%');

  看吧,查起来就so easy了。

image.png

  不用像之前那样写一大段存储过程了,简单粗暴。

  小结一下,存储路径的方式在进行多级查询的时候十分方便,而在查询直接上下级的时候稍微复杂一点。还有一个很明显的缺点,那就是path的大小是指定的,所以理论上是不能进行无限层级的存储的,path值设置的越大,浪费的空间就越多。

  至此,本篇介绍完毕,之后还会介绍其他方法,欢迎大家继续关注!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

MySQL索引优化分析

为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及ex...

13310
来自专栏Java3y

数据库两大神器【索引和锁】

所以说,如果我们写select * from user where username = 'Java3y'这样没有进行任何优化的sql语句,默认会这样做:

30100
来自专栏java一日一条

MySQL 性能优化的最佳 20+ 条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的...

11630
来自专栏Linyb极客之路

MYSQL性能优化

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事...

16930
来自专栏*坤的Blog

mysql生成百万级数量测试数据

1.4K30
来自专栏java一日一条

MySQL 性能优化的最佳 20+ 条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的...

6120
来自专栏Linyb极客之路

MySQL索引优化分析

为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及ex...

23540
来自专栏禅林阆苑

mysql学习总结03 — 列属性(字段属性)

mysql中的6个列属性:null,default,comment,primary key,unique key,auto_increment

22220
来自专栏搜云库

MySql常用30种SQL查询语句优化方法

1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

463190
来自专栏Spark学习技巧

MySQL索引优化分析

16450

扫码关注云+社区

领取腾讯云代金券