EMZETT.
Войти

Первичные и внешние ключи: надёжная связь таблиц

Коротко: Первичный ключ однозначно идентифицирует каждую строку таблицы; внешний ключ указывает на первичный ключ другой таблицы и тем самым предотвращает «висячие» ссылки.

Подробнее: Реляционные базы данных хранят данные в отдельных таблицах (клиенты, заказы). Чтобы знать, какой заказ какому клиенту принадлежит, каждой строке нужен уникальный идентификатор (первичный ключ), а связывающей таблице — ссылка на него (внешний ключ).

Подробности

Первичный ключ (PRIMARY KEY)

Он уникален и никогда не пуст (NOT NULL). Типичный выбор — последовательный номер (SERIAL/IDENTITY) или UUID. Суррогатные ключи никогда не меняются. Естественные ключи (адрес почты, налоговый номер) могут меняться или повторяться и потому рискованны. Первичный ключ может охватывать несколько столбцов (составной ключ), например в связующих таблицах. База данных автоматически создаёт для него индекс.

Внешний ключ (FOREIGN KEY)

Пример: orders.customer_id REFERENCES customers(id). База данных отклоняет строки, чей customer_id не существует (ссылочная целостность). При удалении или изменении родительской строки вы определяете поведение: RESTRICT/NO ACTION (запретить), CASCADE (удалить вместе), SET NULL (очистить ссылку). CASCADE удобен, но может удалить неожиданно много строк.

Практика и подводные камни

  • Индексируйте столбцы внешних ключей сами (PostgreSQL автоматически этого не делает); иначе соединения и удаления замедляются.
  • Типы связей: 1:n (внешний ключ в таблице n), n:m (отдельная связующая таблица с двумя внешними ключами).
  • UUID или число? Числа компактны и быстры, UUID можно генерировать распределённо без координации, и они ничего не раскрывают о числе записей.
  • При массовом импорте не отключайте внешние ключи; загружайте данные в правильном порядке.
  • Запросы работают и без внешних ключей, но мусор в данных просачивается.

Взгляд экзамена

Ключи относятся к реляционной модели и нормализации. Запомните: первичный ключ = уникальный + не NULL; внешний ключ = ссылка, обеспечивает целостность. В ER-модели связи реализуются внешними ключами.

См. также: Соединения (join), ER-модель, Нормальные формы