我需要设计一个右表,使其可以引用自身。我已经有一个角色和用户表。
用户可以拥有多个角色,一个角色可以拥有多个权限。
但当前的问题是,在选择一项权限时应该隐式选择某些权限,例如如果角色具有创建权限,那么它应该自动具有查看和删除权限。
权限表当前有 id、名称和描述,如何修改它以适应上述功能? 我考虑了两种方法:
- 将 rightIds 列添加到权限表中,该表将包含所有子权限 ID 的逗号分隔字符串。例如:CREATE 权限将具有 VIEW 和 DELETE 权限的 ID。但缺点是在这种情况下我不能做外键,并且获取它也会很痛苦。
- 添加一个新的映射表,其中包含两列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/