Relacionamentos muitos para muitos

Um relacionamento muitos para muitos ocorre quando vários registros em uma tabela são associados a vários registros em outra tabela. Por exemplo, um relacionamento muitos para muitos existe entre clientes e produtos: clientes podem comprar vários produtos e produtos podem ser comprados por muitos clientes.

Sistemas de bancos de dados relacionais normalmente não permitem implementar um relacionamento muitos para muitos direto entre duas tabelas. Considere o exemplo de acompanhamento de faturas. Se houver muitas faturas no mesmo número de fatura e um dos seus clientes fez consulta sobre esse número de fatura, você não saberia a qual número ele estava se referindo. Esse é um motivo para atribuir um valor exclusivo a cada fatura.

Para evitar esse problema, você pode dividir o relacionamento muitos para muitos em dois relacionamentos um para muitos usando uma terceira tabela, chamada de tabela de associação. Cada registro em uma tabela de associação inclui um campo de correspondência que contém o valor das chaves primárias das duas tabelas que ela associa. (Na tabela de associação, esses campos de correspondência são chaves externas.) Esses campos de chaves externas são preenchidos com dados, pois os registros da tabela de associação são criados de ambas as tabelas que ela associa.

Um exemplo típico de um relacionamento muitos para muitos é aquele entre alunos e classes. Um aluno pode inscrever-se em várias classes e uma classe pode incluir muitos alunos.

O exemplo a seguir inclui uma tabela Alunos, que contém um registro para cada aluno, e uma tabela Classes, que contém um registro para cada classe. Uma tabela de associação, Inscrições, cria dois relacionamentos de um para muitos — um entre cada uma das duas tabelas.

Tabela Alunos e tabela Classes, cada uma com uma linha de relacionamento para a tabela de associação inscrições

A chave primária ID do aluno identifica exclusivamente cada aluno na tabela Alunos. A chave primária ID da classe identifica exclusivamente cada classe na tabela Classes. A tabela Inscrições contém as chaves externas ID do aluno e ID da classe.

Para configurar uma tabela de associação para um relacionamento muitos para muitos:

  1. Usando o exemplo acima, crie uma tabela chamada Inscrições. Essa será a tabela de associação.
  2. Na tabela Inscrições, crie um campo ID do aluno e um campo ID da classe.

    As tabelas de associação geralmente mantêm os campos que podem não fazer sentido ter em qualquer outra tabela. Você pode adicionar campos à tabela Inscrições, como um campo Data para acompanhar quando alguém começou uma classe, e um campo Custo para acompanhar quanto um aluno pagou por uma aula.

  3. Crie um relacionamento entre os dois campos ID do aluno nas tabelas. Depois, crie um relacionamento entre os dois campos ID da classe nas tabelas.

Usando este projeto, se um aluno se inscrever em três classes, esse aluno terá um registro na tabela Alunos e três registros na tabela Inscrições — um registro para cada classe na qual o aluno se inscreveu.

Notas 

  • Tabelas de associação pode acessar os campos e dados entre tabelas sem precisar criar um relacionamento separado. Por exemplo, para exibir uma lista de todas as classes em que um aluno se inscreveu, crie um portal em um layout baseado na tabela Alunos. Faça o projeto do portal para mostrar registros relacionados da tabela Classes. Então, adicione os campos adequados de Classes ao portal. À medida que você percorre os registros no layout Alunos, o portal exibe todas as classes em que um aluno em particular está inscrito.