क्या मुझे इस "मैपिंग" तालिका के लिए एक अलग आईडी कॉलम की आवश्यकता है?


10

मेरे पास एक टेबल Producersऔर एक टेबल है Products, दोनों फॉर्म के हैं:

  • Id - int, प्राथमिक कुंजी
  • Name - नवरच

एक निर्माता कई उत्पाद ले जा सकता है, इसलिए मैं एक तालिका बनाने जा रहा था जिसका नाम ProducerDetailsहोगा:

  • ProducerId - int, विदेशी कुंजी Producers.Id
  • ProductId - int, विदेशी कुंजी Products.Id

फिर मैंने खुद से सवाल करना शुरू किया, तो मैंने सोचा कि मैं विशेषज्ञों से पूछूंगा। क्या Idमेरी ProducerDetailsतालिका में एक अतिरिक्त (int, प्राथमिक कुंजी) कॉलम रखना बेहतर डेटाबेस डिज़ाइन होगा ? या कि अनावश्यक है?

मैं SQL- सर्वर 2008 R2 का उपयोग कर रहा हूँ, अगर इससे कोई फर्क पड़ता है।

संपादित करें - इन तालिकाओं के बीच संबंध कई-से-कई होंगे, मेरा मानना ​​है कि क्षमा करें, मैंने यह स्पष्ट नहीं किया। एक निर्माता कई प्रकार के उत्पाद ले सकता है, और एक ही उत्पाद कई अलग-अलग उत्पादकों द्वारा उत्पादित किया जा सकता है।

यदि यह प्रश्न अत्यधिक सरल है, तो मैं माफी माँगता हूँ।

जवाबों:


6

यदि आपके पास प्रोड्यूसर्स और प्रोडक्ट्स के बीच एक-से-कई संबंध हैं (दूसरे शब्दों में, एक उत्पाद केवल एक निर्माता से संबंधित हो सकता है), तो इससे सीधे तौर पर आपकी Productsतालिका में एक विदेशी कुंजी संदर्भ डालने का अर्थ होगा :

अनेको के लिये एक

create table Producer
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table Product
(
    id int identity(1, 1) not null,
    Name varchar(100) not null,
    ProducerId int not null foreign key references Producer(id)
)
go

लेकिन अगर एक मौका है कि यह कई-से-कई संबंध होंगे, तो आपका सबसे अच्छा शर्त एक जॉइन टेबल का उपयोग करना होगा।

कई कई

create table Producer
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table Product
(
    id int identity(1, 1) not null primary key clustered,
    Name varchar(100) not null
)
go

create table ProductProducer
(
    ProductId int not null foreign key references Product(id),
    ProducerId int not null foreign key references Producer(id)
)
go

-- adding the primary key also ensures uniqueness
alter table ProductProducer
add constraint PK_ProductProducer 
primary key (ProductId, ProducerId)
go

यदि आप ज्वाइन टेबल के साथ जाने का निर्णय लेते हैं, तो आपको एक अतिरिक्त कुंजी रखने की आवश्यकता नहीं होगी, क्योंकि ProductId/ProducerIdअंत में संयोजन अद्वितीय होगा। आप उन्हें एक समग्र कुंजी के रूप में उपयोग कर सकते हैं, इसलिए आपको उस अतिरिक्त Idक्षेत्र की आवश्यकता नहीं होगी ProductProducer


1
यद्यपि आप वास्तविक प्रश्न का उत्तर नहीं देते हैं - वह पूछ रहा है कि क्या idउसके संबंध तालिका में एक क्षेत्र होने का कोई मूल्य है ?
जेएनके

@JNK मैंने अपना प्रश्न संपादित किया है। यदि ProductId, ProducerIdएक अद्वितीय संयोजन है, तो मुझे जॉइन टेबल में एक और कृत्रिम कुंजी जोड़ने की आवश्यकता नहीं है। माना? और मुझे लगता है, जब तक मैं इस प्रश्न को गलत समझ रहा हूं, ओपी को इस उपयोग-मामले के लिए ज्वाइन टेबल का उपयोग करने की आवश्यकता नहीं है।
थॉमस स्ट्रिंगर

@ jadarnel27 ठीक है, स्पष्टीकरण के लिए धन्यवाद। मैंने अपने उत्तर के उस भाग को पार कर लिया है (हालाँकि मुझे लगता है कि आगे के संदर्भ के लिए कुछ पदचिह्न रखना समझदारी है)।
थॉमस स्ट्रिंगर

7

नहीं, इस तालिका में एक अतिरिक्त "प्राथमिक कुंजी" जोड़ने का कोई मूल्य नहीं है। आपके जोड़ केवल कभी-कभी संदर्भित होते हैं ProducerIDऔर ProductIDइसलिए यह केवल मृत वजन है। IMHO।

हालाँकि मैं @Shark से सहमत हूँ कि ज्वाइन टेबल की यहाँ भी ज़रूरत नहीं लगती, जब तक कि आप किसी भी तरह से मौजूदा टेबल के स्कीमा को बदलने के लिए अपने रास्ते से बाहर नहीं जा रहे हैं।

एक तरफ के रूप में, मुझे यह भी लगता है कि अपने प्राथमिक पहचानकर्ता का नाम पूर्ण (उदाहरण के Products.ProductIDबजाय Products.ID) में रखना उचित है ताकि पहचानकर्ता को पूरे स्कीमा में लगातार नाम दिया जाए।


@ jadarnel27: अन्य सभी स्तंभों के लिए, हाँ, इसे बुरा व्यवहार माना जाता है। पीके कॉलम के लिए, कई इस शैली ( ProductID) का उपयोग करना पसंद करते हैं । एक लाभ यह है कि जब आप एक देखते हैं SometableID, तो आप तुरंत जानते हैं कि यह किस तालिका को संदर्भित करता है। एक और यह है कि आप Product JOIN ProducerDetail USING(ProductID)सिंटैक्स का उपयोग कर सकते हैं , इसके बजायProduct JOIN ProducerDetail ON Product.ID = ProducerDetail.ProductID
ypercube

क्षमा करें, मुझे लगता है कि USING(ProductID)यह SQL- सर्वर में उपलब्ध नहीं है, इसलिए यह बात लागू नहीं होती है।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.