2017-07-29 3 views
1

私はちょっとユニークな状況があります。私は3モデルです、StudentConsultantです。2つ以上のモデルを持つ多くの関係に属します

学生とコンサルタントの間には、多くの関係があります。
また、学位と学生の間には多くの関係があります。

上記のリレーションのそれぞれについて、ピボットテーブルを2つ持つことができます。
ここで重要なのは、特定の学位を取得した1人のコンサルタントがいることです。
つまり、2つの別個のピボットテーブルを作成しても、コンサルタントが特定のユーザーのためにどの程度の情報を得られるのか分かりません。

私はここで2つの解決策を考えることができます。

最初のもののような3つの外部キーでピボットテーブルを作成します

student_id | degree_id | consultant_id 

このように、私は特定のための学生のコンサルタントが誰であるかを知ることができ度。

これは、データベースを構築する標準的な方法ですか?
また、このためにピボットモデルを作成する必要がありますか?
コードスニペットはどのように見えますか?

私が考えることができる他のアプローチは、2つの別個のピボットテーブルを作成し、もう一方のピボットテーブルの参照idを参照することです。
は、これは何かのように次のようになります。
degree_student:student_id | degree_id
consultant_student:student_id | consultant_id | **degree_student_id**

繰り返しますが、これは標準的なアプローチですか?
このためにピボットモデルを作成する必要がありますか?

最終的な議論のために、より良い(/標準)他のソリューション提案を採用したいと思います。

注:私はherehereをチェックしましたが、私の要件を満たすことができませんでした。

答えて

0

特定の程度の学生が1人のコンサルタント

あなたの最初のデザインは、それを強制することはありませんを持つことができます。 student_idはdegree_studentのstudent_idと異なる場合があります。 degree_student_idには複数のconsultant_idsが存在する可能性があります。また、consultant_idはnull可能でなければなりません。あなたの第一の設計と同様に

--  student student_id is in degree degree_id witout a consultant 
-- AND consultant_id IS NULL 
-- OR student student_id is in degree degree_id with consultant consultant_id 
consultant_degree_student: degree_id | student_id | consultant_id 
(composite) PK (primary key) (degree_id, student_id) 
nullable consultant_id 

あなたの第二のデザイン(つまり暗黙のdegree_student_idフィールドを持っている)と同様に:

余分なID &なしNULL可能フィールドを持つものと同様
-- degree_student_id identifies student student_id being in degree degree_id 
degree_student: degree_student_id | degree_id | student_id 

--  degree_student_id identifies student student_id being in degree degree_id 
-- AND student student_id is in degree degree_id with consultant consultant_id 
degree_student_consultant: degree_student_id | consultant_id 

-- student student_id is in degree degree_id 
degree_student: degree_id | student_id 

-- student student_id is in degree degree_id with consultant consultant_id 
consultant_degree_student: degree_id | student_id | consultant_id 
PK (primary key) (degree_id, student_id) 

複合PKSは、c与えられた(degree_id, student_id)のペアを持つレコードが1つだけなので、consultant_idはペアごとに1つの値になります。正規化によって、これらのテーブルには解決できない問題がないことがわかります。

あなたは他のものの物理的性能とともに、ヌルテーブルの意味(述語)の& simplcity /複雑さを、論理的にテーブルの数をトレードオフするIDの数を持っています。典型的なSQL設計では1番目を使用します。あなたは&を見つける必要があります情報モデリング&リレーショナルデータベース設計のための公開された参照に従ってください。 (PSはまったく「ユニークな状況」ではない)

関連する問題