การเลือกว่าจะใช้คีย์หลักแทนเมื่อใดเมื่อเทียบกับคีย์ธรรมชาตินั้นค่อนข้างยุ่งยาก คำตอบเช่นเสมอหรือไม่เคยไม่ค่อยมีประโยชน์ ฉันพบว่ามันขึ้นอยู่กับสถานการณ์
ตัวอย่างเช่นฉันมีตารางต่อไปนี้:
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มีบทความดีๆเกี่ยวกับเรื่องนี้โดยเฉพาะ