问题前提
在ERP、OA系统开发中部门信息是肯定避免不了的,有时候因为甲方爸比的需求,需要部门的数据进行查询过滤或者规则限制!
例如问题:
- 查询一个部门的数据时需要携带查询出所有这个部门子部门的数据
- 当所有子部门达到固定数量父部门才能进行升级
- ……
部门表简介(old)
部门数据(old)
部门结构(old)
优化方案
从老板这个根部门开始遍历,左边的值为这个部门的开始,右边的值为这个部门所有子部门遍历结束后的值+1
部门数据(new)
部门结构(new)
案列
查询开发部所有子孙部门信息
1
2
3
4
5# 查询开发部左值和右值
SELECT dept_name, left_value, right_value FROM ept_info_new WHERE dept_name = '开发部';
SELECT dept_name FROM dept_info_new WHERE left_value BETWEEN 2 AND 11;查询开发部所有子孙部门数量
统一公式:(右值 - 左值 - 1) / 2
1
2SELECT dept_name, (( right_value - left_value - 1 ) / 2 ) AS '子部门数量'
FROM dept_info_new WHERE dept_name = '开发部';查询后端开发1部以上所有父部门信息
1
2
3
4
5# 查询开发部左值和右值
SELECT dept_name, left_value, right_value FROM dept_info_new WHERE dept_name = '开发部';
SELECT dept_name FROM dept_info_new WHERE left_value < 4 AND right_value > 5;
部门表数据变更
俗话说鱼和熊掌不可兼得,此优化方案查询效率在很多需求场景下很高,但是需要牺牲新增和删除的效率!
一、增加部门数据
比如现在我们要是想在前端开发部下新增加一个前端开发1部
1 | # 首先得到前端开发部的右值 |
二、删除部门数据
比如现在我们要是想在删除前端开发1部
1 | # 首先得到前端开发1部的左值 |