私は現在、データベース モデルを設計していますが、問題に遭遇しました。適切な方法と考えられる方法について、もう少し意見を求めたいと思っています。
以下の例では、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" を持っていますか、それとも "それ" が所有者であると言って、代わりに多対多の関係を参照しても問題ありませんか。