MySQL中的常用树形结构设计总结

 更新时间:2023年03月03日 10:51:34   作者:lvhui321  
这篇文章主要介绍了MySQL中的常用树形结构设计总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

常用树形结构设计总结

开发中,经常会遇到树形结构的设计,所谓的树形结构,其实就是数据与关系的设计,本文用来总结常用的树形结构设计

1. 递归表

idpidnode_name
10父1
20父2
31子1
42子2

注意:在数据量少的情况下,一次加载所有节点,无大影响;数据量大的情况,建议懒加载(逐层加载)

2.路径枚举

idpidnode_namepids
10父10,1
20父20,2
31子10,1
42子20,2

3.数据与关系分开存

数据表

idnode_name
1节点1
2节点2
3节点3

关系表

idpid_iddescendantlevel(层次)
1121
2232

MySQL树形结构(多级菜单)查询设计方案

工作中(尤其是传统项目中)经常遇到这种需要,就是树形结构的查询(多级查询),常见的场景有:组织架构(用户部门)查询 和 多级菜单查询

比如,菜单分为三级,一级菜单、二级菜单、三级菜单,要求用户按树形结构把各级菜单查询出来。

如下图所示

对于层级固定,层级数少的,一般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 (?,?,?)

组装所在分支树状结构

总结

1.多级查询、三级查询本质就是树形结构的遍历,推荐使用多级查询的方式,相比三级查询多级查询的方式抓住了树形结构遍历的本质,方便扩展和维护。

2.技术只是工具,多级查询的方式不是固定的,查询方式合理既可,但通常都需要加关系表辅助设计

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL substr函数使用方法详解

    MySQL substr函数使用方法详解

    MySQL substr函数是指从一个内容中,按照指定条件,「截取」一个字符串,这个内容可以是数值或字符串,本文就来给大家讲讲MySQL substr函数的使用方法,需要的朋友可以参考下
    2023-07-07
  • MySQL5.6安装步骤图文详解

    MySQL5.6安装步骤图文详解

    这篇文章主要为大家详细介绍了MySQL安装步骤配置方法图文,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • mysql创建表分区的实现示例

    mysql创建表分区的实现示例

    表分区是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分,本文主要介绍了mysql创建表分区的实现示例,感兴趣的可以了解一下
    2024-01-01
  • mysql里CST时区的坑及解决

    mysql里CST时区的坑及解决

    这篇文章主要介绍了mysql里CST时区的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • mysql慢查询使用详解

    mysql慢查询使用详解

    慢查询是我们在mysql中经常需要使用到的一个很方便的功能,慢查询对于跟踪有问题的查询很有用,可以分析出当前程序里那些Sql语句比较耗费资源。
    2014-12-12
  • MySQL分表实现上百万上千万记录分布存储的批量查询设计模式详解

    MySQL分表实现上百万上千万记录分布存储的批量查询设计模式详解

    本篇文章是对使用MySQL分表实现上百万上千万记录分布存储的批量查询设计模式进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL优化表时提示 Table is already up to date的解决方法

    MySQL优化表时提示 Table is already up to date的解决方法

    这篇文章主要介绍了MySQL优化表时提示 Table is already up to date的解决方法,需要的朋友可以参考下
    2016-11-11
  • 用Autoconf检测MySQL软件包的教程

    用Autoconf检测MySQL软件包的教程

    这篇文章主要介绍了用Autoconf检测MySQL软件包的教程,主要使用编写好的ax_lib_mysql脚本进行操作,需要的朋友可以参考下
    2015-06-06
  • DQL命令查询数据实现方法详解

    DQL命令查询数据实现方法详解

    DQL(Data Query Language,数据查询语言),查询数据库数据,如SELECT语句,简单的单表查询或多表的复杂查询和嵌套查询,数据库语言中最核心、最重要的语句,使用频率最高的语句
    2022-09-09
  • linux下安装mysql简单的方法

    linux下安装mysql简单的方法

    这篇文章主要介绍了 linux下安装mysql简单的方法,需要的朋友可以参考下
    2017-08-08

最新评论