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