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

Vinculando uma terceira tabela a uma tabela de ponte em uma associação de muitos para muitos


+1 para Matt Fenwick. Eu acrescentaria que você quer ter um pouco de cuidado com suas restrições de chave estrangeira. Basicamente, você tem duas opções, as quais podem acabar parecendo bastante semelhantes, dependendo da sua escolha de chaves primárias.

Opção um é:Esqueça a simples interseção entre TEACHER e INSTRUMENT e substitua-o por uma interseção complexa que inclui teacher_id , instrument_id e level_id . Todas essas três colunas seriam a chave primária (composta) dessa tabela de interseção. Nesta opção, você tem restrições de chave estrangeira definidas em teacher_id e instrument_id (e level_id se esta for realmente uma chave estrangeira para um LEVEL tabela e não apenas um código inteiro ou string).

Opção dois é:Mantenha a interseção simples entre TEACHER e INSTRUMENT (vamos chamá-lo de TEACHER_INSTRUMENT mesmo que isso não tenha imaginação) e adicione uma tabela sub-filho que defina os níveis que podem ser ensinados. Esta tabela sub-filho (vamos chamá-la de SKILL ) tem um level_id e uma chave estrangeira para TEACHER_INSTRUMENT . Se a chave primária de TEACHER_INSTRUMENT é a combinação de teacher_id e instrument_id então a SKILL table terá as mesmas três colunas da opção um. O que diferencia esta opção? A restrição de chave estrangeira de SKILL deve ser para a tabela de interseção, não para TEACHER e INSTRUMENT .

Por que isso é importante? Se você escolher a opção um, pode ser necessário ter alguma lógica de consulta extra para obter uma grade de habilidades totalmente preenchida, uma vez que não há restrição de integridade referencial que você possa definir para garantir que todos os níveis de habilidade sejam preenchidos para cada combinação de professor/instrumento.

Por outro lado, se você escolher a opção dois, você tem a vantagem de separar as preocupações entre quem pode usar o quê e quão bem eles podem ensiná-lo.

O que você quer evitar é ter uma tabela que contenha apenas a relação professor/instrumento e depois uma segunda que (independentemente) repita essa relação, mas adicione o detalhe do nível de habilidade. Se você fizer isso, corre o risco de essas duas coisas ficarem fora de sincronia.