Да кажем, че се придържаме към използването на id
Auto Increment колона като първичен ключ. Сега ще трябва също да се уверим, че данните са последователни, т.е. , няма дублиращи се редове за комбинация от (student_id, course_id)
стойности. Така че, ще трябва или да се справим с това в кода на приложението (да правим избор всеки път преди вмъкване/актуализация), или можем да коригираме това нещо структурно, като дефинираме Composite UNIQUE
ограничение за (student_id, course_id)
.
Сега първичният ключ е основно УНИКАЛЕН, НЕ НУЛЕН ключ. Ако погледнете дефиницията на вашата таблица, това новодефинирано ограничение UNIQUE е основно само първичен ключ (защото полетата също НЕ са NULL). Така че, в този конкретен случай, всъщност не е необходимо да използвате сурогатен първичен ключ id
.
Разликата в режийните разходи по време на произволен DML (Вмъкване/Актуализиране/Изтриване) ще бъде минимална, тъй като също ще имате подобни режийни разходи, когато използвате само УНИКАЛЕН индекс. Така че можете по-скоро да дефинирате естествен първичен композитен ключ (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);
По-горе също ще наложи ограничението UNIQUE върху комбинацията от (student_id, course_id)
. Освен това ще спестите 4 байта на ред (размер на int
е 4 байта). Това ще ви дойде удобно, когато имате големи маси.
Сега, докато се присъединявате от students
към students_courses
таблицата над Първичния ключ ще бъде достатъчен индекс. Въпреки това, ако трябва да се присъедините от courses
към students_courses
таблица, ще ви трябва друг ключ за тази цел. Така че можете да дефинирате още един ключ в course_id
както следва:
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);