java - 自引用数据库设计

标签 java postgresql database-design relational-database

我需要设计一个右表,使其可以引用自身。我已经有一个角色和用户表。

用户可以拥有多个角色,一个角色可以拥有多个权限。

但当前的问题是,在选择一项权限时应该隐式选择某些权限,例如如果角色具有创建权限,那么它应该自动具有查看和删除权限。

权限表当前有 id、名称和描述,如何修改它以适应上述功能? 我考虑了两种方法:

  1. 将 rightIds 列添加到权限表中,该表将包含所有子权限 ID 的逗号分隔字符串。例如:CREATE 权限将具有 VIEW 和 DELETE 权限的 ID。但缺点是在这种情况下我不能做外键,并且获取它也会很痛苦。
  2. 添加一个新的映射表,其中包含两列parentRightId 和childRightId,并且两者都将引用权限作为外键。

这两者哪个应该更好,或者有更好的设计方法吗?在这种情况下,正确的类应该是什么样子。目前它看起来像这样:

class Right{
  private Integer id;
  private String name;
  private String description;
}

最佳答案

我建议使用以下列(其中包括)的权利表:

RightID int primary key
ParentID int foreign key references Right.RightID
Name varchar
Description varchar

这里,Right指的是它自己(ParentID是引用RightID的外键,但可以为空)

因此,如果拥有权利 1 的用户也必须拥有权利 3 和 4,则表格将为:

  RightID   |   ParentID
------------|-------------
        1   |   null
        2   |   null
        3   |      1
        4   |      1

接下来,我假设角色和权限之间存在多对多关系,因此有一个名为 RoleRight 的连接表。

在 RoleRight 中,如果 Role 9 有 Right 1(当然还有 3 和 4),您将拥有:

  RoleID    |   RightID
------------|-------------
        9   |       1

仅需要这一项,因为权利 3 和 4 是权利 1 的子权利(任何拥有权利 1 的人自动拥有权利 3 和 4)

此 SQL 可用于选择给定角色 (X) 的所有权限,包括子权限:

select r.RightID from Right r 
join RoleRight rr on rr.RightID=r.RightID or rr.RightID=r.ParentID 
where RoleID=X

关于java - 自引用数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24509817/

相关文章:

mysql - 多个表中的相同外键

java - Spring Data Rest - 具有默认值的参数

java - 在 Android Studio 中运行 YouTube Activity 时出错

sql - PostgreSQL 嵌套选择查询

SQL 加入多个匹配条件

mysql - 如何一次性将 Collat​​ion 更改为 utf8_bin

java - 为什么我们在 Java 1.6 中从 FileChannel.map 得到 ClosedByInterruptException?

java - 在 Java REST Web 服务中访问部分多部分/表单数据发布请求

postgresql - 在函数中更改架构名称

arrays - 插入到具有复合类型数组的表中