Связь Многие-ко-Многим в базах данных
Last updated: 8 мая 2025 г.Далее рассмотрим тип связи Многие-ко-Многим
.
Например:
У каждого продукта есть много покупателей и у каждого покупателя есть много купленных продуктов.
Ясное дело должно быть две таблицы – Продукты
и Покупатели продуктов
. И как-то нужно их связать.
Но для начала следует увидеть одну таблицу, в которой хранятся данные обеих только что упомянутых таблиц вместе.

Очевидно, что аттрибуты Имя покупателя
, Имейл покупателя
и Количество купленных товаров
принадлежат не таблице продукты и их нужно отделить в отдельную таблицу Покупатели продуктов
.
Также, как можно увидеть, повторяются в этой таблице и продукты и покупатели.
Например, Ricardo купил стол, лампу и утюг, но стол также купили Billy и Van. То есть повторение идет и покупателей и продуктов.
Поэтому таблицы нужно разделить и связать их связью многие-ко-многим.
Почему она многие-ко-многим думаю уже понятно – каждый покупатель может купить МНОГО разных продуктов и каждый продукт может быть куплен МНОГИМИ разными покупателями.
Итак разобьем же таблицу на две

Как же нам теперь связать эти две таблицы?
Итак подумаем. Что если, как мы уже делали ранее в таблице продукты, добавить аттрибут Внешний идентификатор
покупателя, в котором для каждого продукта будут храниться нужные идентификаторы покупателя из таблицы с покупателями.

Но подождите! Если мы посмотрим на исходную таблицу (ту которая была в самом начале урока), то стол же купил не только Billy, его купил и Van и Ricardo. Утюг также купил Billy и Ricardo.
Получается, что в таблице Продукты на рисунке выше нам нужно размножить стол и утюг. Так, ясное дело, нельзя, ведь нам же нужно минимизировать количество повторений данных в базе.
Давайте попробуем наоборот.

Очевидно та же самая ситуация. Только размноживать теперь придется покупателей.
Как же быть?
Нужно создать третью таблицу. В этой таблице будут всего два аттрибута – Внешний идентификатор продукта
и Внешний идентификатор покупателя
. То есть очевидно, что в этих аттрибутах будут храниться ключи из других таблиц. И эти ключи разных таблиц будут сопоставлены друг другу, таким образом образуя связь меду двумя таблицами.
Продемонстрируем это:

Как видим, в первом столбике ключи из таблицы продукты, во втором же ключи из таблицы покупатели.
Видим три единицы подряд в первом столбце.
Получается мы сопоставляем строку таблицы с продуктами где идентификатор 1 к строке покупателя с идентификатором 1, к строке покупателя с идентификатором 2 и к строке покупателя с идентификатором 3. То есть стол связан с Billy, Van и Ricardo.
Во втором столбце видим три тройки подряд.
То есть мы сопоставляем строку таблицы с покупателями где идентификатор 3 к строке продукта с идентификатором 1, к строке продукта с идентификатором 2 и к строке продукта с идентификатором 3. Ricardo связан со столом, лампой и утюгом.
Как видим, множественная связь работает в обе стороны. С одной стороны может быть много столов и с другой стороны может быть много Ricardo.
И нам не приходиться, как в исходной таблице (той которая на самой первой картинке урока), дублировать строки целиком из обеих таблиц. Строки двух таблиц связывает отдельная таблица, в которой всего два столбца с числовыми значениями.
Следующие уроки
Связь Один-к-Одному в базах данных
13
мин.
Основы SQL. Что такое СУБД и MySQL
9
мин.
DDL в SQL: создание и удаление таблиц
13
мин.