Digamos que nos limitamos a usar el incremento automático id
columna como clave principal. Ahora, también tendremos que asegurarnos de que los datos sean coherentes, es decir, , no hay filas duplicadas para una combinación de (student_id, course_id)
valores. Por lo tanto, tendremos que manejar esto en el código de la aplicación (haga una selección cada vez antes de insertar/actualizar), o podemos arreglar esto estructuralmente definiendo un UNIQUE
Compuesto restricción en (student_id, course_id)
.
Ahora, una clave principal es básicamente una clave ÚNICA NO NULA. Si observa la definición de su tabla, esta restricción ÚNICA recién definida es básicamente solo una clave principal (porque los campos NO son NULOS también). Entonces, en este caso particular, realmente no necesita usar una clave primaria sustituta id
.
La diferencia en los gastos generales durante DML aleatorio (Insertar/Actualizar/Eliminar) será mínima, ya que también tendría gastos generales similares al usar un índice ÚNICO únicamente. Por lo tanto, puede definir una clave compuesta primaria natural (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);
Lo anterior también impondrá la restricción ÚNICA en la combinación de (student_id, course_id)
. Además, ahorrará 4 bytes por fila (tamaño de int
es de 4 bytes). Esto será útil cuando tenga mesas grandes.
Ahora, mientras se unen desde students
a students_courses
tabla, por encima de la clave principal será un índice suficiente. Sin embargo, si necesita unirse desde courses
a students_courses
tabla, necesitará otra llave para este propósito. Entonces, puede definir una clave más en course_id
de la siguiente manera:
ALTER TABLE students_courses ADD INDEX (course_id);
Además, debe definir restricciones de clave externa para garantizar la integridad de los datos:
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);