Mysql
 sql >> Database >  >> RDS >> Mysql

Indice composito per una tabella delle relazioni

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);