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

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

时间: 2024-10-06 10:31:36

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

问卷过程_将编辑好的问卷(存储在数据库中)显示在浏览器中

首先要了解数据的设计,也就是数据室怎么存储在数据库中的. 先来看一个最简单的问卷的构成吧 可以看到大概的结构是:『标题:标题内容标题说明.题目:题目编号,题目内容.选项:选项类型,选项编号,选项内容』.提交:提交按钮.其中『』内的元素就是需要存储到数据库中的. 可以想一下:一张表示是否可以存储一张问卷呢?这应该是可以的但是一个表不应该只能存储一张问卷吧,要不然太浪费资源了. 数据库的设计应该是怎样的呢: 首先:整体的问卷基本信息要有:问卷的编号(我们通过链接把我们的问卷发给别人来填写的话,要唯一

如何使用 JDBC 调用存储在数据库中的函数或存储过程

JDBC调用存储过程步骤:1 通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例.在使用Connection对象的prepareCall()方法时,需要传入一个String类型的字符串,该字符串用于指明如何调用存储过程{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} {call <procedure-name>[(<arg1>,<a

ASP.NET中让图片以二进制的形式存储在数据库中

今早有个网友问到我这问题,以前我都是直接在数据库中存文件名的,还没有试过存储整张图片到数据库中,上网搜索了一下,自己又测试了一番,代码如下:建立保存图片的表的SQL语句: Sql代码   USE [niunantest] GO /****** 对象:  Table [dbo].[picdata]    脚本日期: 03/30/2010 14:51:58 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [d

js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; if(window.ActiveXObject) { var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '&qu

Kettle_使用资源库功能把ktr元数据统一存储到数据库中

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46117065 [目标] 利用kettle中的资源库功能,把ktr文件统一存储到数据库中,方便本地进行版本管理 ktr:使用kettle编辑的转换,被称为ktr: 转换:添加功能模块,实现ETL的项目称为转换. 一路确定后,点击ok完成资源库的创建,如下: 创建完成后,先进

数据库:MySQL实战;左链接;查询WordPress数据库中的文章内容

在1年前,我用学生价租了一个阿里云服务器(是真的便宜啊),自己在CentOS系统上用命令行搭了个WordPress的环境,开始了为期一个月使用自建博客的历程. 事实证明,博客在类似博客园这样的平台上写还是非常方便的! 不用自己优化后台,虽然WordPress已经足够傻瓜了,但是我还是太菜了 只有小贵的价格才能租到一个网速不慢+大小够用的服务器 之前考研没有工作没有收入,于是就狠下心不要了.重新捡起了长草很久的博客园. 今天,下了决心把以前的数据导出来,就有了以下的内容 1.把wordpress.

物理数据库设计 - 文件是否应该存储在数据库中

多媒体文件已经广泛应用在很多程序当中.比如用户的头像,汽车的产品图片等等. 从我个人以往的经验来看,将文件的路径存储入数据库,然后文件本身存储于硬盘当中已是万年不变的解决方案. 其实,存储图片路径与存储图片文件本身,两种方案都有很好的立足点,但是大部分程序员都是将文件存储于数据库之外.虽然,这种方法没有什么大问题,但的确是存在一定的风险的. 一.问题描述 下面就来论述一下关于将文件存储于数据库外部的缺点. 1.垃圾回收问题. 当你想删除一张图片时,你只能够删除掉数据库中的记录,图片文件是没有办法

mysql的load data,高速将文本文件,插入数据库中

1语法 LOAD DATA [ LOW_PRIORITY | CONCURRENT ] [ LOCAL ] INFILE 'file_name.txt' [ REPLACE | IGNORE ] INTO TABLE tbl_name [ FIELDS [ TERMINATED BY 'string' ] [ [OPTIONALLY] ENCLOSED BY 'char' ] [ ESCAPED BY 'char'  ] ] [ LINES [ STARTING BY 'string' ] [

Android端上传图片到后台,存储到数据库中 详细代码

首先点击头像弹出popwindow,点击相册,相机,调用手机自带的裁剪功能,然后异步任务类访问服务器,上传头像,保存到数据库中, 下面写出popwindow的代码 //设置popwindow public PopupWindow getPopWindow(View view){ PopupWindow popupWindow=new PopupWindow(view, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParam