1

我目前正在设计一个具有以下要求的角色驱动菜单的数据库。

 1. Menu items can be assigned to a certain 'role'
 2. A role will be assigned to a user
 3. A user can have multiple roles

我已经设计了数据库,但是在当前设计中我无法将多个角色映射到单个用户。此外,即使我以某种方式将其包含在我的设计中,我也不明白如何在查询时映射重复的菜单项(当用户被分配多个角色时)。

我虽然将角色存储为逗号分隔值,但这会进一步引入复杂性。他们是更好的解决方案吗? 在此处输入图像描述

4

2 回答 2

2

用户和角色之间的关系是多对多关系,因此您将不得不在具有两个外键的表中对关系进行建模。就像是:

UserToRole
====================
UserToRoleId INTEGER
UserId(FK)   INTEGER
RoleId(FK)   INTEGER

然后,您可以使用此表将用户表和角色表连接在一起并获取多个值。

于 2012-11-14T09:04:00.093 回答
2

C. Trimble 是正确的 (+1)。如果您的菜单项可用于多个角色并且您的用户可以具有多个角色,那么您实际上有两个需要记录的多对多关系。

这意味着您需要再添加一个表,如下所示:

ERD

根据 C.Trimble 的回答,该表可以有列,或者您可以有一个只有 UserId + RoleId 的复合主键 - 类似于您的MenuItemRoles表。后者将是我的设计偏好,因为该表是一个纯粹的交集,并且没有特别的理由期望它UserRoles会有与之相关的孩子。

UserRoles请注意,当您检索用户菜单项访问权限时,您可以将链接从to短路,MenuItemRoles因为它们都有一个RoleId列。这意味着您可以直接在交集表之间加入,而不必Roles考虑它。在 TSQL 中,它看起来像:

select I.*   -- Never select * in the real world.
from MenuItem I
  inner join MenuItemRoles IR
  on I.ItemId = IR.ItemId
  inner join UserRoles UR
  on IR.RoleId = UR.RoleId
where
  UR.UserId = @TheUserImLookingFor

你可以在 LINQ 中做同样的事情。如果您使用的是 EF,那么您将不得不走很长一段路(通过Roles)。

于 2012-11-14T13:01:42.500 回答