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字段值为0,100
这里的100就是若依科技的部门ID
在拿研发部门来举例
研发部门是位于深圳总公司下,深圳总公司又是位于若依科技下,
此时研发部门的ancestors值为0,100,101
这个ancestors字段的值就是记录当前部门它祖级的ID
这里需要明白它这个点是如何去设计的,后面才能理解它查询下级是根据什么去查询的。
场景1:
假设现在需要查询深圳总公司下的所有下级
先查出深圳总公司的ancestors,值为0,100,加上当前部门ID。
就是0,100,101,此时“0,100,101%”表示的就是深圳总公司的所有下级,
上面说了,ancestors就是记录父级路径。
那么其他记录只要包含了这个深圳总公司的路径,0,100,101,就是深圳总公司的子级,
采用模糊搜索
场景2
查询当前部门上级
直接取ancestors字段值即可
如果错误,欢迎即使纠正!