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

データベースを設計しましたが、現在の設計では複数のロールを 1 人のユーザーにマップできません。また、重複したメニュー項目 (ユーザーに複数のロールが割り当てられている場合) をクエリ中にどのようにマップするのか、設計に含めてもわかりません。

役割をカンマ区切りの値として保存することについて考えましたが、それはさらに複雑になります。彼らはより良い解決策ですか? ここに画像の説明を入力

4

2 に答える 2

2

ユーザーとロールの関係は多対多の関係であるため、2 つの外部キーを持つテーブルで関係をモデル化する必要があります。何かのようなもの:

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

このテーブルを使用して、Users テーブルと Roles テーブルを結合し、複数の値を取得できます。

于 2012-11-14T09:04:00.093 に答える
2

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

つまり、次のように、テーブルをもう 1 つ追加する必要があります。

ERD

このテーブルには、C. Trimble の回答に従って列を含めることができます。または、MenuItemRolesテーブルに類似した、UserId + RoleId だけの複合主キーを含めることもできます。UserRolesテーブルは純粋な交差であり、それに関連する子を持つことを期待する特別な理由がないため、後者が私のデザインの好みです。

ユーザー メニュー項目へのアクセスを取得する場合は、どちらにも列があるため、 からUserRolesへのリンクを短絡できることに注意してください。これは、交差テーブルを除外して、交差テーブル間を直接結合できることを意味します。TSQL では次のようになります。MenuItemRolesRoleIdRoles

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 に答える