Типы связей в базе данных примеры (один к одному, один ко многим, многие ко многим)

Forums:

О чем эта заметка

Если говорить о программировании ряляционных баз данных (типа MySQL), ниже для всех трех типов связи рассматривается один вопрос -- "как связать данные из двух таблиц, имеющих отношение друг другу?"
-- рассматриваются разные варианты, даются пояснения.

Связь "Один к одному"

Один к одному -- у каждой двух сущностей есть лишь один спутник и больше никто.

Ситуация из жизни:
В базе данных университета есть таблица с информацией о студентах (напр. паспортные данные) и таблицы профилей этих студентов на университетском сайте (где тоже есть несколько колонок, заполняемых по желанию).
Если один студент может завести только один аккаунт -- то мы имеем классический пример связи один к одному.


Проектирование БД:

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

Связь "Один ко многим"

"Один ко многим" -- это "иерархическая связь", т.е. по отношению одной сущности к другой есть множественность, а в обратную строну -- нет.
По сути является "расширением" связи типа "один к одному" (проектируется фактически так же -- см. о проектировании ниже).

Примеры из жизни:
Напр. взаимоотношения командиров в армии - -это серия таблиц, где "соседние" звания связаны как "один ко многим". Например "у одного генерала под командованием несколько полковников".
Или -- одна большая группа учеников ходит в одну школу, другая в другую -- тут "у одной школы много учеников".

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


Проектирование БД:

В одну из таблицы (для каждой сущности, которых "много") добавляется внешний ключ на связанную сущность, которая ("одна")

Связь "Многие ко многим"

Ситуация из жизни:
Таблица предметов и таблица студентов университета. Рассуждаем: ясно что один студент может ходить на много предметов, при этом один предмет может слушаться многими студентами -- значит, это "многие ко многим"


Проектирование БД:

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

Источники (что почитать):