Первичные и внешние ключи: надёжная связь таблиц
Коротко: Первичный ключ однозначно идентифицирует каждую строку таблицы; внешний ключ указывает на первичный ключ другой таблицы и тем самым предотвращает «висячие» ссылки.
Подробнее: Реляционные базы данных хранят данные в отдельных таблицах (клиенты, заказы). Чтобы знать, какой заказ какому клиенту принадлежит, каждой строке нужен уникальный идентификатор (первичный ключ), а связывающей таблице — ссылка на него (внешний ключ).
Подробности
Первичный ключ (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-модель, Нормальные формы