Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自参考数据库设计_Java_Postgresql_Database Design_Relational Database - Fatal编程技术网

Java 自参考数据库设计

Java 自参考数据库设计,java,postgresql,database-design,relational-database,Java,Postgresql,Database Design,Relational Database,我需要设计一个合适的表,使其能够引用自身。我已经有了一个角色和用户表 用户可以有多个角色,并且一个角色可以有多个权限 但当前的问题是,在选择一个权限时,应隐式选择某些权限,例如,如果角色具有“创建”权限,则它应自动具有“查看”和“删除”权限 权限表当前具有id、名称和说明,如何修改它以适应上述功能? 我在想两种方法: 将rightIds列添加到rights表中,该表将有一个由所有子权限ID组成的逗号分隔字符串。例如:CreateRight将具有用于查看和删除right的ID。但缺点是在这种情况下

我需要设计一个合适的表,使其能够引用自身。我已经有了一个角色和用户表

用户可以有多个角色,并且一个角色可以有多个权限

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

权限表当前具有id、名称和说明,如何修改它以适应上述功能? 我在想两种方法:

  • 将rightIds列添加到rights表中,该表将有一个由所有子权限ID组成的逗号分隔字符串。例如:CreateRight将具有用于查看和删除right的ID。但缺点是在这种情况下我不能使用外键,获取外键也会很痛苦
  • 添加一个新的映射表,该表将有两列parentRightId和childRightId,这两列都将引用权限作为外键
  • 这两者中哪一个应该更好,还是有更好的设计方法?在这种情况下,正确的类应该是什么样的。现在看起来是这样的:

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

    因此,您拥有用户和权限,并且希望为这些用户分配一些预定义的权限集。我不确定自引用是否是最好的解决方案(主要用于树/层次结构),但我有一个可能有意义的想法:

    我建议引入一个角色表,以通过以下方式使其更可自定义,并解决用户、角色和权限(即多对多连接)与助手表之间的连接:

    用户(id,名称)-角色(id,名称)-权限(id,名称)

    任务:

    用户角色(用户id、角色id)

    角色权限(角色id、权限id)


    使用此模型,您可以为特定用户分配多个角色,并可以在角色下创建多组权限。

    我建议使用包含以下列的权限表:

    RightID int primary key
    ParentID int foreign key references Right.RightID
    Name varchar
    Description varchar
    
    这里,Right指的是它自己(ParentID是指RightID的外键,但可以为null)

    因此,如果具有权限1的用户也必须具有权限3和4,则该表将为:

      RightID   |   ParentID
    ------------|-------------
            1   |   null
            2   |   null
            3   |      1
            4   |      1
    
    接下来,我假设角色和权限之间存在多对多关系,因此有一个名为RolerRight的联接表

    在RolerRight中,如果角色9拥有权限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
    

    不要这样做。权利本身通常不是层次性的。相反,为用户(或角色)创建一个分配表,如果实现了某些特殊组合,则有一个触发器自动填充其他分配。嘿,我想我之前不清楚,我已经编辑了这个问题。您建议的设计已经到位。你能再看一次吗?太棒了,我觉得很不错。