Załóżmy, że trzymamy się automatycznego zwiększania id
kolumna jako klucz podstawowy. Teraz musimy również upewnić się, że dane są spójne, tj. , nie ma zduplikowanych wierszy dla kombinacji (student_id, course_id)
wartości. Tak więc, będziemy musieli albo obsłużyć to w kodzie aplikacji (wykonaj wybór za każdym razem przed wstawieniem/aktualizacją), albo możemy naprawić to strukturalnie, definiując Composite UNIQUE
ograniczenie na (student_id, course_id)
.
Teraz klucz podstawowy jest w zasadzie kluczem UNIQUE NOT NULL. Jeśli spojrzysz na definicję tabeli, to nowo zdefiniowane ograniczenie UNIQUE jest w zasadzie tylko kluczem podstawowym (ponieważ pola również NIE są NULL). Tak więc w tym konkretnym przypadku tak naprawdę nie musisz używać zastępczego klucza podstawowego id
.
Różnica w narzutach podczas losowego DML (wstawianie/aktualizacja/usuwanie) będzie minimalna, ponieważ podobne narzuty będą również występowały w przypadku korzystania wyłącznie z indeksu UNIQUE. Możesz więc raczej zdefiniować naturalny podstawowy klucz złożony (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);
Powyższe wymusi również ograniczenie UNIQUE na kombinację (student_id, course_id)
. Co więcej, zaoszczędzisz 4 bajty na wiersz (rozmiar int
wynosi 4 bajty). Przyda się to, gdy będziesz mieć duże stoły.
Teraz, podczas dołączania od students
do students_courses
tabeli powyżej Klucz podstawowy będzie wystarczającym indeksem. Jeśli jednak chcesz dołączyć z courses
do students_courses
tabeli, do tego celu potrzebny będzie inny klucz. Możesz więc zdefiniować jeszcze jeden klucz w course_id
w następujący sposób:
ALTER TABLE students_courses ADD INDEX (course_id);
Ponadto należy zdefiniować ograniczenia klucza obcego, aby zapewnić integralność danych:
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);