数据库设计技巧:查询子部门递归

背景

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

QAAAig

技巧

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

4tKPL0

原理:
添加一个辅助的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}%