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】
在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...
随机推荐
- Listener refused the connection with the following error: ORA-12514
1.问题 在使用Oracle SQL Developer时,遇到以下问题: 状态: 失败 -测试失败: Listener refused the connection with the followi ...
- MoeCTF 2023(西电CTF新生赛)WP
个人排名 签到 hello CTFer 1.题目描述: [非西电] 同学注意: 欢迎你来到MoeCTF 2023,祝你玩的开心! 请收下我们送给你的第一份礼物: https://cyberchef.o ...
- JS - Array - 在数组的指定下标添加或替换元素 。 也可删除指定下标的元素
一,首先介绍下 js Array对象 中的 splice 方法 . ( splice在英文中是剪接的意思 ) 1,定义和用法 splice() 方法用于插入.删除或替换数组的元素. 注意:这种方法会改 ...
- SpringBoot实现限流注解
SpringBoot实现限流注解 在高并发系统中,保护系统的三种方式分别为:缓存,降级和限流. 限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统,一旦达到限制速率 ...
- C++开发PHP扩展
前端时间用C开发PHP扩展,用C实现字符串和简单的cache不友好,因而有了用C++开发的想法. 相关环境初始化配置准备 1.用php源码提供的脚手架生成扩展名 php ext/ext_skel.ph ...
- [转帖]SQL SERVER中隐式转换的一些细节浅析
https://www.cnblogs.com/kerrycode/p/5853257.html 其实这是一篇没有技术含量的文章,精通SQL优化的请绕道.这个缘起于在优化一个SQL过程中,同事问了我一 ...
- [转帖]Kafka的Topic配置详解
https://www.jianshu.com/p/c9a54a587f0e 一.Kafka中topic级别配置 配置topic级别参数时,相同(参数)属性topic级别会覆盖全局的,否则默认为全局配 ...
- [转帖]Elasticsearch部署配置建议
1: 选择合理的硬件配置:尽可能使用 SSD Elasticsearch 最大的瓶颈往往是磁盘读写性能,尤其是随机读取性能.使用SSD(PCI-E接口SSD卡/SATA接口SSD盘)通常比机械硬盘(S ...
- [转帖]如何通过shell脚本对一个文件中的所有数值相加并求和
https://developer.aliyun.com/article/886170?spm=a2c6h.24874632.expert-profile.255.7c46cfe9h5DxWK 1.背 ...
- [转帖]一本正经的八卦一下CPU的自主可控
https://zhuanlan.zhihu.com/p/36391482 (2018年的4月16日,美国商务部发布对中兴通讯出口权限禁令,禁止美国企业向其出售零部件,史称"中兴禁运事件&q ...