当前位置: 首页 > news >正文

MySQL怎样通过Adjacency List存储树形结构?

这篇文章主要介绍的是MySQL怎样通过Adjacency List存储树形结构,相信很多小朋友都不知道吧,没关系,小杜整理了一下并分享给大家学习,内容介绍的非常详细,且具有一定的参考价值,感兴趣的朋友不妨来看看,希望对大家有所帮助!

今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢?

想MySQL这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驶了。

举个例子:现在有一个要存储一下公司的人员结构,大致层次结构如下:
在这里插入图片描述

(画个图真不容易。。)

那么怎么存储这个结构?并且要获取以下信息:

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

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

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

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

方案一、(Adjacency List)只存储当前节点的父节点信息。

CREATE TABLE Employees(
  eid int,
  ename VARCHAR(100),
position VARCHAR(100),
  parent_id int
  )

记录信息简单粗暴,那么现在存储一下这个结构信息:
在这里插入图片描述

好的,现在开始进入回答环节:

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

SELECT e2.eid,e2.ename FROM employees e1,employees e2 WHERE e1.parent_id=e2.eid AND e1.ename=’小天’;
在这里插入图片描述

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

SELECT e1.eid,e1.ename FROM employees e1,employees e2 WHERE e1.parent_id=e2.eid AND e2.ename=’老宋’;
在这里插入图片描述

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

这里肯定没法直接查,只能用循环进行循环查询,先查直接上司,再查直接上司的直接上司,依次循环,这样麻烦的事情,还是得先建立一个存储过程:

睁大眼睛看仔细了,接下来是骚操作环节:
在这里插入图片描述

这一段存储过程可以查询子节点的所有父节点,来试验一下
在这里插入图片描述

好的,骚操作完成。

显然,这样。获取子节点的全部父节点的时候很麻烦。。

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

思路如下:先获取所有父节点为老王id的员工id,然后将员工姓名加入结果列表里,在调用一个神奇的查找函数,即可进行神奇的查找:
在这里插入图片描述

看神奇的结果:
在这里插入图片描述

虽然搞出来了,但说实话,真是不容易。。。

这种方法的优点是存储的信息少,查直接上司和直接下属的时候很方便,缺点是多级查询的时候很费劲。所以当只需要用到直接上下级关系的时候,用这种方法还是不错的,可以节省很多空间。

以上就是关于MySQL怎样通过Adjacency List存储树形结构的内容介绍,相信大家看完之后有一定的收获,如果还想学习更多相关知识,欢迎关注摩杜云行业资讯频道,更多精彩内容等着你来阅读。如果觉得这篇文章不错的话,可以分享给更多的人看到,感谢各位的阅读!

相关文章:

  • 如何在win10下配置MySQL环境变量?
  • 如何在MySQL中查看binlog二进制日志?
  • 如何解决MySQL字符集乱码的问题?
  • 如何在MySQL数据库中使用limit?
  • 什么类型的SSL证书有利于网站安全?
  • 网站配置SSL证书有很什么好处?
  • 这篇文章告诉你,服务器选择云服务器还是物理服务器?
  • 网站选择物理服务器还是云服务器?
  • 为什么106短信那么火?
  • 云存储是怎么工作的?看这篇文章就足够了!
  • 对象存储可以通过哪些方式使用?
  • 探索实时音视频云,摩杜云视频直播助力直播行业大放异彩
  • MySQL中InnoDB存储引擎索引的示例分析
  • 摩杜云市场总监石瑜:对于公司生态伙伴体系的政策支持有哪些方面?
  • 企业云服务爆发在即,摩杜云推出“合伙人计划”
  • canvas 高仿 Apple Watch 表盘
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • ng6--错误信息小结(持续更新)
  • Web设计流程优化:网页效果图设计新思路
  • 对象引论
  • 分享一份非常强势的Android面试题
  • 后端_MYSQL
  • 后端_ThinkPHP5
  • 7行Python代码的人脸识别
  • 阿里云API、SDK和CLI应用实践方案
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • # include “ “ 和 # include < >两者的区别
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (二)fiber的基本认识
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三) diretfbrc详解
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)visual stdio 书签功能介绍
  • (转)大道至简,职场上做人做事做管理
  • .aanva
  • .bashrc在哪里,alias妙用
  • .java 9 找不到符号_java找不到符号
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET delegate 委托 、 Event 事件
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ C++ ] STL---string类的使用指南
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [ajaxupload] - 上传文件同时附件参数值
  • [Android 数据通信] android cmwap接入点
  • [Android]Android开发入门之HelloWorld
  • [Angular] 笔记 21:@ViewChild
  • [BUUCTF 2018]Online Tool
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [CTF]2022美团CTF WEB WP