我正在尝试创建高性能逻辑,以确定层次结构组织中的权限。
员工被分配到一个或多个单位。单位是层次的(理论上)无限深度(实际上它不超过6层)。
例如,员工Jane
可能是Supervisor
单位的Accounts Receivable
(Accounting
单位的孩子),也可能是Member
的{{1}} Ethics Committee
(Committees
的孩子,本身就是Office of the CEO
的孩子。
作为Supervisor
的{{1}},Accounts Receivable
应该有权查看Jane
中所有其他人的人事档案,但不能查看Accounts Receivable
中的人事档案,因为她是Ethics Committee
只是一个Member
。同样地,Accounts Receivable
单位的常规员工不应该能够查看彼此的个人资料,尽管他们都需要获得查看公司会计记录的许可。
我想这个数据库架构看起来像是:
| **employees** | **units** | **positions** | **assignments** | **permissions** |
| ------------- | ----------- | ------------- | --------------- | --------------- |
| id | id | id | employee_id | unit_id |
| name | name | title | unit_id | is_management |
| | parent_path | is_management | position_id | ability |
考虑到这一点,我如何编写一个高性能查询来确定Jane
对Sam
的{{1}},Accountant
Accounts Receivable
与Bill
之间的权限。 } {} Receptionist
中的Office of the CEO
?
我最接近的是:
create function permissions(actor employees, subject employees) returns setof permissions as $$
begin
for unit_id in select unit_id from assignments where employee_id = subject.id loop
select permissions.name
from assignments
left join units on (unit.id = assignments.unit_id)
left join positions on (positions.id = assignments.position_id)
left join permissions on (
permissions.unit_id = units.id
and permissions.is_management = positions.is_management
)
where assignments.user_id = actor.id
and (units.parent_path = unit_id or units.parent_path @> unit_id)
end loop;
end;
$$ language plpgsql stable;