Como implementar uma relação muitos-para-muitos (M2M) em SQL?
sobes.tech IA
Resposta da IA
Para implementar uma relação "muitos a muitos" em SQL, utiliza-se uma tabela intermédia (de ligação). Esta tabela contém duas chaves externas que referenciam as chaves primárias das duas tabelas entre as quais a relação é estabelecida.
Suponhamos que temos as tabelas authors (autores) e books (livros), e queremos implementar uma relação onde um autor pode escrever muitos livros, e um livro pode ser escrito por muitos autores.
-
Criação das tabelas de entidades: Criamos as tabelas principais
authorsebooks.-- Tabela de autores CREATE TABLE authors ( author_id INT PRIMARY KEY, name VARCHAR(255) NOT NULL ); -- Tabela de livros CREATE TABLE books ( book_id INT PRIMARY KEY, title VARCHAR(255) NOT NULL ); -
Criação da tabela de ligação: Criamos a tabela
author_book, que irá ligar autores e livros. Esta tabela conterá chaves externas que fazem referência aauthor_idebook_id.-- Tabela de ligação para relação Muitos-para-Muitos CREATE TABLE author_book ( author_id INT, book_id INT, PRIMARY KEY (author_id, book_id), -- Chave primária composta para unicidade FOREIGN KEY (author_id) REFERENCES authors(author_id), FOREIGN KEY (book_id) REFERENCES books(book_id) );PRIMARY KEY (author_id, book_id)garante que cada par (autor, livro) seja único na tabela de ligação, evitando duplicados.- As restrições
FOREIGN KEYasseguram a integridade referencial, garantindo queauthor_idebook_idna tabelaauthor_bookcorrespondam a registros existentes nas tabelasauthorsebooks.
-
Inserção de dados: Inserimos dados nas tabelas.
-- Inserção na tabela de autores INSERT INTO authors (author_id, name) VALUES (1, 'Author A'), (2, 'Author B'), (3, 'Author C'); -- Inserção na tabela de livros INSERT INTO books (book_id, title) VALUES (101, 'Book 1'), (102, 'Book 2'), (103, 'Book 3'); -- Inserção na tabela de ligação (relações entre autores e livros) INSERT INTO author_book (author_id, book_id) VALUES (1, 101), -- Autor A escreveu Book 1 (1, 102), -- Autor A escreveu Book 2 (2, 101), -- Autor B escreveu Book 1 (3, 103), -- Autor C escreveu Book 3 (1, 103); -- Autor A escreveu Book 3 -
Consulta de dados: Para obter dados relacionados, utilizam-se operações
JOIN.-
Obter livros escritos por um autor específico:
SELECT b.title FROM books b JOIN author_book ab ON b.book_id = ab.book_id WHERE ab.author_id = 1; -- Livros escritos pelo autor com ID = 1 -
Obter autores de um livro específico:
SELECT a.name FROM authors a JOIN author_book ab ON a.author_id = ab.author_id WHERE ab.book_id = 101; -- Autores do livro com ID = 101 -
Obter todos os livros com seus autores:
SELECT b.title, a.name FROM author_book ab JOIN books b ON ab.book_id = b.book_id JOIN authors a ON ab.author_id = a.author_id;
-
A tabela author_book é fundamental para a implementação M2M, pois armazena todos os pares de entidades relacionadas.