Sobes.tech
Junior

Hoe implementeer je een many-to-many (M2M) relatie in SQL?

sobes.tech AI

Antwoord van AI

Om een "veel-naar-veel" relatie in SQL te implementeren, wordt een tussentabel (koppeltabel) gebruikt. Deze tabel bevat twee buitenlandse sleutels die verwijzen naar de primaire sleutels van de twee tabellen tussen wie de relatie wordt gelegd.

Laten we aannemen dat we de tabellen authors (auteurs) en books (boeken) hebben, en we willen een relatie implementeren waarbij één auteur veel boeken kan schrijven, en één boek door veel auteurs kan worden geschreven.

  1. Creëer de entiteitstabellen: We maken de hoofdtabellen authors en books.

    -- Tabel van auteurs
    CREATE TABLE authors (
        author_id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL
    );
    
    -- Tabel van boeken
    CREATE TABLE books (
        book_id INT PRIMARY KEY,
        title VARCHAR(255) NOT NULL
    );
    
  2. Creëer de koppeltabel: We maken de tabel author_book, die auteurs en boeken verbindt. Deze tabel bevat buitenlandse sleutels die verwijzen naar author_id en book_id.

    -- Koppeltabel voor Many-to-Many
    CREATE TABLE author_book (
        author_id INT,
        book_id INT,
        PRIMARY KEY (author_id, book_id), -- Samengestelde primaire sleutel voor uniciteit
        FOREIGN KEY (author_id) REFERENCES authors(author_id),
        FOREIGN KEY (book_id) REFERENCES books(book_id)
    );
    
    • PRIMARY KEY (author_id, book_id) garandeert dat elke paar (auteur, boek) uniek is in de koppeltabel, waardoor duplicaten worden voorkomen.
    • FOREIGN KEY-beperkingen zorgen voor referentiële integriteit, waardoor wordt gegarandeerd dat author_id en book_id in de author_book-tabel overeenkomen met bestaande records in de tabellen authors en books.
  3. Voeg gegevens in: We voegen gegevens in de tabellen.

    -- Gegevens invoegen in de auteurs tabel
    INSERT INTO authors (author_id, name) VALUES
    (1, 'Author A'),
    (2, 'Author B'),
    (3, 'Author C');
    
    -- Gegevens invoegen in de boeken tabel
    INSERT INTO books (book_id, title) VALUES
    (101, 'Book 1'),
    (102, 'Book 2'),
    (103, 'Book 3');
    
    -- Gegevens invoegen in de koppeltabel (relaties tussen auteurs en boeken)
    INSERT INTO author_book (author_id, book_id) VALUES
    (1, 101), -- Auteur A schreef Book 1
    (1, 102), -- Auteur A schreef Book 2
    (2, 101), -- Auteur B schreef Book 1
    (3, 103), -- Auteur C schreef Book 3
    (1, 103); -- Auteur A schreef Book 3
    
  4. Vraag gegevens op: Voor het verkrijgen van gerelateerde gegevens worden JOIN-bewerkingen gebruikt.

    • Krijg boeken geschreven door een specifieke auteur:

      SELECT b.title
      FROM books b
      JOIN author_book ab ON b.book_id = ab.book_id
      WHERE ab.author_id = 1; -- Boeken geschreven door auteur met ID = 1
      
    • Krijg auteurs van een specifiek boek:

      SELECT a.name
      FROM authors a
      JOIN author_book ab ON a.author_id = ab.author_id
      WHERE ab.book_id = 101; -- Auteurs van boek met ID = 101
      
    • Krijg alle boeken met hun auteurs:

      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;
      

De tabel author_book is essentieel voor het implementeren van M2M, omdat deze alle paren van gerelateerde entiteiten opslaat.