Как реализовать связь многие ко многим (М2М) в SQL?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech 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.-- Связующая таблица для связи Many-to-Many 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), -- Author A написал Book 1 (1, 102), -- Author A написал Book 2 (2, 101), -- Author B написал Book 1 (3, 103), -- Author C написал Book 3 (1, 103); -- Author 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, поскольку она хранит все пары связанных сущностей.