Diciamo che ci atteniamo a utilizzare l'incremento automatico id
colonna come chiave primaria. Ora, dovremo anche assicurarci che i dati siano coerenti, ovvero , non ci sono righe duplicate per una combinazione di (student_id, course_id)
valori. Quindi, dovremo gestirlo nel codice dell'applicazione (esegui una selezione ogni volta prima di inserire/aggiornare), oppure possiamo risolvere questa cosa strutturalmente definendo un Composite UNIQUE
vincolo su (student_id, course_id)
.
Ora, una chiave primaria è fondamentalmente una chiave UNICA NON NULLA. Se guardi la definizione della tua tabella, questo vincolo UNIQUE appena definito è fondamentalmente solo una chiave primaria (perché anche i campi NON sono NULL). Quindi, in questo caso particolare, non è necessario utilizzare una chiave primaria surrogata id
.
La differenza di spese generali durante DML casuale (Inserisci/Aggiorna/Elimina) sarà minima, poiché avresti anche spese generali simili quando si utilizza solo un indice UNIQUE. Quindi, puoi piuttosto definire una chiave composita primaria naturale (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);
Sopra applicherà anche il vincolo UNIQUE sulla combinazione di (student_id, course_id)
. Inoltre, risparmierai 4 byte per riga (dimensione di int
è 4 byte). Questo sarà utile quando avresti tavoli grandi.
Ora, mentre ti unisci da students
a students_courses
tabella, sopra Chiave primaria sarà un indice sufficiente. Tuttavia, se devi iscriverti da courses
a students_courses
tabella, avrai bisogno di un'altra chiave per questo scopo. Quindi, puoi definire un'altra chiave su course_id
come segue:
ALTER TABLE students_courses ADD INDEX (course_id);
Inoltre, dovresti definire i vincoli della chiave esterna per garantire l'integrità dei dati:
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);