नहीं।
मैं कहूंगा कि निश्चित रूप से ऐसे मामले हैं जब एकल-फ़ील्ड कुंजियाँ यौगिक कुंजियों से हीन होती हैं, कम से कम विदेशी कुंजियों के उद्देश्य से । यह कहना नहीं है कि आपके पास एक एकल-क्षेत्र सरोगेट कुंजी नहीं होनी चाहिए, यदि आप चाहें, लेकिन मैं व्यक्तिगत रूप से उस कुंजी को पसंद करता हूं जिसे अक्सर एक विदेशी कुंजी के लक्ष्य के रूप में उपयोग किया जाता है जिसे प्राथमिक कुंजी कहा जाता है
मैं निम्नलिखित उदाहरणों में अपनी बात को स्पष्ट करने का प्रयास करूँगा, जिसमें:
brand
कार मार्के, उदाहरण के लिए फोर्ड, टोयोटा आदि है
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) )