Laten we zeggen dat we vasthouden aan het gebruik van de Auto Increment id
kolom als primaire sleutel. Nu moeten we er ook voor zorgen dat de gegevens consistent zijn, d.w.z. , er zijn geen dubbele rijen voor een combinatie van (student_id, course_id)
waarden. We zullen dit dus ofwel in applicatiecode moeten verwerken (elke keer selecteren voor het invoegen/updaten), of we kunnen dit structureel oplossen door een Composite UNIQUE
te definiëren beperking op (student_id, course_id)
.
Nu is een primaire sleutel in feite een UNIEKE NIET NULL-sleutel. Als u naar uw tabeldefinitie kijkt, is deze nieuw gedefinieerde UNIEKE beperking in feite alleen een primaire sleutel (omdat de velden ook NIET NULL zijn). Dus in dit specifieke geval hoeft u niet echt een surrogaat primaire sleutel id
te gebruiken .
Het verschil in overhead tijdens willekeurige DML (Insert/Update/Delete) zal minimaal zijn, aangezien u vergelijkbare overheadkosten zou hebben als u alleen een UNIEKE index gebruikt. U kunt dus liever een natuurlijke primaire samengestelde sleutel definiëren (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);
Hierboven wordt ook de UNIEKE beperking afgedwongen op de combinatie van (student_id, course_id)
. Bovendien bespaart u 4 bytes per rij (grootte van int
is 4 bytes). Dit is handig als je grote tafels hebt.
Nu, terwijl je meedoet van students
naar students_courses
tabel, boven de primaire sleutel is een voldoende index. Als u echter moet deelnemen aan courses
naar students_courses
table heeft u hiervoor een andere sleutel nodig. U kunt dus nog een sleutel definiëren op course_id
als volgt:
ALTER TABLE students_courses ADD INDEX (course_id);
Bovendien moet u beperkingen voor externe sleutels definiëren om de gegevensintegriteit te waarborgen:
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);