Вибір, коли використовувати сурогатний первинний ключ, на відміну від природного ключа, складний. Відповіді, такі як, завжди або ніколи, рідко корисні. Я вважаю, що це залежить від ситуації.
Як приклад, я маю такі таблиці:
CREATE TABLE toll_booths (
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
...
UNIQUE(name)
)
CREATE TABLE cars (
vin VARCHAR(17) NOT NULL PRIMARY KEY,
license_plate VARCHAR(10) NOT NULL,
...
UNIQUE(license_plate)
)
CREATE TABLE drive_through (
id INTEGER NOT NULL PRIMARY KEY,
toll_booth_id INTEGER NOT NULL REFERENCES toll_booths(id),
vin VARCHAR(17) NOT NULL REFERENCES cars(vin),
at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
amount NUMERIC(10,4) NOT NULL,
...
UNIQUE(toll_booth_id, vin)
)
У нас є дві таблиці сутностей ( toll_booths
і cars
) та таблиця транзакцій ( drive_through
). У toll_booth
таблиці використовується сурогатний ключ, оскільки він не має природного атрибута, який не гарантується змінювати (ім’я можна легко змінити). У cars
таблиці використовується природний первинний ключ, оскільки він має унікальний ідентифікатор, що не змінюється ( vin
). Таблиця drive_through
транзакцій використовує сурогатний ключ для легкої ідентифікації, але також має унікальне обмеження на атрибути, які гарантовано є унікальними на момент вставлення запису.
http://database-programmer.blogspot.com має кілька чудових статей з цього приводу.