C. トリンブルは正しい (+1)。メニュー項目が複数の役割で使用可能であり、ユーザーが複数の役割を持つことができる場合、実際には記録する必要がある2 つの多対多の関係があります。
つまり、次のように、テーブルをもう 1 つ追加する必要があります。

このテーブルには、C. Trimble の回答に従って列を含めることができます。または、MenuItemRoles
テーブルに類似した、UserId + RoleId だけの複合主キーを含めることもできます。UserRoles
テーブルは純粋な交差であり、それに関連する子を持つことを期待する特別な理由がないため、後者が私のデザインの好みです。
ユーザー メニュー項目へのアクセスを取得する場合は、どちらにも列があるため、 からUserRoles
へのリンクを短絡できることに注意してください。これは、交差テーブルを除外して、交差テーブル間を直接結合できることを意味します。TSQL では次のようになります。MenuItemRoles
RoleId
Roles
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
) を移動する必要があります。