Sobes.tech
Junior

Ako implementovať vzťah mnoho na mnoho (M2M) v SQL?

sobes.tech AI

Odpoveď od AI

Na implementáciu vzťahu "mnoho ku mnohým" v SQL sa používa sprostredkovacia (prepojovacia) tabuľka. Táto tabuľka obsahuje dva cudzie kľúče, ktoré odkazujú na primárne kľúče dvoch tabuliek, medzi ktorými sa vzťah vytvára.

Predpokladajme, že máme tabuľky authors (autori) a books (knihy), a chceme implementovať vzťah, kde jeden autor môže napísať veľa kníh, a jedna kniha môže byť napísaná mnohými autormi.

  1. Vytvorenie entitných tabuliek: Vytvoríme hlavné tabuľky authors a books.

    -- Tabuľka autorov
    CREATE TABLE authors (
        author_id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL
    );
    
    -- Tabuľka kníh
    CREATE TABLE books (
        book_id INT PRIMARY KEY,
        title VARCHAR(255) NOT NULL
    );
    
  2. Vytvorenie prepojovacej tabuľky: Vytvoríme tabuľku author_book, ktorá bude spájať autorov a knihy. Táto tabuľka bude obsahovať cudzie kľúče odkazujúce na author_id a book_id.

    -- Prepojovacia tabuľka pre vzťah Mnoho ku Mnoh
    CREATE TABLE author_book (
        author_id INT,
        book_id INT,
        PRIMARY KEY (author_id, book_id), -- Zložený primárny kľúč pre jedinečnosť páru
        FOREIGN KEY (author_id) REFERENCES authors(author_id),
        FOREIGN KEY (book_id) REFERENCES books(book_id)
    );
    
    • PRIMARY KEY (author_id, book_id) zabezpečuje, že každý pár (autor, kniha) je v prepojovacej tabuľke jedinečný, čím sa zabraňuje duplikácii vzťahov.
    • Obmedzenia FOREIGN KEY zabezpečujú referenčnú integritu, garantujúc, že author_id a book_id v tabuľke author_book zodpovedajú existujúcim záznamom v tabuľkách authors a books.
  3. Vkladanie údajov: Vkladáme údaje do tabuliek.

    -- Vkladanie údajov do tabuľky autorov
    INSERT INTO authors (author_id, name) VALUES
    (1, 'Author A'),
    (2, 'Author B'),
    (3, 'Author C');
    
    -- Vkladanie údajov do tabuľky kníh
    INSERT INTO books (book_id, title) VALUES
    (101, 'Book 1'),
    (102, 'Book 2'),
    (103, 'Book 3');
    
    -- Vkladanie údajov do prepojovacej tabuľky (vzťahy medzi autormi a knihami)
    INSERT INTO author_book (author_id, book_id) VALUES
    (1, 101), -- Autor A napísal knihu 1
    (1, 102), -- Autor A napísal knihu 2
    (2, 101), -- Autor B napísal knihu 1
    (3, 103), -- Autor C napísal knihu 3
    (1, 103); -- Autor A napísal knihu 3
    
  4. Dotazy na údaje: Na získanie súvisiacich údajov sa používajú operácie JOIN.

    • Získať knihy napísané určitým autorom:

      SELECT b.title
      FROM books b
      JOIN author_book ab ON b.book_id = ab.book_id
      WHERE ab.author_id = 1; -- Knihy napísané autorom s ID = 1
      
    • Získať autorov určitej knihy:

      SELECT a.name
      FROM authors a
      JOIN author_book ab ON a.author_id = ab.author_id
      WHERE ab.book_id = 101; -- Autori knihy s ID = 101
      
    • Získať všetky knihy s ich autormi:

      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;
      

Tabuľka author_book je kľúčom k implementácii M2M, pretože uchováva všetky páry prepojených entít.