Postgresql 角色权限和用户角色,是否正确映射?
我有一个基本的基于角色的访问控制。单个表用于权限(名称、说明),单个表用于角色(名称、说明)。问题是,如何和用户进行适当的映射?因此,我想到了一个解决方案: 角色权限集-表 (角色权限id主键、角色id(多对一)、权限id(多对一) 用户角色-表 (用户角色id主键、用户id(多对一)、角色权限id(多对一) 用于映射角色权限和用户角色的两个表。有更好的方法吗?你是对的 将其分解为两个独立的多对多关系。一个介于Postgresql 角色权限和用户角色,是否正确映射?,postgresql,database-design,Postgresql,Database Design,我有一个基本的基于角色的访问控制。单个表用于权限(名称、说明),单个表用于角色(名称、说明)。问题是,如何和用户进行适当的映射?因此,我想到了一个解决方案: 角色权限集-表 (角色权限id主键、角色id(多对一)、权限id(多对一) 用户角色-表 (用户角色id主键、用户id(多对一)、角色权限id(多对一) 用于映射角色权限和用户角色的两个表。有更好的方法吗?你是对的 将其分解为两个独立的多对多关系。一个介于用户和角色之间。另一个介于角色和权限之间 这两个多对多关系中的每一个都需要一个类似于您
用户
和角色
之间。另一个介于角色
和权限
之间
这两个多对多关系中的每一个都需要一个类似于您所描述的连接表
我在你的帖子中看到的唯一错误是user\u role
应该包含role\u id
,而不是role\u permission\u id
create table user_role (
user_role_id int serial primary key,
user_id int not null references user(user_id),
role_id int not null references role(role_id),
constraint uq_user_role unique(user_id, role_id)
);
当您想要为用户
获取权限
值列表时:
select distinct p.name
from user_role ur
join role_permission rp on rp.role_id = ur.role_id
join permission p on p.permission_id = rp.permission_id
where ur.user_id = 123;
从理论上讲,我可以省略串行主键,只使用两个多对多表和复合键,它会是一样的吗?角色\权限(角色\ id,权限\ id)用户\角色(用户\ id,角色\ id)或这些序列PK有特殊意义?没有特殊意义。您可以省略它们并使用
(角色id,权限id)
和(用户id,角色id)
作为PKs。二十多年前,我养成了使用标识列的习惯,我可能会继续使用它们,因为在某些情况下,外部工具不喜欢复合键。