高中物理教学艺术
rolePermission WHERE role in (?roleList)
在系统运行时,这个?roleList通常可以从role hierarchy cache中取到,比较方便。这个方案的主要问题有二:
1)如果?roleList过长,使用in判断性能会很差。
2)在有些情况下,如报表查询和系统外查询时,取得roleList不太方便。
方案三
只标识PG,但使用如下三个数据库函数来判断角色/组之间的关系。
boolean isChild(role, parentRole) - 如role为parentRole的子,返回true。
boolean isDescendant(role, ancestorRole) - 如role为ancestorRole的子或间接子级,返回true。
boolean isMember(role, group) - 如role为group的成员或子组的成员,返回true。
boolean descendantIsMember(role, group) - 如role的子或间接子级为group的成员,返回true。
boolean isBelong(role, super) - 如role为super的子,间接子,成员或间接员,或者role的子(含间接子)是super的成员或子组成员,返回true。
在查询时,也只需要接收一个?roleId:SELECT object FROM rolePemission WHERE isBelong(?roleId, role)
如何写出高性能的数据库函数是实现这个方法的关键。
上述方法仅是理论分析,我倾向于方案二。
终于想到新的方案了。
方案四,
结合方案一和方案二,在roleRelationship中,对前两级(也可以是三级或四级)角色,保存其所有的下级角色和组。这样,如果以前两级角色查询数据,就使用方案一,如果以第三级及以下的角色查询数据,就使用方案二。
仍以100个角色为例,每个角色要保存三个关系:一级主管角色,二级主管角色,直接主管角色,最多有300条数据。
每往角色组中加一个角色,也需要加入三条数据:角色本身,一级主管角色,二级主管角色。
但往角色组中加一个子组,需要加入的数据量就大一些:子组本身,子组所有角色,子组所有角色的一级主管角色和二级主管角色。如在多个子组中发现同一角色,可重复保存,但应在表中附加说
明是由哪个子组导入的。这样在删除子组时就可以有选择性的删除。
但重复子组的情况就比较麻烦,还有等考虑。假充有组g01,g11,g12,g21。g01包含g11和g12,g11和g12分别包含g21。从g01中删除g11时,如何判断g21的去留?看来还是应当在维护时判断应不应当删除。

