Выбор того, когда использовать суррогатный первичный ключ, а не естественный ключ, сложен. Такие ответы, как, всегда или никогда, редко бывают полезными. Я считаю, что это зависит от ситуации.
В качестве примера у меня есть следующие таблицы:
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 имеет несколько замечательных статей на эту тему.