Skip to content

14 Как реализовать связь многие ко многим в реляционной БД?

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

Пример реализации связи "многие ко многим"

Рассмотрим пример с двумя сущностями: Students (Студенты) и Courses (Курсы). Один студент может записаться на несколько курсов, и один курс может быть посещаем несколькими студентами.

Шаг 1: Создание таблиц

  1. Таблица Students: sql CREATE TABLE Students ( student_id INT PRIMARY KEY, name VARCHAR(100) );

  2. Таблица Courses: sql CREATE TABLE Courses ( course_id INT PRIMARY KEY, title VARCHAR(100) );

  3. Промежуточная таблица StudentCourses: sql CREATE TABLE StudentCourses ( student_id INT, course_id INT, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES Students(student_id), FOREIGN KEY (course_id) REFERENCES Courses(course_id) );

Объяснение структуры

  • Таблица Students содержит информацию о студентах, где student_id является первичным ключом.
  • Таблица Courses содержит информацию о курсах, где course_id является первичным ключом.
  • Таблица StudentCourses является промежуточной таблицей, которая содержит два столбца: student_id и course_id. Оба столбца вместе образуют составной первичный ключ, что гарантирует уникальность каждой пары (студент, курс). Также в этой таблице определены внешние ключи, которые ссылаются на соответствующие таблицы.

Пример вставки данных

Теперь, когда таблицы созданы, можно вставить данные:

-- Вставка студентов
INSERT INTO Students (student_id, name) VALUES (1, 'Alice');
INSERT INTO Students (student_id, name) VALUES (2, 'Bob');

-- Вставка курсов
INSERT INTO Courses (course_id, title) VALUES (1, 'Mathematics');
INSERT INTO Courses (course_id, title) VALUES (2, 'Physics');

-- Запись студентов на курсы
INSERT INTO StudentCourses (student_id, course_id) VALUES (1, 1); -- Alice записана на Mathematics
INSERT INTO StudentCourses (student_id, course_id) VALUES (1, 2); -- Alice записана на Physics
INSERT INTO StudentCourses (student_id, course_id) VALUES (2, 1); -- Bob записан на Mathematics

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

Теперь можно выполнять запросы для получения информации о студентах и курсах:

  1. Получить все курсы, на которые записан студент: sql SELECT c.title FROM Courses c JOIN StudentCourses sc ON c.course_id = sc.course_id WHERE sc.student_id = 1; -- Для студента с ID 1 (Alice)

  2. Получить всех студентов, записанных на курс: sql SELECT s.name FROM Students s JOIN StudentCourses sc ON s.student_id = sc.student_id WHERE sc.course_id = 1; -- Для курса с ID 1 (Mathematics)

Заключение

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