Проверяет понимание реализации связи многие-ко-многим в реляционных базах данных с использованием промежуточной таблицы.
В реляционных базах данных связь многие-ко-многим возникает, когда одной записи в таблице A может соответствовать несколько записей в таблице B, и наоборот. Например, студент может посещать несколько курсов, а курс — содержать много студентов. Прямое добавление внешнего ключа в одну из таблиц невозможно, так как это привело бы к дублированию данных или нарушению нормализации.
Для реализации такой связи создается третья таблица (промежуточная, или junction table), которая содержит внешние ключи, ссылающиеся на первичные ключи обеих основных таблиц. Каждая запись в этой таблице представляет одну связь между сущностями. Промежуточная таблица может также содержать дополнительные атрибуты, например, дату зачисления или оценку.
Рассмотрим таблицы students и courses. Промежуточная таблица enrollments будет содержать два внешних ключа:
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE courses (
id INT PRIMARY KEY,
title VARCHAR(100)
);
CREATE TABLE enrollments (
student_id INT,
course_id INT,
enrolled_date DATE,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);Здесь первичный ключ таблицы enrollments состоит из двух полей, что гарантирует уникальность каждой пары студент-курс. Внешние ключи обеспечивают ссылочную целостность.
Такой подход используется в системах управления обучением, интернет-магазинах (связь заказов и товаров), социальных сетях (друзья, подписки) и везде, где требуется гибкое связывание записей. Промежуточная таблица позволяет легко добавлять или удалять связи без изменения структуры основных таблиц.
Связь many-to-many через промежуточную таблицу — стандартный и эффективный способ моделирования сложных отношений в реляционных БД. Его следует применять, когда между сущностями существует взаимная множественная связь, требующая хранения дополнительных атрибутов или обеспечения гибкости запросов.