Không.
Tôi muốn nói rằng chắc chắn có trường hợp khi các khóa đơn trường kém hơn các phím ghép, ít nhất là cho mục đích của khóa ngoại . Điều đó không có nghĩa là bạn không nên có khóa thay thế một trường nếu bạn thích, nhưng cá nhân tôi thích khóa thường được sử dụng làm mục tiêu của khóa ngoại được gọi là khóa chính
Tôi sẽ cố gắng minh họa quan điểm của mình trong các ví dụ sau, trong đó:
brand
là marque xe, ví dụ Ford, Toyota vv
dealer
là đại lý vật lý, gắn liền với thương hiệu (ví dụ: đại lý Ford chỉ bán Fords)
model
là loại xe như Ford Focus, Ford Fiesta v.v.
stock
là số lượng xe forecourt hiện tại cho mỗi đại lý
Nếu chúng ta tạo khóa thay thế một trường cho dealer
và model
như sau:
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) )
sau đó có thể chèn một hàng vào stock
liên kết Ford dealer
với mô hình "Toyota". Thêm brand_id references brand
vào stock
chỉ làm cho vấn đề tồi tệ hơn. Mặt khác, nếu chúng ta giữ khóa ngoại như một phần của khóa chính như sau:
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 )
bây giờ quy tắc rằng các đại lý "Ford" chỉ có thể dự trữ xe "Ford" được thực thi theo mô hình một cách tự nhiên.
Lưu ý rằng trong ví dụ 'khóa tổng hợp', dealer_id
có thể hoặc không thể là duy nhất, theo sở thích. Nó không cần phải là duy nhất (tức là một khóa thay thế), nhưng rất ít bị mất bằng cách làm cho nó trở nên như vậy (có lẽ là một ít không gian lưu trữ) và nó có thể rất tiện dụng vì vậy đó là cách tôi thường thiết lập, ví dụ:
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )