4

我有 2 个实体:用户和组。最简单的模型是 user(id,name,etc...), group(id,name), user_group_rel(user_id,group_id)。但我需要将组包括到其他组中。一个用户可以在多个组中,并且组可以包括具有自己的用户和子组的用户和子组!需要数据库模型方面的帮助!

用户和组

4

4 回答 4

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)
于 2011-02-18T15:46:32.267 回答
3

如今,这是通过将用户和组折叠成“角色”来完成的。你所拥有的只是角色,以及角色与其他角色的联系。一些角色将“登录”标志设置为 true,这使它们成为有效用户,而没有设置“登录”标志的角色更像组。

主要思想是这使一切变得更简单。您不必维护两个独立的概念或实体(用户和组),而只需维护一个概念:角色。然后,您为用户使用该“登录”标志。

编辑:对于表结构,请查看@XIVSolutions 提供的第一个选项,他详细说明了我上面提到的内容。它回答了您关于将一个角色置于任意数量的其他角色中的问题。第二个表,交叉引用,列出了一个角色及其父级。如果一个角色有多个父级,这意味着该表中有多个条目,那么这就像在多个组中有一个用户。

#DIT:也 re:@XIVSolutions 表设计,第三个表是让用户(登录)作为单独管理的实体的完全合法的方式。

于 2011-02-18T14:21:35.277 回答
2

回复:肯唐斯解决方案:

我玩过这个的两个版本(很想听听这是否在目标上......):

选项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
于 2011-02-19T06:48:09.330 回答
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)
)

这种方法的一个优点是它可以防止用户或组意外成为用户的成员 - 此限制在模式级别强制执行。

于 2011-02-19T07:34:47.573 回答