zoukankan      html  css  js  c++  java
  • 【MySQL疑难杂症】如何将树形结构存储在数据库中(方案二 Path Enumeration)

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

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

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

      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值设置的越大,浪费的空间就越多。

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

  • 相关阅读:
    内置系统账户:Local system/Network service/Local Service 区别
    python-基于文件导入的特性的单例模式
    php原因 nginx报错[error] 10773#0: *272212065 recv() failed (104: Connection reset by peer) while reading response header from upstream
    实用Django ORM实用操作方法
    session是什么和cookie的区别?
    Python可迭代对象,迭代器,生成器
    浅析python中的GIL锁和协程
    git 常用
    testlink安装
    redmine搭建
  • 原文地址:https://www.cnblogs.com/mfrank/p/8010973.html
Copyright © 2011-2022 走看看