Собесов

Типы ключей в SQL: PRIMARY, CANDIDATE, SURROGATE, NATURAL, FOREIGN

SQLРеляционная модельСредняяMiddle

Условие

Какие типы ключей бывают в реляционных БД и как они соотносятся друг с другом?

Решение

Иерархия ключей

Тип Что это Пример
Superkey (суперключ) Любой набор колонок, уникально идентифицирующий строку (client_id, name, age)
Candidate Key (потенциальный) Минимальный суперключ — не сократить без потери уникальности client_id, email, passport_number
Primary Key (первичный) Один из candidate keys, выбранный как главный client_id
Alternate Key (альтернативный) Candidate keys, не выбранные первичным email, passport_number
Surrogate Key (суррогатный) Искусственный PK без бизнес-смысла BIGSERIAL, UUID
Natural Key (естественный) Из бизнес-данных СНИЛС, ИНН, email
Foreign Key (внешний) Ссылка на PK другой таблицы для целостности orders.client_id → clients.id

PRIMARY KEY: ограничения

  • Уникальность.
  • NOT NULL.
  • Один на таблицу (составной из нескольких колонок — допустим).
  • Может быть индексом (обычно автоматически).

Суррогатный vs естественный

Суррогатный Естественный
Стабильность Не меняется никогда Может измениться (email)
Размер Маленький (BIGINT, UUID) Может быть большим
Бизнес-смысл Нет Есть
Удобство JOIN'ов Один INT-ключ Иногда составной

В DWH всегда используют суррогатные ключи в dim-таблицах — иначе SCD-2 не построить (бизнес-ключ повторяется в нескольких версиях).

FOREIGN KEY: ссылочная целостность

CREATE TABLE orders (
  id        SERIAL PRIMARY KEY,
  client_id INT REFERENCES clients(id) ON DELETE CASCADE
);

Гарантирует: нельзя вставить client_id, которого нет в clients. Опции при удалении: CASCADE, SET NULL, RESTRICT.

Несократимость candidate key

Candidate key должен быть минимальным: если из набора колонок убрать любую, уникальность пропадёт. Поэтому (client_id, email) — не candidate, если client_id уже уникален сам по себе.

Подводные камни

  1. Email как PK — плохая идея: меняется. Берите surrogate, email сделайте UNIQUE.
  2. Composite PK в DWH — увеличивает FK-колонки в фактах. Surrogate проще.
  3. UNIQUEPRIMARY KEY — UNIQUE допускает один NULL (в большинстве СУБД), PK — нет.
  4. FK без индекса — приводит к медленным DELETE/UPDATE на родительской таблице.

Эталонный ответ

Candidate keys — минимальные уникальные наборы. Один из них становится PRIMARY KEY, остальные — alternate. Surrogate — искусственный (без бизнес-смысла), natural — из бизнеса. Foreign key — ссылка на PK другой таблицы для целостности.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти