Postgresql 角色权限和用户角色,是否正确映射?

Postgresql 角色权限和用户角色,是否正确映射?,postgresql,database-design,Postgresql,Database Design,我有一个基本的基于角色的访问控制。单个表用于权限(名称、说明),单个表用于角色(名称、说明)。问题是,如何和用户进行适当的映射?因此,我想到了一个解决方案: 角色权限集-表 (角色权限id主键、角色id(多对一)、权限id(多对一) 用户角色-表 (用户角色id主键、用户id(多对一)、角色权限id(多对一) 用于映射角色权限和用户角色的两个表。有更好的方法吗?你是对的 将其分解为两个独立的多对多关系。一个介于用户和角色之间。另一个介于角色和权限之间 这两个多对多关系中的每一个都需要一个类似于您

我有一个基本的基于角色的访问控制。单个表用于权限(名称、说明),单个表用于角色(名称、说明)。问题是,如何和用户进行适当的映射?因此,我想到了一个解决方案:

角色权限集-表

(角色权限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。二十多年前,我养成了使用标识列的习惯,我可能会继续使用它们,因为在某些情况下,外部工具不喜欢复合键。