继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

MFrank
关注TA
已关注
手记 103
粉丝 1.8万
获赞 2562

 

【MySQL疑难杂症】如何将树形结构存储在数据库中系列篇

如何将树形结构存储在数据库中(方案一 Adjacency List)

如何将树形结构存储在数据库中(方案二Path Enumeration)

如何将树形结构存储在数据库中(方案三 Closure Table)

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

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

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

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

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

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

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

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

先创建表:

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

然后插入数据:

图片描述

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

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,结果如下:

  图片描述

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符合规则的记录,结果如下:

  图片描述

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

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

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

  图片描述

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

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

看吧,查起来就so easy了。

 图片描述 

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

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

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

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP