【问题标题】:Roles permissions and user roles, proper mapping?角色权限和用户角色,正确映射?
【发布时间】:2020-10-18 00:28:10
【问题描述】:

我有一个基于角色的基本访问控制。权限单表(名称,描述),角色单表(名称,描述)。问题是,如何与用户进行适当的映射?所以我想到了1个解决方案:

role_permission_set - 表格

(role_permission_id PK,role_id(多对一),permission_id(多对一))

user_role - 表

(user_role_id PK, user_id (ma​​ny-to-one), role_permission_id (ma​​ny-to-one))

用于映射角色权限和用户角色的两个表。有更好的方法吗?

【问题讨论】:

    标签: postgresql database-design


    【解决方案1】:

    你有这个权利。

    将其分解为两个独立的多对多关系。一个在userrole 之间。另一个介于rolepermission 之间。

    这两个多对多关系中的每一个都需要一个类似于您描述的连接表。

    我在您的帖子中看到的唯一错误是 user_role 应该包含 role_id 而不是 role_permission_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)
    );
    

    当您想要获取permission 值的列表时,user

    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;
    

    【讨论】:

    • 理论上我可以省略串行主键,只使用两个带有复合键的多对多表,它会是一样的吗? role_permission(role_id, permission_id) user_role(user_id, role_id) 还是这些串口PK有什么特殊含义?
    • 没有特殊含义。您可以省略它们并使用(role_id, permission_id)(user_id, role_id) 作为PK。二十多年前我就养成了使用标识列的习惯,而且我可能会继续使用它们,因为在某些用例中,外部工具不喜欢复合键。
    猜你喜欢
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2014-08-08
    相关资源
    最近更新 更多