sql >> Database teknologi >  >> RDS >> Mysql

Sammensat indeks for en relationstabel

Lad os sige, at vi holder os til at bruge Auto Increment id kolonne som primær nøgle. Nu skal vi også sikre, at dataene er konsistente, dvs. , der er ingen duplikerede rækker for en kombination af (student_id, course_id) værdier. Så vi bliver nødt til enten at håndtere dette i applikationskoden (udfør et valg hver gang før indsættelse/opdatering), eller vi kan ordne denne ting strukturelt ved at definere en sammensat UNIQUE begrænsning på (student_id, course_id) .

Nu er en primær nøgle dybest set en UNIK IKKE NULL nøgle. Hvis du ser på din tabeldefinition, er denne nydefinerede UNIKKE begrænsning dybest set kun en Primær Nøgle (fordi felterne også IKKE er NULL). Så i dette særlige tilfælde behøver du ikke rigtig bruge en surrogat primær nøgle id .

Forskellen i overhead under tilfældig DML (Indsæt/Opdater/Slet) vil være minimal, da du også ville have lignende omkostninger, når du kun bruger et UNIKT indeks. Så du kan hellere definere en naturlig primær sammensat nøgle (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);

Ovenstående vil også håndhæve den UNIKKE begrænsning på kombinationen af ​​(student_id, course_id) . Desuden sparer du 4 bytes pr. række (størrelse på int er 4 bytes). Dette vil være praktisk, når du vil have store borde.

Nu, mens du deltager fra students til students_courses tabel ovenfor Primærnøgle vil være et tilstrækkeligt indeks. Men hvis du har brug for at deltage fra courses til students_courses tabel, skal du bruge en anden nøgle til dette formål. Så du kan definere en nøgle mere på course_id som følger:

ALTER TABLE students_courses ADD INDEX (course_id);

Desuden bør du definere Foreign Key-begrænsninger for at sikre 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);



  1. Top 'n' resultater for hvert søgeord

  2. Ret forespørgsel for at få det aktuelle antal forbindelser i en PostgreSQL DB

  3. Hvordan finder man alle tabeller, der har fremmednøgler, der refererer til bestemt table.column og har værdier for disse fremmednøgler?

  4. 19 Onlineressourcer til at lære om databasedesignfejl