Java 自参考数据库设计
我需要设计一个合适的表,使其能够引用自身。我已经有了一个角色和用户表 用户可以有多个角色,并且一个角色可以有多个权限 但当前的问题是,在选择一个权限时,应隐式选择某些权限,例如,如果角色具有“创建”权限,则它应自动具有“查看”和“删除”权限 权限表当前具有id、名称和说明,如何修改它以适应上述功能? 我在想两种方法:Java 自参考数据库设计,java,postgresql,database-design,relational-database,Java,Postgresql,Database Design,Relational Database,我需要设计一个合适的表,使其能够引用自身。我已经有了一个角色和用户表 用户可以有多个角色,并且一个角色可以有多个权限 但当前的问题是,在选择一个权限时,应隐式选择某些权限,例如,如果角色具有“创建”权限,则它应自动具有“查看”和“删除”权限 权限表当前具有id、名称和说明,如何修改它以适应上述功能? 我在想两种方法: 将rightIds列添加到rights表中,该表将有一个由所有子权限ID组成的逗号分隔字符串。例如:CreateRight将具有用于查看和删除right的ID。但缺点是在这种情况下
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
不要这样做。权利本身通常不是层次性的。相反,为用户(或角色)创建一个分配表,如果实现了某些特殊组合,则有一个触发器自动填充其他分配。嘿,我想我之前不清楚,我已经编辑了这个问题。您建议的设计已经到位。你能再看一次吗?太棒了,我觉得很不错。