数据库设计技巧:查询子部门递归
背景
最近在做一套RBAC的权限管理系统,当在设计部门及查询的时候,需要维护一个部门结构。结构包含 部门id
,上级部门pid
,当查询一个部门的所有子级部门时候,需要根据pid进行递归查询,层级越多,查询次数越多。那么怎么通过一个简单的数据库设计,满足查询某个部门的所有子级部门。

技巧
对于上图的部门层级结构,给出对应的数据库设计

原理:
添加一个辅助的varchar字段pids,字段的逻辑是多个部门的id使用,
来连接,假设首层使用0表示,每一个层级使用上一层的pids拼接上,
再拼接上级部门id来表示,我们也可以通俗的理解为这个是部门层级pids为该部门的所有上级路径
举例:
技术部(id:1)
的上级部门是长沙分公司(id:2)
,
长沙分公司的上级是集团(id:5)
,
所以技术部的pids为:0,5,2
,
长沙分公司的pids为:0,5
因此要查询长沙分公司的子部门,只需要用 0,5,2%
去查询即可,即找到当前部门记录的pids(0,5
), 拼上,
再拼上当前部门ID(2
),再拼个%
做后缀模糊匹配
1 | pids like {pids},{id}% |