Условие
Какие типы ключей бывают в реляционных БД и как они соотносятся друг с другом?
Решение
Иерархия ключей
| Тип | Что это | Пример |
|---|---|---|
| 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 уже уникален сам по себе.
Подводные камни
- Email как PK — плохая идея: меняется. Берите surrogate, email сделайте
UNIQUE. - Composite PK в DWH — увеличивает FK-колонки в фактах. Surrogate проще.
UNIQUE≠PRIMARY KEY— UNIQUE допускает один NULL (в большинстве СУБД), PK — нет.- FK без индекса — приводит к медленным DELETE/UPDATE на родительской таблице.
Эталонный ответ
Candidate keys — минимальные уникальные наборы. Один из них становится PRIMARY KEY, остальные — alternate. Surrogate — искусственный (без бизнес-смысла), natural — из бизнеса. Foreign key — ссылка на PK другой таблицы для целостности.