Sobes.tech
Junior

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.

  1. Criação das tabelas de entidades: Criamos as tabelas principais authors e books.

    -- 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
    );
    
  2. 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 a author_id e book_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 KEY asseguram a integridade referencial, garantindo que author_id e book_id na tabela author_book correspondam a registros existentes nas tabelas authors e books.
  3. 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
    
  4. 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.