Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zusammengesetzter Index für eine Beziehungstabelle

Nehmen wir an, wir bleiben bei der Verwendung der Auto Increment id Spalte als Primärschlüssel. Jetzt müssen wir auch sicherstellen, dass die Daten konsistent sind, d.h. , gibt es keine doppelten Zeilen für eine Kombination aus (student_id, course_id) Werte. Wir müssen dies also entweder im Anwendungscode handhaben (vor jedem Einfügen/Aktualisieren eine Auswahl treffen) oder wir können dieses Ding strukturell beheben, indem wir einen zusammengesetzten UNIQUE definieren Beschränkung auf (student_id, course_id) .

Nun, ein Primärschlüssel ist im Grunde ein EINZIGARTIGER NICHT NULL-Schlüssel. Wenn Sie sich Ihre Tabellendefinition ansehen, ist diese neu definierte UNIQUE-Einschränkung im Grunde nur ein Primärschlüssel (weil die Felder auch NICHT NULL sind). In diesem speziellen Fall müssen Sie also nicht wirklich einen Ersatz-Primärschlüssel id verwenden .

Der Unterschied im Overhead während zufälliger DML (Einfügen/Aktualisieren/Löschen) ist minimal, da Sie auch ähnliche Overheads haben würden, wenn Sie nur einen UNIQUE-Index verwenden. Sie können also lieber einen natürlichen zusammengesetzten Primärschlüssel (student_id, course_id) definieren :

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

Oben erzwingt auch die UNIQUE-Einschränkung für die Kombination von (student_id, course_id) . Außerdem sparen Sie 4 Byte pro Zeile (Größe von int ist 4 Byte). Dies ist praktisch, wenn Sie große Tabellen haben.

Jetzt beim Beitritt von students zu students_courses Tabelle, über dem Primärschlüssel ist ein ausreichender Index. Wenn Sie jedoch über courses beitreten müssen zu students_courses Tabelle, benötigen Sie hierfür einen weiteren Schlüssel. Sie können also einen weiteren Schlüssel auf course_id definieren wie folgt:

ALTER TABLE students_courses ADD INDEX (course_id);

Darüber hinaus sollten Sie Fremdschlüsselbeschränkungen definieren, um die Datenintegrität sicherzustellen:

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