- Природний ключ - значення, що вже унікальне в реальному світі: email, ІПН, код валюти
UAH, ISBN, номер телефону. - Сурогатний ключ - штучний ідентифікатор без бізнес-змісту:
idз послідовності чи UUID.
Проблеми природних ключів:
- Вони змінюються. Email змінюють, телефони переносять, номери документів виправляють. Зміна первинного ключа - каскадне оновлення всіх таблиць, що на нього посилаються.
- Унікальність, яка виявляється не зовсім унікальною: один номер телефону в сім'ї, повторно використаний email після видалення облікового запису, дублі ІПН через помилки введення.
- Розмір і швидкість: довгий рядок як ключ і в кожному зовнішньому ключі займає більше місця, ніж
bigint. - Розкриття даних: email в URL і логах.
Тому типова практика:
- Сурогатний первинний ключ для зв'язків між таблицями;
- Унікальне обмеження на природний ключ, щоб правило бізнесу все одно перевірялося базою:
CREATE TABLE users (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email text NOT NULL,
CONSTRAINT users_email_unique UNIQUE (email)
);
Коли природний ключ доречний:
- Довідники зі стабільними стандартними кодами: валюти (
UAH), країни (UA), мови (uk). Код зручно читати в даних, і він не змінюється. - Проміжні таблиці «багато-до-багатьох» - складений ключ з двох зовнішніх ключів природний за своєю суттю.
Сурогатний ключ не замінює унікальність: таблиця з лише id і без унікального обмеження на бізнес-ключ дозволить створити двох однакових клієнтів, і це найпоширеніша причина дублікатів у даних.