MySQL树形结构表设计
两个字段:
- pid:父级ID
- parent_ids:所有经过的路径节点ID

这样设计有个好处是,可以查任意节点的所有子节点,从任意节点开始既可以向上查,也可以向下查
select * from enterprise where find_in_set(4, parent_ids);
构造菜单树(Java实现)
@Data
@NoArgsConstructor
public class Menu {
private Integer id;
private Integer pid; // 父菜单ID
private String pids; // 所有父菜单ID集合(按顺序,逗号分隔)
private String name;
private String code;
private int sort;
List<Menu> children;
public Menu(Integer id, Integer pid, String name, int sort) {
this.id = id;
this.pid = pid;
this.name = name;
this.sort = sort;
}
}
第一种写法
@Test
void contextLoads() throws Exception {
List<Menu> allMenuList = new ArrayList<>();
allMenuList.add(new Menu(1, 0, "一级菜单A", 1));
allMenuList.add(new Menu(2, 0, "一级菜单B", 2));
allMenuList.add(new Menu(3, 1, "二级菜单AA", 1));
allMenuList.add(new Menu(4, 2, "二级菜单BB", 1));
allMenuList.add(new Menu(5, 3, "三级菜单AAA", 2));
allMenuList.add(new Menu(6, 4, "三级菜单BBB", 2));
allMenuList.add(new Menu(7, 1, "二级菜单AC", 2));
// 找到所有一级菜单
List<Menu> parentList = allMenuList.stream().filter(e->e.getPid().equals(0)).collect(Collectors.toList());
for (Menu menu : parentList) {
menu.setChildren(getChild(menu.getId(), allMenuList));
}
}
/**
* 递归查找子菜单
*/
public List<Menu> getChild(Integer pid, List<Menu> allMenuList) {
List<Menu> childList = new ArrayList<>();
for (Menu menu : allMenuList) {
if (pid.equals(menu.getPid())) {
menu.setChildren(getChild(menu.getId(), allMenuList));
childList.add(menu);
}
}
childList.sort(Comparator.comparing(Menu::getSort).reversed());
return childList;
}
第二种写法
@Test
void contextLoads() throws Exception {
List<Menu> allMenuList = new ArrayList<>();
allMenuList.add(new Menu(1, 0, "一级菜单A", 1));
allMenuList.add(new Menu(2, 0, "一级菜单B", 2));
allMenuList.add(new Menu(3, 1, "二级菜单AA", 1));
allMenuList.add(new Menu(4, 2, "二级菜单BB", 1));
allMenuList.add(new Menu(5, 3, "三级菜单AAA", 2));
allMenuList.add(new Menu(6, 4, "三级菜单BBB", 2));
allMenuList.add(new Menu(7, 1, "二级菜单AC", 2));
// 第二种写法
List<Menu> list = allMenuList.stream()
.filter(e->e.getPid().equals(0))
.peek(e->e.setChildren(getChild2(e.getId(), allMenuList)))
.sorted(Comparator.comparing(Menu::getSort))
.collect(Collectors.toList());
}
/**
* 递归查找子菜单(简写版)
*/
public List<Menu> getChild2(Integer pid, List<Menu> allMenuList) {
return allMenuList.stream()
.filter(e->pid.equals(e.getPid()))
.peek(e->e.setChildren(getChild2(e.getId(), allMenuList)))
.sorted(Comparator.comparing(Menu::getSort))
.collect(Collectors.toList());
}
MySQL树形结构表设计的更多相关文章
- Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结
Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 jav ...
- MySQL 树形结构 根据指定节点 获取其所在全路径节点序列
背景说明 需求:MySQL树形结构, 根据指定的节点,获取其所在全路径节点序列. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取全路径节点序列. 2.直接自定义My ...
- MySQL 树形结构 根据指定节点 获取其所有父节点序列
背景说明 需求:MySQL树形结构, 根据指定的节点,获取其所有父节点序列. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取父节点. 2.直接自定义MySQL函数 ...
- MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)
背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有子节点(包含路径上的枝干节点和叶子节点) 枝干节点:如果一个节点下还有子节点,则为枝干节点. 叶子节点:如果一个节点下不再有子节点 ...
- MySQL 树形结构 根据指定节点 获取其所有叶子节点
背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有叶子节点. 叶子节点:如果一个节点下不再有子节点,则为叶子节点. 问题分析 1.可以使用类似Java这种面向对象的语言,对节点集合 ...
- 使用Oracle数据库实现树形结构表的子-父级递归查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- 基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)
先从后台讲起 1.表的设计 parent_id就是另外一条记录的id,无限极表设计可以参考 http://m.blog.csdn.net/Rookie_Or_Veteran/article/deta ...
- 「SQL归纳」树形结构表的存储与查询功能的实现——通过路径方法(非递归)
一.树形结构例子分析: 以360问答页面为例:http://wenda.so.com/c/ 我们通过观察URL,可以明确该页面的数据以树形结构存储,下面三块模块分别为: ①根节点 ②根节点的第一层子节 ...
- 树形结构表的存储【转自:http://www.cnblogs.com/huangfox/archive/2012/04/11/2442408.html】
在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...
随机推荐
- 初次安装Linux 1Panel面板体验
初次安装Linux 1Panel面板体验 1Panel是Linux下的一款服务器管理工具.和宝塔相比更加轻量化.相比之下各有优点,本文让我们一起来安装1Panel面板. 面板优势 快速建站 :深度集成 ...
- Python Code_05位运算
coding:utf-8 author : 写bug的盼盼 development time : 2021/8/28 7:16 print(4&8)#非1即0 print(4|2)#同0即0, ...
- SQLServer命令行备份数据库
SQLServer命令行备份数据库 背景 SQLServer on linux 想设置计划任务自动备份数据库 感觉sqlcmd应该是最简单快捷的方式了 所以进行一下处理. 安装必备软件 sudo cu ...
- [转帖]@Scope("prototype")的正确用法——解决Bean的多例问题
https://www.jianshu.com/p/54b0711a8ec8 1. 问题,Spring管理的某个Bean需要使用多例 在使用了Spring的web工程中,除非特殊情况,我们都会选择 ...
- [转帖]Linux之pure-ftpd安装和使用
一.pure-ftpd简介 PureFTPd是一款专注于程序健壮和软件安全的免费FTP服务器软件(基于BSD License),以安全和配置简单为设计目标,支持虚拟主机,IPV6,PAM等功能.. ...
- [转帖]Percolator分布式事务模型原理与应用
https://zhuanlan.zhihu.com/p/59115828 Percolator 模型 Percolator[1] 是 Google 发表在 OSDI'2010 上的论文 Large- ...
- [转帖]Linux Shell编程 循环语法
https://zhuanlan.zhihu.com/ for循环 for 循环是固定循环,也就是在循环时已经知道需要进行几次循环.有时也把 for 循环称为计数循环.语法: for 变量 in 值1 ...
- [转帖]JMeter压测Redis
https://www.cnblogs.com/yjlch1016/p/14052402.html 一.Redis Data Set插件: https://jmeter-plugins.org/wik ...
- [转帖]【jmeter】BeanShell用法详细汇总
一.什么是Bean Shell BeanShell是用Java写成的,一个小型的.免费的.可以下载的.嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k. B ...
- [转帖]CertUtil: -hashfile 失败: 0xd00000bb (-805306181)
https://www.cnblogs.com/heenhui2016/p/de.html 使用CertUtil验证Python安装文件的时候出现了这个错误. CertUtil: -hashfile ...