Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Índice composto para uma tabela de relacionamento


Digamos que continuemos usando o Incremento Automático id coluna como Chave Primária. Agora, também precisamos garantir que os dados sejam consistentes, ou seja, , não há linhas duplicadas para uma combinação de (student_id, course_id) valores. Portanto, precisaremos lidar com isso no código do aplicativo (fazer uma seleção toda vez antes de inserir/atualizar) ou podemos corrigir isso estruturalmente definindo um UNIQUE composto restrição em (student_id, course_id) .

Agora, uma chave primária é basicamente uma chave UNIQUE NOT NULL. Se você observar sua definição de tabela, essa restrição UNIQUE recém-definida é basicamente apenas uma Chave Primária (porque os campos também NÃO são NULL). Portanto, neste caso específico, você realmente não precisa usar uma chave primária substituta id .

A diferença nas sobrecargas durante o DML aleatório (Inserir/Atualizar/Excluir) será mínima, pois você também teria sobrecargas semelhantes ao usar apenas um índice UNIQUE. Então, você pode definir uma chave composta primária natural (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);

Acima também aplicará a restrição UNIQUE na combinação de (student_id, course_id) . Além disso, você economizará 4 bytes por linha (tamanho de int é de 4 bytes). Isso será útil quando você tiver mesas grandes.

Agora, ao ingressar de students para students_courses tabela, acima da Chave Primária será um índice suficiente. No entanto, se você precisar ingressar em courses para students_courses tabela, você precisará de outra chave para esta finalidade. Assim, você pode definir mais uma chave em course_id do seguinte modo:
ALTER TABLE students_courses ADD INDEX (course_id);

Além disso, você deve definir restrições de chave estrangeira para garantir a integridade dos dados:
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);