Mysql
 sql >> Base de données >  >> RDS >> Mysql

Index composite pour une table de relations

Disons que nous nous en tenons à l'utilisation de l'Auto Increment id colonne comme clé primaire. Maintenant, nous devrons également nous assurer que les données sont cohérentes, c'est-à-dire , il n'y a pas de lignes en double pour une combinaison de (student_id, course_id) valeurs. Donc, nous devrons soit gérer cela dans le code de l'application (faire une sélection à chaque fois avant l'insertion/la mise à jour), soit nous pouvons résoudre ce problème de manière structurelle en définissant un Composite UNIQUE contrainte sur (student_id, course_id) .

Maintenant, une clé primaire est fondamentalement une clé UNIQUE NOT NULL. Si vous regardez la définition de votre table, cette contrainte UNIQUE nouvellement définie est essentiellement une clé primaire uniquement (car les champs ne sont PAS NULL également). Donc, dans ce cas particulier, vous n'avez pas vraiment besoin d'utiliser une clé primaire de substitution id .

La différence de surcharge lors d'un DML aléatoire (insertion/mise à jour/suppression) sera minime, car vous auriez également des surcharges similaires lors de l'utilisation d'un index UNIQUE uniquement. Ainsi, vous pouvez plutôt définir une clé composite primaire naturelle (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);

Ci-dessus appliquera également la contrainte UNIQUE sur la combinaison de (student_id, course_id) . De plus, vous économiserez 4 octets par ligne (taille de int est de 4 octets). Cela sera utile lorsque vous aurez de grandes tables.

Maintenant, tout en rejoignant des students à students_courses table, ci-dessus la clé primaire sera un index suffisant. Cependant, si vous devez vous inscrire à partir de courses à students_courses table, vous aurez besoin d'une autre clé à cet effet. Ainsi, vous pouvez définir une clé supplémentaire sur course_id comme suit :

ALTER TABLE students_courses ADD INDEX (course_id);

De plus, vous devez définir des contraintes de clé étrangère pour garantir l'intégrité des données :

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