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

在拿研发部门来举例

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

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

场景1:

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

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

在这里插入图片描述

场景2

查询当前部门上级

 直接取ancestors字段值即可

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值