Sobes.tech
Junior

Comment implémenter une relation plusieurs-à-plusieurs (M2M) en SQL?

sobes.tech IA

Réponse de l'IA

Pour implémenter une relation "plusieurs à plusieurs" en SQL, on utilise une table intermédiaire (de liaison). Cette table contient deux clés étrangères qui référencent les clés primaires des deux tables entre lesquelles la relation est établie.

Supposons que nous ayons les tables authors (auteurs) et books (livres), et que nous souhaitons implémenter une relation où un auteur peut écrire plusieurs livres, et un livre peut être écrit par plusieurs auteurs.

  1. Création des tables d'entités : Nous créons les tables principales authors et books.

    -- Table des auteurs
    CREATE TABLE authors (
        author_id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL
    );
    
    -- Table des livres
    CREATE TABLE books (
        book_id INT PRIMARY KEY,
        title VARCHAR(255) NOT NULL
    );
    
  2. Création de la table de liaison : Nous créons la table author_book, qui reliera les auteurs et les livres. Cette table contiendra des clés étrangères référant à author_id et book_id.

    -- Table de liaison pour la relation Many-to-Many
    CREATE TABLE author_book (
        author_id INT,
        book_id INT,
        PRIMARY KEY (author_id, book_id), -- Clé primaire composée pour l'unicité
        FOREIGN KEY (author_id) REFERENCES authors(author_id),
        FOREIGN KEY (book_id) REFERENCES books(book_id)
    );
    
    • PRIMARY KEY (author_id, book_id) garantit que chaque paire (auteur, livre) est unique dans la table de liaison, évitant les doublons.
    • Les contraintes FOREIGN KEY assurent l'intégrité référentielle, garantissant que author_id et book_id dans la table author_book correspondent à des enregistrements existants dans les tables authors et books.
  3. Insertion de données : Nous insérons des données dans les tables.

    -- Insertion dans la table des auteurs
    INSERT INTO authors (author_id, name) VALUES
    (1, 'Author A'),
    (2, 'Author B'),
    (3, 'Author C');
    
    -- Insertion dans la table des livres
    INSERT INTO books (book_id, title) VALUES
    (101, 'Book 1'),
    (102, 'Book 2'),
    (103, 'Book 3');
    
    -- Insertion dans la table de liaison (relations entre auteurs et livres)
    INSERT INTO author_book (author_id, book_id) VALUES
    (1, 101), -- Auteur A a écrit Book 1
    (1, 102), -- Auteur A a écrit Book 2
    (2, 101), -- Auteur B a écrit Book 1
    (3, 103), -- Auteur C a écrit Book 3
    (1, 103); -- Auteur A a écrit Book 3
    
  4. Requête de données : Pour obtenir des données liées, on utilise des opérations JOIN.

    • Obtenir les livres écrits par un auteur spécifique :

      SELECT b.title
      FROM books b
      JOIN author_book ab ON b.book_id = ab.book_id
      WHERE ab.author_id = 1; -- Livres écrits par l'auteur avec ID = 1
      
    • Obtenir les auteurs d'un livre spécifique :

      SELECT a.name
      FROM authors a
      JOIN author_book ab ON a.author_id = ab.author_id
      WHERE ab.book_id = 101; -- Auteurs du livre avec ID = 101
      
    • Obtenir tous les livres avec leurs 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;
      

La table author_book est essentielle pour la mise en œuvre M2M, car elle stocke toutes les paires d'entités liées.