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.
-
Creëer de entiteitstabellen: We maken de hoofdtabellen
authorsenbooks.-- 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 ); -
Creëer de koppeltabel: We maken de tabel
author_book, die auteurs en boeken verbindt. Deze tabel bevat buitenlandse sleutels die verwijzen naarauthor_idenbook_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 datauthor_idenbook_idin deauthor_book-tabel overeenkomen met bestaande records in de tabellenauthorsenbooks.
-
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 -
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.