gpt4 book ai didi

java - 自引用数据库设计

转载 作者:行者123 更新时间:2023-12-01 12:47:53 25 4
gpt4 key购买 nike

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

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

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

权限表当前有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com