首页 > 数据库 >MySQL树形结构表设计

MySQL树形结构表设计

时间:2023-01-19 15:34:31浏览次数:38  
标签:菜单 Menu List new allMenuList add 树形 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());
}

 

标签:菜单,Menu,List,new,allMenuList,add,树形,MySQL,设计
From: https://www.cnblogs.com/cjsblog/p/17061566.html

相关文章

  • Mysql 查看表注释或字段注释
    查看所有表的注释:SELECTtable_name表名,table_comment表说明FROMinformation_schema.TABLESWHEREtable_schema='数据库名'ORDERBYtable_name查询所有表......
  • mysql主(云服务器centos7)从(本地win10)搭建失败记录【reggie_take_out】
    mysql集群结构主库(云服务器centos7)配置[Err]1055-Expression#1ofORDERBYclauseisnotinGROUPBYclauseandcontainsnonaggregatedcolumn'informat......
  • 直播开发app,MySQL8修改root密码加密方式
    直播开发app,MySQL8修改root密码加密方式第一步:进入mysql #连接mysqlmysql-uroot-p#选择mysql数据库usemysql;​第二步:修改用户密码加密方式,密码可以和原来的相同......
  • 设计一个 100w 在线人数的弹幕系统
      背景问题分析带宽优化弹幕卡顿、丢失分析可靠与性能总结背景为了更好的支持东南亚直播业务,产品设计为直播业务增加了弹幕。第一期弹幕使用腾讯云支持,效......
  • 设计模式23模式介绍
    摘自:https://blog.csdn.net/guorui_java/article/details/104026988目录一、什么是设计模式二、设计模式的三大分类及关键点1、创建型模式2、结构型模式3、行为型模......
  • 【超详细】MySQL零基础入门实战
    文章目录​​1.MySQL入门​​​​1.1.源码安装MySQL5.7​​​​1.2.Docker安装MySQL5.7​​​​1.3.忘记MySQL超户密码​​​​1.4.MySQL支持简体中文​​​​2.MySQL数据库......
  • 北邮工程硕士_数据库系统设计_考试复习答案
    考试范围:第一章第二章第三章第四章SQL 复习题1.      试述数据管理的发展阶段。手工管理阶段(50年代中期以前)文件系统阶段(50年代末-60年代末)数据库系统阶段(60年......
  • MySQL(一)
    文章目录​​1、初始MySQL​​​​1.1、概述​​​​1.2、数据库分类​​​​1.3、MySQL安装​​​​1.4、安装可视化工具​​​​1.5、相关的SQL语句​​​​2、操作数据库......
  • MySQL必知必会第十三章-分组数据
    分组数据数据分组分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。创建分组分组是在SELECT语句的GROUPBY子句中建立的:SELECTvend_id,COUNT(*)ASnum_pr......
  • 使用Sharding-JDBC 实现Mysql读写分离
    为什么要读写分离?读写分离则是将事务性的增、改、删操作在主库执行,查询操作在从库执行。一般业务的写操作都是比较耗时,为了避免写操作影响查询的效率,可以使用读写分离。当然......