Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Розкажіть про зв'язок many:many (багато до багатьох)». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Зв'язок **«багато до багатьох» (many-to-many, M:N)** - це коли **кожен запис з однієї таблиці може бути пов'язаний з кількома записами з іншої**, і навпаки; напряму такий зв'язок не реалізується - для цього створюють **проміжну (сполучну) таблицю** з двома зовнішніми ключами й, зазвичай, складеним первинним ключем. **Ключове:** класичний приклад - студенти й курси: один студент вивчає кілька курсів, а один курс відвідують кілька студентів; проміжна таблиця часто зберігає й додаткові дані, наприклад дату запису на курс.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняЗв'язок **«багато до багатьох» (many-to-many, M:N)** - це коли **кожен запис з однієї таблиці може бути пов'язаний з кількома записами з іншої**, і навпаки - **кожен запис з другої таблиці** може бути пов'язаний з кількома з першої. Такий зв'язок **не можна реалізувати напряму** - для цього створюють **проміжну (сполучну) таблицю**. ### Приклад: студенти й курси Один студент може записатися на кілька курсів, і один курс можуть проходити кілька студентів. #### Таблиця студентів: ```sql CREATE TABLE students ( id INT PRIMARY KEY, name VARCHAR(50) ); ``` #### Таблиця курсів: ```sql CREATE TABLE courses ( id INT PRIMARY KEY, title VARCHAR(100) ); ``` #### Сполучна таблиця: ```sql CREATE TABLE student_courses ( student_id INT, course_id INT, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(id) ); ``` Таблиця `student_courses` зберігає пари «який студент - який курс». Так утворюється **двосторонній зв'язок**: багато студентів <-> багато курсів. ### Як це виглядає логічно | students | courses | student_courses | |---|---|---| | 1 - Анна | 10 - SQL | (1, 10) | | 2 - Іван | 11 - Python | (1, 11) | | | | (2, 10) | Анна навчається на **SQL і Python**, а курс **SQL** проходять **Анна й Іван**. ### Приклад запиту Щоб отримати всіх студентів і курси, на які вони записані: ```sql SELECT students.name, courses.title FROM student_courses JOIN students ON student_courses.student_id = students.id JOIN courses ON student_courses.course_id = courses.id; ``` ### Де використовується зв'язок M:N - Студенти <-> Курси - Автори <-> Книги - Користувачі <-> Ролі - Лікарі <-> Пацієнти - Товари <-> Категорії ### Особливості - Реалізується **через проміжну таблицю**, у якій два зовнішні ключі. - Зазвичай у цій таблиці **первинний ключ складений** (`(id1, id2)`). - Часто проміжна таблиця зберігає й додаткові дані - наприклад, дату запису на курс. **Підсумок:** Зв'язок **багато до багатьох** об'єднує об'єкти, які можуть бути пов'язані **в обидва боки з безліччю елементів**. Реалізується через **третю таблицю**, яка з'єднує дві основні.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.