Виды связей между таблицами
То, что таблицы в базе связаны, мы уже выяснили. Но связать их можно по-разному. В реляционных базах данных существует три основных вида связи. Расскажем о них по порядку.
Связь «один к одному»
В английском языке такую связь называют one-to-one. Такой вид связи предполагает, что одна запись первой таблицы связана только с одной записью другой таблицы.
Приведём пример. Таблица
staff хранит данные обо всех сотрудниках. Можно создать несколько других таблиц, которые объединят сотрудников из одного отдела. Например, в одну таблицу войдут все разработчики, в другую — все сотрудники поддержки. Таблица с разработчиками будет связана с таблицей staff связью «один к одному»: одна запись о сотруднике из отдела разработки соответствует одной записи о том же сотруднике в таблице staff. То же самое с таблицей отдела поддержки. У такого вида связи мало преимуществ, поэтому его используют редко. И неудивительно: данные из таких таблиц лучше объединить в одну. Например, можно добавить поле с отделом в таблицу
staff. Связь «один ко многим»
Этот вид связи, наоборот, самый популярный. Иногда его обозначают one-to-many.
Такой вид связи предполагает, что одной записи первой таблицы соответствует несколько записей другой таблицы. Таблицы
invoice и client связаны именно таким способом. В таблице client может быть только один уникальный пользователь, но в таблице invoice один пользователь может встречаться несколько раз — в зависимости от количества оформленных заказов. Связь «многие ко многим»
Другое название связи — many-to-many. Этот вид связи предполагает, что одна запись одной таблицы соответствует нескольким записям другой таблицы и наоборот. Кажется, такой вид связи напоминает «один ко многим», но это не так.
Например, в одной таблице указаны все школьные предметы, а в другой — преподаватели. Один преподаватель может вести несколько предметов, а у одного предмета может быть несколько преподавателей.
Реализовать такую связь может быть сложно. Представьте, что вы проектируете базу данных для школы и вам нужно связать таблицу с предметами и таблицу с преподавателями. Работать с такими таблицами будет неудобно, ведь каждому предмету соответствует несколько идентификаторов преподавателей. Придётся отбирать нужные идентификаторы, чтобы составить расписание или рассчитать нагрузку преподавателей.
Решить проблему можно с помощью соединительной таблицы. В такой таблице можно связать идентификатор преподавателя с идентификатором предмета, причём каждая такая пара будет уникальной.
Преподаватель с идентификатором 4 ведёт два предмета, и для каждого из них в таблице будет отдельная запись.
Обратите внимание, что между таблицей с преподавателями и соединительной таблицей будет связь «один ко многим». Одному преподавателю будет соответствовать несколько записей в соединительной таблице. Такая же связь будет между таблицей со школьными предметами и соединительной таблицей.
Как вы думаете, каким типом связи могут быть связаны эти таблицы?
Таблица с кондитерскими магазинами и таблица с поставщиками конфет
«Многие ко многим»
У одного кондитерского магазина наверняка будет несколько поставщиков: один привезёт конфеты с вафельной начинкой, другой — с помадной. Один поставщик, в свою очередь, привозит товар в несколько магазинов.
Таблица с производителями машин и таблица с моделями автомобилей
«Один ко многим»
Один производитель может выпустить несколько автомобилей, но у одного автомобиля производитель только один.
Таблица с адресами электронной почты пользователей и таблица с номерами учётных записей
«Один к одному»
Чаще всего на одну почту можно зарегистрировать только один аккаунт. И наоборот: учётная запись чаще привязана к одному адресу электронной почты.