诚一网站推广,旅游网站建设的现状,企业网络搭建服务,个人网站建设需要多少钱#x1f44f;作者简介#xff1a;大家好#xff0c;我是小童#xff0c;Java开发工程师#xff0c;CSDN博客博主#xff0c;Java领域新星创作者 #x1f4d5;系列专栏#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 #x1f4… 作者简介大家好我是小童Java开发工程师CSDN博客博主Java领域新星创作者 系列专栏前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 如果文章知识点有错误的地方请指正和大家一起学习一起进步 如果感觉博主的文章还不错的话请三连支持一下博主哦 博主正在努力完成2023计划中以梦为马扬帆起航2023追梦人 问题起源
最近接手的某款办公软件其中要添加一些额外的功能涉及到树状层级的部门人员查找。又最近在学习若依管理系统其中也设计到层级的部门管理查看了其中的部门表设计与一些SQL编写发掘有一些小小的差异即可带来检索与查找的极大遍历。容我们慢慢道来。
若依中的dept表设计
若依系统中的sys_dept表设计字段如下 若依系统中添加部门的操作页面如下 我们选几个重点字段说一下
parent_id字段表明当前部门的上级部门节点idorder_num表明当前部门在其上级部门下的排序次序ancestors: 注释为“祖级列表”我们来看一下表中的数据以及对应的真实的数据结构:
比如,若依中默认的部门级结构如下: 我们来看一下其中若依科技-深圳总公司-研发部门的数据库具体数据尤其是ancestors数据是什么样的 如图所示研发部门的ancestors数据为“0,100,101”0为所有部门父级不表示具体部门如果一个部门的父级只有0表明其为最高级的部门100表示dept_id100的若依科技101表示dept_id101的深圳总公司。
乍一看这个字段设计的如此复杂需要保存从最高级直到本级中的所有部门节点给保存、更新带来了很大的复杂度这样设计有什么好处呢
另一种常用设计
说是另一种常用设计更准确是说是我们当前系统的表设计为了不违反公司相关规章这里我就不贴真实的数据库表截图了大概是这样的
iddept_nameparent_id1总公司02一级部门13二级部门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则需要通过代码来循环查找父级部门。 专栏若依框架 关注公众号,领取资料。