Sobes.tech
Junior

Как да реализираме връзка много към много (М2М) в SQL?

sobes.tech AI

Отговор от AI

За реализиране на връзката "много към много" в SQL се използва междинна (свързваща) таблица. Тази таблица съдържа два външни ключа, които се отнасят към първичните ключове на двата таблици, между които се установява връзката.

Да предположим, че имаме таблиците authors (автори) и books (книги), и искаме да реализираме връзка, при която един автор може да напише много книги, а една книга може да бъде написана от много автори.

  1. Създаване на таблици за същности: Създаваме основните таблици authors и books.

    -- Таблица автори
    CREATE TABLE authors (
        author_id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL
    );
    
    -- Таблица книги
    CREATE TABLE books (
        book_id INT PRIMARY KEY,
        title VARCHAR(255) NOT NULL
    );
    
  2. Създаване на свързваща таблица: Създаваме таблицата author_book, която ще свързва автори и книги. Тази таблица ще съдържа външни ключове, които се отнасят към author_id и book_id.

    -- Свързваща таблица за връзка Много към Много
    CREATE TABLE author_book (
        author_id INT,
        book_id INT,
        PRIMARY KEY (author_id, book_id), -- Композитен първичен ключ за уникалност на двойката
        FOREIGN KEY (author_id) REFERENCES authors(author_id),
        FOREIGN KEY (book_id) REFERENCES books(book_id)
    );
    
    • PRIMARY KEY (author_id, book_id) гарантира, че всяка двойка (автор, книга) е уникална в свързващата таблица, предотвратявайки дублиране на връзки.
    • Ограниченията FOREIGN KEY осигуряват референтна цялост, гарантирайки, че author_id и book_id в таблицата author_book съответстват на съществуващи записи в таблиците authors и books.
  3. Вмъкване на данни: Вмъкваме данни в таблиците.

    -- Вмъкване на данни в таблицата автори
    INSERT INTO authors (author_id, name) VALUES
    (1, 'Author A'),
    (2, 'Author B'),
    (3, 'Author C');
    
    -- Вмъкване на данни в таблицата книги
    INSERT INTO books (book_id, title) VALUES
    (101, 'Book 1'),
    (102, 'Book 2'),
    (103, 'Book 3');
    
    -- Вмъкване на данни в свързващата таблица (връзки между автори и книги)
    INSERT INTO author_book (author_id, book_id) VALUES
    (1, 101), -- Автор A написа Book 1
    (1, 102), -- Автор A написа Book 2
    (2, 101), -- Автор B написа Book 1
    (3, 103), -- Автор C написа Book 3
    (1, 103); -- Автор A написа Book 3
    
  4. Заявки за данни: За получаване на свързани данни се използват операции JOIN.

    • Получаване на книги, написани от определен автор:

      SELECT b.title
      FROM books b
      JOIN author_book ab ON b.book_id = ab.book_id
      WHERE ab.author_id = 1; -- Книги, написани от автор с ID = 1
      
    • Получаване на автори на определена книга:

      SELECT a.name
      FROM authors a
      JOIN author_book ab ON a.author_id = ab.author_id
      WHERE ab.book_id = 101; -- Автори на книга с ID = 101
      
    • Получаване на всички книги с техните автори:

      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;
      

Таблицата author_book е ключът към реализирането на M2M, тъй като тя съхранява всички двойки свързани същности.