• Java中树形(层次)结构数据库MySql设计方案(类似目录)


    1.背景

    假设现在需要实现下图这个层次结构,在常见设计中,都是直接采用一个parent_id字段来区分当前菜单的父级ID,那么在Java代码中进行查询的时候,只能通过递归去查询,此时的效率是比较低的,且递归不好控制,假设递归代码逻辑出现异常,那么很有可能就会出现栈溢出了。
    在这里插入图片描述

    2. 可参考的表结设计

    可以参考下面的这个图同步看这个数据库表
    parent_id: 当前部门的父级部门ID
    ancestors: 祖级列表ID,就是当前部门祖级路径
    order_num: 当前部门层级是第几级,这个字段主要是给前端展示用的

    ps: 最后一条数据可以忽略它
    在这里插入图片描述
    在这里插入图片描述

    3.案例分析

    一般在开发中,会初始化一个根目录出来,例如举例这里的根目录就是若依科技,然后前端可以在这个根目录下进行操作

    就拿深圳总公司部门来举例:
    在若依科技下添加一个深圳总公司,首先是取出若依科技的ancestors的值,加上若依科技的部门ID,(就是记录父级ID),此时深圳总公司的ancestors值就是祖级Id路径0,100。倘若深圳总公司下在加上一个部门,此时新加部门的那条记录ancestors值就是0,100,101 ,每增加一个子级,那就是增加一条记录,不会影响原来的记录的(这是个比较重要的点)
    101对应的就是深圳总公司的部门ID

    深圳总公司是位于若依科技下,深圳总公司的ancestors字段值为0100
    这里的100就是若依科技的部门ID
    
    • 1
    • 2

    在拿研发部门来举例

    研发部门是位于深圳总公司下,深圳总公司又是位于若依科技下,
    此时研发部门的ancestors值为0,100,101
    
    • 1
    • 2

    这个ancestors字段的值就是记录当前部门它祖级的ID
    这里需要明白它这个点是如何去设计的,后面才能理解它查询下级是根据什么去查询的。

    场景1:

    假设现在需要查询深圳总公司下的所有下级

    先查出深圳总公司的ancestors,值为0100,加上当前部门ID。
    就是0100101,此时“0100101%”表示的就是深圳总公司的所有下级,
    上面说了,ancestors就是记录父级路径。
    那么其他记录只要包含了这个深圳总公司的路径,0100101,就是深圳总公司的子级,
    采用模糊搜索
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    场景2

    查询当前部门上级

     直接取ancestors字段值即可
    
    • 1

    如果错误,欢迎即使纠正!

  • 相关阅读:
    【C++】“334. 队列检查”题目解析及所用vector相关用法总结
    使用 shell 脚本安装 nginx
    react原理学习
    【Python笔记-设计模式】外观模式
    如何使用Git的代码托管
    mysql5.7实现ROW_NUMBER()
    Linux 编译安装PostgreSQL
    deepstream6.2部署yolov5详细教程与代码解读
    Python搞不定蝴蝶图?
    设计模式——抽象工厂模式(Abstract Factory Pattern)+ Spring相关源码
  • 原文地址:https://blog.csdn.net/weixin_44130574/article/details/126007899