C. Trimble 是正确的 (+1)。如果您的菜单项可用于多个角色并且您的用户可以具有多个角色,那么您实际上有两个需要记录的多对多关系。
这意味着您需要再添加一个表,如下所示:
根据 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
)。