MySql树形结构(多级菜单)查询设计方案
作者:程序猿路野 时间:2024-01-18 15:35:42
背景
又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护
工作中(尤其是传统项目中)经常遇到这种需要,就是树形结构的查询(多级查询),常见的场景有:组织架构(用户部门)查询 和 多级菜单查询
比如,菜单分为 * ,一级菜单、二级菜单、 * 菜单,要求用户按树形结构把各级菜单查询出来。如下图所示
对于层级固定,层级数少的,一般3级,需求实现很简单,先查询最小子级,再依次查询上级,最后再组装返回给前端就是了。
那么问题来了,如果层级数很大,10级,或者干脆层级不确定,有的3级,有的5级,有的8级,与之前的层级固定,层级数相比,显然问题更复杂了,我们来看看这种怎么处理
* 查询(层级固定,层级数少)
这种情况,我们只需要一张表,就叫它树形表吧:
CREATE TABLE tree (
id int not null auto_increment,
name varchar(50) not null comment '名称',
parent_id int not null default 0 comment '父级id',
level int not null default 1 comment '层级,从1开始',
created datetime,
modified datetime
);
* 查询过程:查询出 * tree, 根据 * tree的 parent_id 查询出二级tree, 同样的方式再去查询出一级tree, 后端组装成树状数据,返回给前端。
多级查询(层级不固定/层级很深)
这种情况,我们首先想到的就是子查询或者联表查询,但是肯本不能在实际开发中使用,原因大家都知道:
sql语句复杂,容易出错
性能问题,可能会被领导干
所以最好的方式就是,加一张表 tree_depth,来维护层级深度关系。
CREATE TABLE tree_depth (
id int not null auto_increment,
root_id int not null default 0 comment '根节点(祖先节点)id',
tree_id int not null default 0 comment '当前节点id',
depth int not null default 0 comment '深度(当前节点 tree_id 到 根节点 root_id 的深度)',
created datetime
);
表中 depth 字段表示的是: 当前节点 tree_id 到 根节点 root_id 的深度,不是当前节点所在整个分支的深度,所有节点相对于自身的深度都是0
有了 tree_depth 表后,查询一个N级节点的组织数据就方便了:
遍历整个树:
直接查 tree 中所有 level = 1 的节点,在出去这些节点的 id 根据 parent_id 去查下级节点, 查询完所有的节点,就可以组装成一个完整的树状图返回给前端
节点搜索(查找出这个节点所在的整个分支)
从 tree 表查询出节点 treeN
select * from tree where id = N
根据 treeN 的 id 值,到 tree_depth 表查询出它的 根节点id:
select root_id from tree_depth where tree_id = #{treeId}
根据 root_id 查询 tree_depth 的 所有当前节点分支数据
select * from tree_depth where root_id = #{rootId}
从查询出 tree_depth 表数据中取出所有当前节点 tree_id
select * from tree where id in (?,?,?)
组装所在分支树状结构
总结
多级查询、 * 查询本质就是树形结构的遍历,推荐使用多级查询的方式,相比 * 查询多级查询的方式抓住了树形结构遍历的本质,方便扩展和维护。
技术只是工具,多级查询的方式不是固定的,查询方式合理既可,但通常都需要加关系表辅助设计
来源:https://www.cnblogs.com/jadite/p/17040953.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python 类的私有属性和私有方法实例分析
Pygame游戏开发之太空射击实战添加图形篇
![](https://img.aspxhome.com/file/2023/3/66343_0s.png)
使用PHP获取网络文件的实现代码
MySQL字符串索引更合理的创建规则讨论
![](https://img.aspxhome.com/file/2023/0/68110_0s.png)
如何使用Python修改matplotlib.pyplot.colorbar的位置以对齐主图
![](https://img.aspxhome.com/file/2023/3/118573_0s.png)
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mac包管理器Homebrew的安装方法
![](https://img.aspxhome.com/file/2023/2/131922_0s.png)
PHP的PDO事务与自动提交
python ChainMap的使用和说明详解
常见数据库系统比较 Oracle数据库
Keras搭建孪生神经网络Siamese network比较图片相似性
![](https://img.aspxhome.com/file/2023/9/71999_0s.png)
详解Python自动化之文件自动化处理
Django中自定义模型管理器(Manager)及方法
scrapy结合selenium解析动态页面的实现
![](https://img.aspxhome.com/file/2023/1/131381_0s.jpg)
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
SQL Server利用sp_spaceused如何查看表记录存在不准确的情况
![](https://img.aspxhome.com/file/2023/0/129310_0s.png)
Django中Migrate和Makemigrations实操详解
![](https://img.aspxhome.com/file/2023/6/134726_0s.png)
MySQL慢查询优化之慢查询日志分析的实例教程
Python可视化库之HoloViews的使用教程
![](https://img.aspxhome.com/file/2023/4/117544_0s.jpg)