Skip to main content
  1. internet/

查询子孙部门的方案

·488 words·1 min·

人事系统中往往都有这样一颗部门树:

部门树

在数据落地的过程中,每个部门都要记录其父部门id。那么,如何根据一个部门id,找到其所有的子孙部门呢?

方案一:迭代加递归 #

最粗暴的方式就是迭代所有子部门,然后再递归查询所有子部门的子部门。

这种方式不太会被采用,因为需要进行多次数据库查询。

方案二:冗余子部门表 #

另外一种粗暴的方式是用一张表来记录部门的子孙部门。

每次有部门的变更,需要通过监听事件来更新这张子孙部门表。

这个方案会造成大量的数据冗余,因此也不会推荐。

方案三:通过编码标识关系 #

可以通过编码来标识部门之间的关系,比如:

  • A 表示开发部门
  • AA表示开发的子部门前端组
  • AB表示开发的子部门后端组
  • ABA表示后端组的子部门golang组

这样,在查询开发的子孙部门时,直接筛选前缀是A的部门即可。

解释图

编码选型 #

如果一个平级的子部门的数量不会超过10,那么用0~9即可,如果不会超过16,用0~f即可。

在通用的HR系统中,需要放宽这个限制,可以设置为64, 那么直接使用base64编码中的64个字符即可。

注意点 #

部门拖动可以是跨父部门的,这时候被拖动部门的标识需要改变,并且需要递归所有子部门更新其标识。