Ні.
Я б сказав, що, безумовно, є випадки, коли однополюсні ключі поступаються складеним ключам, принаймні, з метою використання іноземних ключів . Це не означає, що у вас не повинно бути сурогатного ключа з одним полем, якщо ви хочете, але я особисто віддаю перевагу ключ, який найчастіше використовується як ціль зовнішнього ключа, щоб називатися первинним ключем
Я спробую проілюструвати свою думку на наступних прикладах, де:
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) )