Database design 数据库用户和组模型

Database design 数据库用户和组模型,database-design,usergroups,Database Design,Usergroups,我有两个实体:用户和组。最简单的模型是用户(id、名称等)、组(id、名称)、用户组(用户id、组id)。但我需要将组包括到其他组中。一个用户可以在多个组中,并且组可以包括具有自己的用户和子组的用户和子组! 需要数据库模型的帮助 如今,这是通过将用户和组分解为“角色”来实现的。您所拥有的只是角色,以及角色到其他角色的链接。有些角色的“login”标志设置为true,这使它们实际上是用户,而没有“login”标志设置的角色更像组 主要的想法是,这使一切变得更简单。您不必维护两个单独的概念或实体(用

我有两个实体:用户和组。最简单的模型是用户(id、名称等)、组(id、名称)、用户组(用户id、组id)。但我需要将组包括到其他组中。一个用户可以在多个组中,并且组可以包括具有自己的用户和子组的用户和子组! 需要数据库模型的帮助


如今,这是通过将用户和组分解为“角色”来实现的。您所拥有的只是角色,以及角色到其他角色的链接。有些角色的“login”标志设置为true,这使它们实际上是用户,而没有“login”标志设置的角色更像组

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

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


#DIT:同样关于@xiv解决方案表设计,第三个表是将用户(登录)作为单独管理实体的完全合法的方式。

虽然我同意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)
关联实体:

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)

回复: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

建模的主要症结在于如何将用户和组都视为组的成员。肯·唐斯的方法将解决这个问题。另一种方法是将用户和组视为公共基类型的派生类型:

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)
)

这种方法的一个优点是,它可以防止用户或组意外成为用户的成员-这一限制在架构级别强制实施。

我需要一些示例,因为我是数据库建模的新手。例如,我建议采用另一种方法:编辑您的问题,提供您需要的特定安全性示例如果您想组织,那么我们可以修改答案,以显示这些答案如何适合解决方案。值得一提的是,Adam的解决方案也很有趣,而且可能比我的好。我作弊了——这是Oracle内部使用的用户和组的模型。8-@Adam-嗯,这不就是生活的全部吗?避免车轮的再发明?;-)我也喜欢这个。从未想过这种方法,但它看起来简单、干净、优雅。