当前位置: 首页 > news >正文

若依框架---树状层级部门数据库表

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者
📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

  

问题起源

最近接手的某款办公软件,其中要添加一些额外的功能,涉及到树状层级的部门,人员查找。又最近在学习若依管理系统,其中也设计到层级的部门管理,查看了其中的部门表设计与一些SQL编写,发掘有一些小小的差异,即可带来检索与查找的极大遍历。容我们慢慢道来。

若依中的dept表设计

若依系统中的sys_dept表设计字段如下:

 若依系统中添加部门的操作页面如下:

 

 

我们选几个重点字段说一下:

  1. parent_id字段:表明当前部门的上级部门节点id;
  2. order_num:表明当前部门在其上级部门下的排序次序;
  3. ancestors: 注释为“祖级列表”,我们来看一下表中的数据以及对应的真实的数据结构:

比如,若依中默认的部门级结构如下:

 

我们来看一下其中"若依科技->深圳总公司->研发部门"的数据库具体数据,尤其是ancestors数据是什么样的:

 

如图所示,研发部门的ancestors数据为“0,100,101”,0为所有部门父级,不表示具体部门,如果一个部门的父级只有0,表明其为最高级的部门;100表示dept_id=100的若依科技,101表示dept_id=101的深圳总公司。

乍一看这个字段设计的如此复杂,需要保存从最高级直到本级中的所有部门节点,给保存、更新带来了很大的复杂度,这样设计有什么好处呢?

另一种常用设计

说是另一种常用设计,更准确是说是我们当前系统的表设计,为了不违反公司相关规章,这里我就不贴真实的数据库表截图了,大概是这样的:

iddept_nameparent_id
1总公司0
2一级部门1
3二级部门2

即仅通过一个parent_id来表明层级关系,这样带来的一个显而易见的好处便是保存与更新带来的操作比较简单。

差异

差异就在于若依中的层级表设计有字段来保存部门祖级的所有节点。最近实现业务代码涉及到这块儿功能才发觉其有很好的实用性。

列举所有子部门

层级结构中最常见的一个业务是列出部门下的所有子部门,那么应该如下编写代码呢?

显然,如果没有ancestors的帮助,我们需要在代码中通过parent_id逐层逐级的遍历列举以及合并列表,而有了ancestors帮助,我们只需要一行SQL语句:

.....WHERE dept_id IN ( SELECT dept_id FROM sys_dept WHERE find_in_set('100', ancestors ) )

逐级查找所有父级部门

这种业务通常处于低级部门规则覆盖高级部门规则的场景下,即部门人员总是采用部门层级最接近自己的部门的规章,按照这一原则来实现代码的话,ancestors直接列举出了从高到底各个层级部门,而仅有parent_id则需要通过代码来循环查找父级部门。

 

专栏:若依框架 

 

                                                                      关注公众号,领取资料。 

http://www.lryc.cn/news/91.html

相关文章:

  • 【Mysql第十期 数据类型】
  • 2023-2-9 刷题情况
  • Homekit智能家居DIY设备-智能通断开关
  • 【java】EJB(Enterprise Java Bean)概述
  • Android 10.0 Launcher3桌面禁止左右滑动
  • 日期类的实现
  • 2022年这5款熟悉的软件退出了历史舞台
  • 用Nginx打包部署vue3项目及404和500解决
  • Java面试——多线程并发篇
  • 维基百科数据抽取
  • 2020年因果推断综述《A Survey on Causal Inference》
  • 嵌入式linux系统测试程序编写
  • 力扣SQL刷题5
  • 动态规划详解(完结篇)——如何抽象出动态规划算法?以及解题思路
  • C语言一维数组篇【下】——每日刷题经验分享
  • VHDL语言基础-组合逻辑电路-其它组合逻辑模块
  • 初识Vue
  • TOUGH系列软件建模实践方法及在地下水、CO2地质封存、水文地球化学、地热等多相多组分系统多过程耦合
  • Codeforces Round #699 (Div. 2)
  • MySQL存储过程的传参和流程控制
  • MySQl学习(从入门到精通11)
  • 关于ThreadLocal
  • 【C++】类和对象(中)
  • js下载文件
  • ESP8266 + STC15+ I2C OLED带网络校时功能的定时器时钟
  • 计算机入门基础知识大全
  • Python程序出现错误怎么办?
  • 【Vue3】v-if和v-for优先级
  • Windows上实现 IOS 自动化测试
  • Linux云服务器下怎么重置MySQL8.0数据库密码