データベース スキーマを計画していますが、最善の方法がわからない状況に遭遇しました。私が提案した各ソリューションの長所と短所のリストを実際に探しています。おそらくデータベースのベスト プラクティスに適合する推奨事項が続きます。
したがって、問題は、それらの間に複数の多対多の関係を持つ 2 つのエンティティがあることです。2 つのテーブルは Teams と People です。チームは多くの人で構成され、個人はチームで 1 つまたは複数の役割を持つことができます。役割には、チーム リーダー、チーム メンバー、チーム フォロワーなどがあります。ある人は、特定のチームに対して複数の役割を持つ場合がありますが、理想的には、これらの役割のサブセットは相互に排他的であり、残りは排他的ではありません。
私が検討した解決策は次のとおりです。
1) ロールごとに個別のジャンクション テーブルを作成します。各テーブルの行の存在は、1 人の人物が 1 つのチームに属していることを意味し、特定のテーブルはチームでのその人物の役割を示します。相互に排他的なロールは、アプリケーション レベルで適用する必要があります。
2) 単一のジャンクション テーブルを作成し、そのテーブルに列挙を格納して、個人が持つロールを指定します。特定の人物とチームの組み合わせには、このテーブルに複数の行が含まれる場合があり、その人物がチームで持つ役割ごとに 1 つずつです。特定のロールの相互排他性は、アプリケーション レベルで実施する必要があります。
3) 単一のジャンクション テーブルを作成し、ロールごとに 1 つずつ、ブール フラグのリストをテーブルに保存します。個人とチームの組み合わせごとにテーブルに 1 つの行があり、フラグによってそのチームでのユーザーの役割が決まります。相互に排他的なすべてのロールがテーブルの 1 つの列挙型フィールドを共有できるため、データベース レベルで相互排他性を適用できます。
4) 2 つのジャンクション テーブルを作成します。これは、(2) と (1) を組み合わせたようなもので、相互排他性をデータベース レベルで強制することができます。相互に排他的なロールの列挙を持つ 1 つのジャンクション テーブルがあり、他の (列挙を持つ) ジャンクション テーブルはすべての非排他的なロールを処理します。
私が忘れているものはありますか?最も自然に見える選択肢はどれですか?
ありがとう