数据范围权限- - - 对于部门的控制

背景: 我每张表中 都会有 create_user ,跟 user表, 也就是用户表 的 id关联.
而user表中的dept_id 跟部门表的id关联, 那么控制部门的数据范围, 也就很简单了

困扰: 这个流程很麻烦, 而且效率极低

示例: 假如我有这个需求. 我查到当前用户所在的部门id,然后拿这个部门id 查他所在的最高部门id, 然后根据这个最高部门id 下查所有关联的子部门 id.
拿到的是一个id集合, 然后我要用这个集合跟user用户表中的部门id关联,查出所有关联的用户, 拿到的是一个用户id集合.
再用这个用户id集合,去跟create_user,一一比对, 符合的数据作展示, 那就是很多个 or 的sql拼接 .
这样效率极其低下, 如果数据量是 千条,万条, 那么他这个查询速度, 我不敢想

请求建议: 有什么更优的办法吗, 最好还是围绕着 create_user来进行, 我想到的是,建一个父部门与子部门的关系表, 但感觉好像不太行

关于部门id取名的规范, 有大哥给我建议了, 同一个父部门下, 父部门若为 201, 那么子部门都以201开头, 这样,当我知道当前用户部门, 就可以直接查到201关联的所有部门, 这个很棒 .

不知道你拿到用户id出来的意义在哪?
无非是两个关键点,一个是是不是拥有部门权限(需要考虑上级部门包含下级部门权限的问题,你已经有解决方案了,基本上mysql低版本的树结构,都会采用那个方案),再一个就是创建人是不是当前登陆人
第一个部门很好处理,你用path的方案直接将下级机构可以一次全部查询出来,可以通过mybatis的插件机制搭配jsqlparse改写sql,去连user以及dept表,
第二个就更简单了,直接加一个查询列就行,当前登录人和createUser是否相等,这也可以通过插件和jsqlparse去改写sql实现

img


ps:如果你不是做成通用功能的话,那都不是事,通用功能就需要你会玩mybatis了

你应该先用当前用户去user表查询等于user=create_user得到集合A,如果为空就不用展示了,如果不为空那也只需要把这个集合A里不符合的部门过滤掉就行。当前用户去拿部门id集合B也很简单,一般部门都是树结构的关系,一条sql就能查询完。最后把集合A里面的部门id不在集合B里就过滤掉,基本上这种关联的查询都是很常见的操作,数据量大也很快的。

你这个需求大概就员工只能查询自己辖内人员创建的记录吧。
我们这也遇见过这种情况,我们具体记录上还会冗余一下创建机构ID,用户的部门id信息都是放在登陆后的缓存中,这样就可以直接到缓存拿到这个部门ID。
另外通过部门ID规则区分子部门是没问题的,这样也是最简单的。我们这边因为部门ID有其他的规则,是单独建了一个机构层级关系表,每次通过这个表关联查询辖内机构产生的记录,或者查询出所有辖内机构ID,通过in去数据库查询。

才千条万条数据啥查询都不是事儿。
做冗余,做上下级递归层级