我有2个实体:用户和群组。最简单的模型是用户(id,name等),group(id,name),user_group_rel(user_id,group_id)。但我需要将小组纳入其他小组。一个用户可以在许多组中,组可以包括具有自己的用户和子组的用户和子组! 需要数据库模型的帮助!
答案 0 :(得分:4)
虽然我同意Ken Down的命名法,但我不一定同意用户和角色是同一个实体。
基本实体:
Users (user_id, user name, real name, user_status, etc)
Role (role_id, role name, role_password, etc)
Privilege (priv_id, base object, functionality, what have you)
关联实体:
User has Role (0 - n) (user_id, role_id)
Role has Role (0 - n) (role_id, has_role_id)
User has Privilege (0 - n) (user_id, priv_id)
Role has Privilege (0 - n) (role_id, priv_id)
答案 1 :(得分:3)
目前,这是通过将用户和群组折叠为“角色”来完成的。您拥有的只是角色,以及将角色链接到其他角色。某些角色的“login”标志设置为true,这使得它们实际上是用户,而没有设置“login”标志的角色更像是组。
主要思想是让一切变得更简单。您不必维护两个单独的概念或实体(用户和组),而只需维护一个概念:角色。然后为用户使用“登录”标志。
编辑:对于表结构,请查看@XIVSolutions提供的第一个选项,他说明了我上面提到的内容。它回答了关于将一个角色放入任何其他角色的问题。第二个表是交叉引用,它列出了一个角色及其父级。如果一个角色有多个父项,意味着该表中有多个条目,那么这就像在一个组中有一个用户一样。
#DIT :还有:@XIVSolutions表设计,第三个表是将用户(登录)作为单独管理实体的完全合法方式。
答案 2 :(得分:2)
re:Ken Downs解决方案:
我玩了两个版本(并且很乐意听到它是否在目标上......):
选项1:
**tblRole**
RoleID PK
RoleName
**tblRoleIndex**
ParentRoleID FK on tblRole
ChildRoleID FK ON tblRole
NOTE: ParentRoleID and ChildRoleID form a composite Primary key in the above table.
**tblLogIns**
LogInID PK
RoleID
PassWord
或者,选项2:
**tblRole**
RoleID
ParentRoleID Recursive FK on tblRole.RoleID
RoleName
NOTE: A top-level role in the table above has a default ParentRoleID of -1 or 0
**tblLogIns**
LogInID PK
RoleID
PassWord
答案 3 :(得分:2)
对此建模的主要关键点是如何将用户和组都视为组成员。 Ken Downs的方法将解决这个问题。另一种方法是将用户和组视为公共基类型的派生类型:
create table groupmemberbase
(
memberid int,
--optional flag to idicate the type of the derived entity
--this is similar to the login flag used by Ken Downs
membertype int,
primary key (memberid)
)
create table users
{
memberid int,
--more user attributes here
primary key (memberid),
foreign key (memberid) references groupmemberbase (memberid)
)
create table groups
(
memberid int,
--more group attributes here
primary key (memberid),
foreign key (memberid) references groupmemberbase (memberid)
)
create table groupmembers
(
groupid int,
memberid int,
primary key (groupid, memberid),
foreign key (groupid) references groups (memberid)
foreign key (memberid) references groupmemberbase (memberid)
)
此方法的一个优点是可以防止用户或组意外成为用户的成员 - 此限制在架构级别强制执行。