เลขที่
ผมว่ามีกรณีอย่างแน่นอนเมื่อปุ่มเดียวฟิลด์จะด้อยกว่าคีย์ผสมอย่างน้อยสำหรับวัตถุประสงค์ของปุ่มต่างประเทศ ไม่ได้หมายความว่าคุณไม่ควรมีคีย์ตัวแทนแบบฟิลด์เดียวเช่นกันหากคุณต้องการ แต่ส่วนตัวแล้วฉันชอบคีย์ที่ใช้บ่อยที่สุดเป็นเป้าหมายของคีย์ต่างประเทศที่จะเรียกว่าคีย์หลัก
ฉันจะพยายามแสดงจุดของฉันในตัวอย่างต่อไปนี้ซึ่ง:
brand
คือยี่ห้อรถยนต์เช่น Ford, Toyota เป็นต้น
dealer
เป็นตัวแทนจำหน่ายทางกายภาพเชื่อมโยงกับแบรนด์ (เช่นตัวแทนจำหน่ายฟอร์ดขายฟอร์ดเท่านั้น)
model
เป็นประเภทของรถยนต์เช่นฟอร์ดโฟกัสฟอร์ดเฟียสต้า ฯลฯ
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
ฟอร์ดที่เชื่อมโยงdealer
กับโมเดล "โตโยต้า" การเพิ่ม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) )