1

私は現在、データベース モデルを設計していますが、問題に遭遇しました。適切な方法と考えられる方法について、もう少し意見を求めたいと思っています。

以下の例では、Persons と Roles という 2 つのテーブルがあります。現在、1 人に 0 個以上のロールを割り当てることができます。これは、多対多の関係では非常に単純ですが、ユーザーが現在「操作」しているロールを選択できるようにする場合は、注意が必要です。

ユーザーが 5 つの役割から選択したとします。現在選択している役割に応じて、アプリケーションはさまざまなビュー、メニュー、ボタンなどを表示します。

ここに 2 つの解決策があります。

1: (下にリンクされている画像の上部を参照)

person テーブルには、多対多のリレーションシップ (関連付けエンティティ) に対する null 許容 FK を含めます。

関連エンティティに関するウィキペディアから

「他のエンティティ」がこの関係を参照しても問題ないようです。これに Roles エンティティと Persons エンティティが含まれているかどうかは完全にはわかりません。

この設計で私が気に入っているのは、その人に許可されているすべての役割のリストを簡単に取得できることです。次に、許可されている役割の 1 つを指して、「あなたは現在/アクティブな役割です」と言うだけです。これは、ユーザーがロールにアクセスできる場合にのみ、現在のロールを持つことができるようにする良い方法のようにも感じます... ただ、ここで潜在的な災害も見られます: 人テーブルの FK が参照する場合別のユーザーのその関係。DB の設計により、これが可能になります。それを防ぐのはコードだけです。

2: (下にリンクされている画像の下部を参照)

連想エンティティをシンプルに保ち、代わりにロール テーブル内の特定のロールを指す person テーブルに FK を設定します。

ここでの問題は、人の「現在の役割」が実際に「許可されている」役割であることを確認するために、DB 設計から得られる助けがさらに少ないことです。

サンプル画像

これについてのご意見は大歓迎です =)

更新: 同じ問題の別のバリエーションを含めます。

2 つのエンティティ: WorkOrders と Sites

  • 1 つのサイトが多数の作業指示書にアクセスできる可能性があります
  • 1 つの WorkOrder は多くのサイトからアクセスされる可能性があります

したがって、多対多の関係があります

問題: 作業指示書を所有するサイトが 1 つしか存在できない場合、どのサイトが作業指示書の所有者であるかをデータベースに保存するにはどうすればよいでしょうか。

WorkOrder テーブルの列として "OwnerSiteId" を持っていますか、それとも "それ" が所有者であると言って、代わりに多対多の関係を参照しても問題ありませんか。

4

2 に答える 2

0


1 人が多くのロールを持つことができるが、アクティブなロールは 1 つしか持てない という要件がある
場合、はいの場合、両方の設計に次の長所と短所があります

-設計 1. PERSON テーブルに ROLE テーブルのキーを持つ利点: 結合が減るため、データベース操作のコストが削減されます。短所: ユーザーの許可リストにないロールをユーザーに割り当てることができます。

  • 設計 2. PERSON テーブルに Associate Entity テーブルのキーを持つ 長所: PERSON には、許可されている ROLES のみが割り当てられます。短所: 最初のアプローチよりも追加の結合コストが 1 つ発生します。

結論:もし私があなただったら、デザイン 1 に行き、アプリケーションからの役割の割り当てを確実にします。

于 2012-10-16T13:31:13.617 に答える
0

現在のロールを他のセッション データと一緒に保存します。

于 2012-10-16T13:15:21.143 に答える