Основы проектирования БД: как создать связь «один к одному» (1:1) и когда нужен этот тип связи, простыми словами на примере
Когда нам нужна связь «один к одному» (1:1)?
Когда одна запись из таблицы А может принадлежать только одной конкретной записи из таблицы Б, и в этот же момент одна запись из таблицы Б может принадлежать только одной конкретной записи из таблицы А.
Рассмотрим реальный пример такой ситуации: предположим нам нужно хранить пользователей и их паспортные данные в нашей базе данных. Ввод паспортных данных будет опциональным (необязательным), поэтому мы не будем хранить их в той же таблице, что и пользователей. У одного человека может быть только один паспорт. То же можно сказать и про какой-либо конкретный паспорт: у него может быть только один человек.
Как создать связь «один к одному» (1:1)?
Необходимо добавить в таблицу А (в нашем случае это таблица пользователей) поле в которой мы будем хранить id (уникальный идентификатор) записи таблицы Б (в нашем случае это таблица паспортов). И в таблицу паспортов добавить поле в которой мы будем хранить id записи из таблицы пользователей. Таким образом мы создадим связь один к одному, так как мы можем в одной записи в столбце связи хранить только один ID записи другой таблицы.
id - уникальный (не повторяющийся) номер, который есть у каждой записи в любой таблице (исключение - таблицы связи многие ко многим, но об этом позже). Внутри одной таблицы не может быть два одинаковых id, что позволяет нам с 100% точностью получить нужную запись по её уникальному номеру
Вот как выглядит связь «один к одному» (1:1):
Стоит отметить, что хоть так и выглядит настоящая связь один к одному с точки зрения архитектуры, в реальных условиях очень редко подобная связь устанавливается в двухстороннем формате, потому что нам достаточно в таблице Б (паспорта) указать поле в котором мы будем хранить id записи в таблице А (пользователи).
Однако фактически создавая таким образом связь один ко многим, мы должны держать в голове, что мы имеем в виду связь один к одному, и не создавать разные записи в таблице паспортов, ссылающиеся на одного и того же пользователя. Если в уме это пока что держать сложно - создавайте двустороннюю связь, как показано на примере выше.
Вот как мы можем упростить связь 1 к 1, фактически создавая связь 1 к М (при том, что мы будем использовать её только как 1 к 1!):
Как работать со связью «один к одному» (1:1)?
Разберём на нашем же примере. Вот как мы можем получить некоторые данные пользователя из таблицы пользователей вместе с его некоторыми паспортными данными:
SELECT
u.id,
u.email,
u.role,
p.firstname,
p.date_of_birth,
p.registration_address
FROM
user u,
passport p
WHERE
p.user = u.id
AND
c.user = ?;
Где вместо N нам нужно будет подставить уникальный номер пользователя. А если мы хотим получить всех пользователей с их паспортными данными, мы можем поставить точку с запятой после "p.user = u.id" и удалить всё, что ниже.
В соседних статьях вы можете найти информацию о других типах реляционных связей данных: многие ко многим, и один ко многим. Если было полезно, можете поддержать лайком/комментарием/подпиской на мой образовательный YouTube-канал.