Lad os sige, at vi holder os til at bruge Auto Increment id
kolonne som primær nøgle. Nu skal vi også sikre, at dataene er konsistente, dvs. , der er ingen duplikerede rækker for en kombination af (student_id, course_id)
værdier. Så vi bliver nødt til enten at håndtere dette i applikationskoden (udfør et valg hver gang før indsættelse/opdatering), eller vi kan ordne denne ting strukturelt ved at definere en sammensat UNIQUE
begrænsning på (student_id, course_id)
.
Nu er en primær nøgle dybest set en UNIK IKKE NULL nøgle. Hvis du ser på din tabeldefinition, er denne nydefinerede UNIKKE begrænsning dybest set kun en Primær Nøgle (fordi felterne også IKKE er NULL). Så i dette særlige tilfælde behøver du ikke rigtig bruge en surrogat primær nøgle id
.
Forskellen i overhead under tilfældig DML (Indsæt/Opdater/Slet) vil være minimal, da du også ville have lignende omkostninger, når du kun bruger et UNIKT indeks. Så du kan hellere definere en naturlig primær sammensat nøgle (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);
Ovenstående vil også håndhæve den UNIKKE begrænsning på kombinationen af (student_id, course_id)
. Desuden sparer du 4 bytes pr. række (størrelse på int
er 4 bytes). Dette vil være praktisk, når du vil have store borde.
Nu, mens du deltager fra students
til students_courses
tabel ovenfor Primærnøgle vil være et tilstrækkeligt indeks. Men hvis du har brug for at deltage fra courses
til students_courses
tabel, skal du bruge en anden nøgle til dette formål. Så du kan definere en nøgle mere på course_id
som følger:
ALTER TABLE students_courses ADD INDEX (course_id);
Desuden bør du definere Foreign Key-begrænsninger for at sikre dataintegritet:
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);