Auto Increment id
の使用に固執するとします。 主キーとしての列。次に、データの一貫性を確保する必要もあります。つまり 、(student_id, course_id)
の組み合わせに重複する行はありません 値。したがって、これをアプリケーションコードで処理するか(挿入/更新の前に毎回選択を行う)、コンポジットUNIQUE
を定義することで構造的に修正する必要があります。 (student_id, course_id)
の制約 。
現在、主キーは基本的にUNIQUENOTNULLキーです。テーブル定義を見ると、この新しく定義されたUNIQUE制約は基本的に主キーのみです(フィールドもNULLではないため)。したがって、この特定のケースでは、サロゲート主キーid
を実際に使用する必要はありません。 。
UNIQUEインデックスのみを使用する場合にも同様のオーバーヘッドが発生するため、ランダムDML(挿入/更新/削除)中のオーバーヘッドの違いは最小限に抑えられます。したがって、Natural Primary Composite Key (student_id, course_id)
を定義することもできます。 :
-- Drop the id column
ALTER TABLE students_courses DROP COLUMN id;
-- Add the composite Primary Key
ALTER TABLE students_courses ADD PRIMARY(student_id, course_id);
上記では、(student_id, course_id)
の組み合わせにUNIQUE制約も適用されます 。さらに、4バイトを節約できます 行ごと(int
のサイズ は4バイトです)。これは、大きなテーブルがある場合に便利です。
さて、students
から参加している間 students_courses
へ 上記のテーブルは、主キーで十分なインデックスになります。ただし、courses
から参加する必要がある場合 students_courses
へ テーブルでは、この目的のために別のキーが必要になります。したがって、course_id
でもう1つのキーを定義できます。 次のように:
ALTER TABLE students_courses ADD INDEX (course_id);
さらに、データの整合性を確保するために外部キー制約を定義する必要があります。
ALTER TABLE students_courses ADD FOREIGN KEY (student_id)
REFERENCES students(student_id);
ALTER TABLE students_courses ADD FOREIGN KEY (course_id)
REFERENCES courses(course_id);