sql >> Base de Datos >  >> RDS >> Mysql

Índice compuesto para una tabla de relaciones

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