Как да реализираме връзка много към много (М2М) в SQL?
sobes.tech AI
Отговор от AI
За реализиране на връзката "много към много" в SQL се използва междинна (свързваща) таблица. Тази таблица съдържа два външни ключа, които се отнасят към първичните ключове на двата таблици, между които се установява връзката.
Да предположим, че имаме таблиците authors (автори) и books (книги), и искаме да реализираме връзка, при която един автор може да напише много книги, а една книга може да бъде написана от много автори.
-
Създаване на таблици за същности: Създаваме основните таблици
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 ); -
Създаване на свързваща таблица: Създаваме таблицата
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.
-
Вмъкване на данни: Вмъкваме данни в таблиците.
-- Вмъкване на данни в таблицата автори 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 -
Заявки за данни: За получаване на свързани данни се използват операции
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, тъй като тя съхранява всички двойки свързани същности.