首先,前要条件,如上图
1.组织是一个树形结构,其中组织C,D,Y,Z为末级节点(叶子节点)
2.非末级节点不能直接挂人,例如上图中,组织B下是不可以有人员的
开发要满足如下需求:
1.当管理员1登录时,只能查看组织C和组织Y的人员(人员1-4,人员6),不能查看组织D和组织Z(不能查看人员5和人员7)
2.管理员2能查看组织X下的所有人员(人员6和人员7),不能查看组织C和组织D下的人员(不能查看人员1-5)
3.当鼠标点击组织A的时候,如果当前是管理员1,那么应该显示人员1-4,如果当前是管理员2,那么应该显示人员6-7
4.同理,点击组织B的时候,重复上述步骤
上述产品需求会遭遇的问题:
查询人的时候,是根据组织ID查询的,若点击组织A,那么需要查询当前登录人在组织A下有哪些组织权限,例如当前是管理员2,那么当点击组织X时,应当拿到组织Y_ID和组织Z_ID,然后根据这2个ID查询人员,我在实际开发中遇见一个问题就是,当组织Y和Z这种同级的数据非常多的时候,那么我就需要用非常多的ID当入参,去查询人,这导致查询性能急剧下降,sql如下select * from 人员表 where 组织ID in (组织Y,组织Z.......组织N)
其中N非常大,这怎么办???
首先不能根据父级节点ID(本例组织X_ID)查询人,因为X下面可能有组织M,并且当前登录人没有组织M的权限
一个简单的办法就是跟业务和产品商量,能不能将需求改成:当鼠标点击组织X的时候,只查询组织Y的人,如果组织Y没有人(当然我们的实际场景这种情况比较少见),再查询组织Z,也就是说,显示人的时候,只显示顺序下的第一个节点,而不应该查询所有节点的人,这是完全合理的,因为假设分页查询一页20条,节点Y本身就超过20条了,那我查询Z还有何意义?弱节点Y没有超过20条(18条),那剩下的2条我也不用组织Z的补,直接空缺2条就完事儿
说到这里你可能觉得我说的是废话,但实在汗颜,这个方法确实是我想了很久才想出来的,比搞各种技术方案,索引,表设计要简单高效的多,而且还不用修改数据库表