Låt oss säga att vi håller oss till att använda Auto Increment id
kolumn som primärnyckel. Nu måste vi också se till att data är konsekventa, dvs. , det finns inga dubbletter av rader för en kombination av (student_id, course_id)
värden. Så vi måste antingen hantera detta i applikationskoden (gör ett val varje gång innan infogning/uppdatering), eller så kan vi fixa det här strukturellt genom att definiera en sammansatt UNIQUE
begränsning på (student_id, course_id)
.
Nu är en primärnyckel i grunden en UNIK INTE NULL-nyckel. Om du tittar på din tabelldefinition är denna nydefinierade UNIKA begränsning i princip endast en primärnyckel (eftersom fälten INTE är NULL också). Så i det här fallet behöver du egentligen inte använda en surrogatprimärnyckel id
.
Skillnaden i omkostnader under slumpmässig DML (Infoga/Uppdatera/Ta bort) kommer att vara minimal, eftersom du också skulle ha liknande omkostnader när du bara använder ett UNIKT index. Så du kan snarare definiera en naturlig primär sammansatt nyckel (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);
Ovan kommer också att tillämpa den UNIKA begränsningen på kombinationen av (student_id, course_id)
. Dessutom kommer du att spara 4 byte per rad (storlek på int
är 4 byte). Detta kommer att vara praktiskt när du skulle ha stora bord.
Nu när du går med från students
till students_courses
tabellen ovan Primärnyckel kommer att vara ett tillräckligt index. Men om du behöver gå med från courses
till students_courses
tabell behöver du en annan nyckel för detta ändamål. Så du kan definiera ytterligare en nyckel på course_id
enligt följande:
ALTER TABLE students_courses ADD INDEX (course_id);
Dessutom bör du definiera Foreign Key-begränsningar för att säkerställa dataintegritet:
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);