Да кажем, че се придържаме към използването на 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);