我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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树形结构(多级菜单)查询设计方案

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

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

如下图所示

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

目录常用树形结构设计总结1. 递归表2.路径枚举3.数据与关系分开存mysql树形结构(多级菜单)查询设计方案三级查询(层级固定,层级数少)多级查询(层级不固定/层级很深)总结常用树形结构设计总结开发中,经常会遇到树形结构的设计,所谓的树
2023-03-03

MySQL中的常用树形结构设计是什么

今天小编给大家分享一下MySQL中的常用树形结构设计是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 递归表idpi
2023-07-05

树形结构的菜单表设计与查询

开发中经常会遇到树形结构的场景,比如:导航菜单、组织机构等等,但凡是有这种父子层级结构的都是如此,一级类目、二级类目、三级类目。。。对于这种树形结构的表要如何设计呢?接下来一起探讨一下首先,想一个问题,用非关系型数据库存储可不可以?答案是肯定可以的,比如用mo
树形结构的菜单表设计与查询
2016-09-24

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

目录背景三级查询(层级固定,层级数少)多级查询(层级不固定/层级很深)遍历整个树:节点搜索(查找出这个节点所在的整个分支)总结背景又android很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护工作中(尤其是
2023-03-03

Java中遍历树形结构有哪些常用算法?(在Java中,遍历树形结构通常使用哪些算法?)

遍历树形结构的常见算法包括:深度优先搜索(DFS):按深度遍历节点,易实现但可能导致堆栈溢出。广度优先搜索(BFS):按层遍历节点,不会导致堆栈溢出但内存消耗较高。先序遍历:先访问根节点,再依次遍历左子树和右子树。中序遍历:先遍历左子树,再访问根节点,最后遍历右子树。后序遍历:先遍历左子树,再遍历右子树,最后访问根节点。选择算法取决于具体场景和需求,如遍历顺序、内存消耗等。
Java中遍历树形结构有哪些常用算法?(在Java中,遍历树形结构通常使用哪些算法?)
2024-04-02

jQuery中treeview树形结构应用示例

这篇文章将为大家详细讲解有关jQuery中treeview树形结构应用示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。引入必备cssjquery.treeview.css引入必备jsjquery-3.0
2023-06-14

Java实现树形结构管理的组合设计模式

Java组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用统一的方式处理单个对象和对象组合,从而简化了系统的设计和维护
2023-05-17

如何在AmazeUi 中使用树形结构

如何在AmazeUi 中使用树形结构?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一步:基本引入2023-06-09

LayUI—tree树形结构的使用解析

这篇文章主要介绍了LayUI—tree树形结构的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

mysql递归查询树形结构怎么应用

在MySQL中实现递归查询树形结构可以使用递归查询语句(Recursive Query Statement)或者使用存储过程来实现。使用递归查询语句:递归查询语句使用了WITH RECURSIVE子句,可以在语句中递归引用自身。以下是一个使
2023-10-25

MySQL查询树形结构数据的两种方法

目录1. 递归查询2. 闭包表对于mysql查android询树形结构,可以使用递归查询或者闭包表来实现。以下是两种常用的方法:1. 递归查询使用递归查询可以遍历树形结构,获取父节点和子节点的关系。假设有一个名为 your_table
MySQL查询树形结构数据的两种方法
2023-11-11

WinForms中怎么使用TreeView展示树形结构

在WinForms中使用TreeView展示树形结构非常简单,可以按照以下步骤操作:在Visual Studio中创建一个新的WinForms应用程序项目。在窗体上拖拽一个TreeView控件,并设置其Dock属性为Fill,使其填充整个窗
WinForms中怎么使用TreeView展示树形结构
2024-03-12

一文总结JavaScript中常见的设计模式

在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”。在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”。,本文将总结了JavaScript中常见的十五种设计模式,感兴趣的朋友可以参考下
2023-05-19

编程热搜

目录