今天来介绍把树形结构存入数据库的第二种方法——路径枚举法。数据库
仍是借用上一篇的栗子,为了方便你们查阅,我把图又原样搬过来了。spa
须要回答的问题依旧是这样几个:code
1.查询小天的直接上司。blog
2.查询老宋管理下的直属员工。字符串
3.查询小天的全部上司。字符串处理
4.查询老王管理的全部员工。it
方案2、 Path Enumeration 路径枚举法,记录下根节点到每一个子节点的路径。io
先建立表:class
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值设置的越大,浪费的空间就越多。
至此,本篇介绍完毕,以后还会介绍其余方法,欢迎你们继续关注!