Ні.
Я б сказав, що, безумовно, є випадки, коли однополюсні ключі поступаються складеним ключам, принаймні, з метою використання іноземних ключів . Це не означає, що у вас не повинно бути сурогатного ключа з одним полем, якщо ви хочете, але я особисто віддаю перевагу ключ, який найчастіше використовується як ціль зовнішнього ключа, щоб називатися первинним ключем
Я спробую проілюструвати свою думку на наступних прикладах, де:
brand - автомобільна марка, наприклад, Ford, Toyota тощо
dealer - це фізичний дилер, прив’язаний до торгової марки (наприклад, дилер Ford, який продає лише Fords)
model - тип автомобіля, наприклад, Ford Focus, Ford Fiesta тощо
stock є поточним числом автомобілів передньої площі для кожного дилера
Якщо ми створимо сурогатний ключ з одним полем dealerі для modelнаступного:
create table brand( brand_id integer primary key );
create table dealer( dealer_id integer primary key,
brand_id integer references brand )
create table model( model_id integer primary key,
brand_id integer references brand )
create table stock( model_id integer references model,
dealer_id integer references dealer,
quantity integer,
primary key(model_id, dealer_id) )
тоді можна вставити рядок, stockщо посилається на Forddealer з моделлю "Toyota". Додавання brand_id references brandдо stockтільки посилює проблему. З іншого боку, якщо ми збережемо зовнішній ключ як частину первинного ключа, наступним чином:
create table brand( brand_id integer primary key );
create table dealer( brand_id integer references brand,
dealer_id integer,
primary key(brand_id, dealer_id) )
create table model( brand_id integer references brand,
model_id integer,
primary key(brand_id, model_id) )
create table stock( brand_id integer,
model_id integer,
dealer_id integer,
quantity integer,
primary key(brand_id, model_id, dealer_id),
foreign key(brand_id, model_id) references model,
foreign key(brand_id, dealer_id) references dealer )
Тепер правило, що дилери "Форда" можуть запасатися лише автомобілями "Форд", природно моделюється.
Зауважте, що у прикладі "складених ключів" dealer_idможе бути, а може й не бути унікальним відповідно до уподобань. Він не повинен бути унікальним (тобто альтернативним ключем), але дуже мало втрачається, роблячи його таким чином (можливо, невеликим місцем для зберігання), і це може бути дуже зручно, тому я зазвичай налаштовую його, наприклад:
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )