Sobes.tech
Middle
85
questionbank

Как реализуется связь многие-к-многим (m2m) на уровне базы данных?

Ответ от нейросети

sobes.tech AI

Связь многие-ко-многим (m2m) реализуется через промежуточную (связующую) таблицу. Эта таблица содержит внешние ключи, ссылающиеся на первичные ключи двух таблиц, между которыми устанавливается связь. Каждая запись в промежуточной таблице представляет одну связь между одной записью из первой таблицы и одной записью из второй.

Например, для связи "Книги" и "Авторы":

Таблица Books:

  • book_id (Первичный ключ)
  • title

Таблица Authors:

  • author_id (Первичный ключ)
  • name

Таблица Book_Authors (Промежуточная):

  • book_author_id (Первичный ключ - опционально, можно использовать составной ключ)
  • book_id (Внешний ключ, ссылающийся на Books.book_id)
  • author_id (Внешний ключ, ссылающийся на Authors.author_id)
CREATE TABLE Books (
    book_id INT PRIMARY KEY,
    title VARCHAR(255)
);

CREATE TABLE Authors (
    author_id INT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE Book_Authors (
    -- book_author_id INT PRIMARY KEY, -- опциональный первичный ключ
    book_id INT,
    author_id INT,
    FOREIGN KEY (book_id) REFERENCES Books(book_id),
    FOREIGN KEY (author_id) REFERENCES Authors(author_id),
    PRIMARY KEY (book_id, author_id) -- составной первичный ключ
);

Запросы для получения данных:

Чтобы найти всех авторов для определенной книги:

SELECT A.name
FROM Authors A
JOIN Book_Authors BA ON A.author_id = BA.author_id
WHERE BA.book_id = <ID книги>;

Чтобы найти все книги определенного автора:

SELECT B.title
FROM Books B
JOIN Book_Authors BA ON B.book_id = BA.book_id
WHERE BA.author_id = <ID автора>;