sql >> Databasteknik >  >> RDS >> Mysql

Sammansatt index för en relationstabell

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



  1. MariaDB Backup &PostgreSQL i molnet - ClusterControl Release 1.6.1

  2. Hur man lägger till dagar till ett datum i MySQL

  3. Hur söker jag efter en sträng i en SQL Server-databas?

  4. MySQL SELECT WHERE datetime matchar dag (och inte nödvändigtvis tid)