データモデリングは、関係図で現実の世界を表現する技術です。あなたのモードは正しいですが、それは本当ですか?
考えてみてください、クラスとは何ですか?それは教師、主題、そして成績です。それらはあなたの関係です。さらに、SUBJECTがそのGRADEに適切であり、TEACHERがそのSUBJECTをそのGRADEで教えることができるというルールを適用する必要があります。
あなたの問題は、交差点テーブルでの代理キーの使用にあると思います。これらは、多対多の関係を表すテーブルです:teacher_subject
、grade_subject
。これらはとにかく合成テーブルであり、とにかくキーのみで構成されています。したがって、複合主キーで十分です。
grade_subject(subject_id, grade_id)
代理主キーには意味がないため、('PHYSICS'、'YEAR 2')の2つのレコードがないことを確認するために、に一意の制約を定義する必要があります。それgrade_subject
が他の列のない交差テーブルであるとすると、代理キーを追加しても意味がありません。代理キーの価値は、ビジネスキーの変更による影響を最小限に抑えることです。ただしgrade_subject
、ビジネスキーはなく、2つの代理キーsubject_id
とgrade_id
。
これには、参照整合性を定義する場合に利点があります。
だから私はあなたの問題にこのようにアプローチします:
grade_subject
----------------
grade_id
subject_id
primary key (grade_id, subject_id)
foreign key (grade_id) reference grade (grade_id)
foreign key (subject_id) reference subject (subject_id)
teacher_subject
---------------------
teacher_id
grade_id
subject_id
primary key (teacher_id,grade_id, subject_id)
foreign key (grade_id) reference grade (grade_id)
foreign key (subject_id) reference subject (subject_id)
foreign key (teacher_id) reference teacher (teacher_id)
foreign key (grade_id,subject_id) reference grade_subject (grade_id,subject_id)
Class
-----------------------------------
id
teacher_id
grade_id
subject_id
primary key (id)
foreign key (grade_id) reference grade (grade_id)
foreign key (subject_id) reference subject (subject_id)
foreign key (teacher_id) reference teacher (teacher_id)
foreign key (grade_id,subject_id) reference grade_subject (grade_id,subject_id)
foreign key (teacher_id,grade_id,subject_id) reference teacher_subject (teacher_id,grade_id,subject_id)
これは外部キーの山のように見えるかもしれません、そして私はレビュー段階でいくつかの議論を想像することができます。(私は外部キーを含めているgrade_subject
ので、私はそれほど気にしないで譲歩することができる何かを持っています)。
しかし、TEACHER_SUBJECTなどの補助的な関係によって強制されることによって、CLASS_SUBJECTなどの重要なデータ関係が曖昧になるのは好きではありません。CLASSをSUBJECTに参加させるために、TEACHER_SUBJECTとSUBJECT_GRADEに参加する必要はありません。
さて、後者が前者を間接的に強制するのに、なぜ単一の親テーブルと交差テーブルに参照整合性制約を含めることを選択するのですか?モデル内の関係がより明確になるためです。物理データベースでは、単一テーブルの外部キーを省略するか、無効にして、交差テーブルの関係整合性を信頼する可能性があるため、モデルで強調します。
トリプルカラムコンポジットについての何かが私を悩ませています、そして私はそれがこれだと思います:それは十分に正規化されていません。特殊なケースがあるかもしれませんが、より一般的なモデルは、TEACHER_SUBJECTとTEACHER_GRADEの2つのルールになります。このようになります
teacher_subject
---------------------
teacher_id
subject_id
primary key (teacher_id, subject_id)
foreign key (subject_id) reference subject (subject_id)
foreign keye (teacher_id) reference teacher (teacher_id)
teacher_grade
---------------------
teacher_id
grade_id
primary key (teacher_id,grade_id)
foreign key (grade_id) reference grade (grade_id)
foreign key (teacher_id) reference teacher (teacher_id)
Class
-----------------------------------
id
teacher_id
grade_id
subject_id
primary key (id)
foreign key (grade_id) reference grade (grade_id)
foreign key (subject_id) reference subject (subject_id)
foreign key (teacher_id) reference teacher (teacher_id)
foreign key (grade_id,subject_id) reference grade_subject (grade_id,subject_id)
foreign key (teacher_id,subject_id) reference teacher_subject (teacher_id,subject_id)
foreign key (teacher_id,grade_id) reference teacher_grade (teacher_id,grade_id)
もちろん、Drury氏が数学を4番目のフォーマーに、物理学を6番目のフォーマーにしか教えることができないというルールを適用したい場合は、TEACHER_SUBJECT_GRADEテーブルが必要になります。
データモデルが対処していないことの1つは、スケジューリングの問題です。学校の時間割はメッシュ化する必要があるため、クラスは事前に決定されたグリッドに収まる必要があります。おそらく、タイムテーブルのスロットを別のテーブルとして定義し、CLASSをそれにリンクする必要があります。クラスには教室も必要です。それは別の表です。