2013-02-03 16 views
21

के साथ कई से कई संबंध बना रहा है। मैं माइक्रोसॉफ्ट एसक्यूएल सर्वर प्रबंधन स्टूडियो का उपयोग कर रहा हूं और जंक्शन तालिका बनाते समय मुझे जंक्शन तालिका के लिए एक आईडी कॉलम बनाना चाहिए, अगर ऐसा है तो मैं इसे भी बनाना चाहिए प्राथमिक कुंजी और पहचान कॉलम? या बस उन तालिकाओं के लिए 2 कॉलम रखें जिन्हें मैं कई से अधिक संबंधों में शामिल कर रहा हूं?एमएस एसक्यूएल जंक्शन तालिका

उदाहरण के लिए अगर यह होगा कई-कई टेबल:

MOVIE 
Movie_ID 
Name 
etc... 

CATEGORY 
Category_ID 
Name 
etc... 

मैं जंक्शन तालिका बनाने चाहिए:

MOVIE_CATEGORY_JUNCTION 
Movie_ID 
Category_ID 
Movie_Category_Junction_ID 

[और Movie_Category_Junction_ID मेरी प्राथमिक कुंजी बनाने के लिए और के रूप में उपयोग पहचान कॉलम]?

या:

MOVIE_CATEGORY_JUNCTION 
Movie_ID 
Category_ID 

[और बस कोई प्राथमिक कुंजी या पहचान की मेज के साथ इसे वैसे ही]?

MOVIE_CATEGORY_JUNCTION 
Movie_ID 
Category_ID 

प्राथमिक कुंजी दोनों स्तंभों की संयोजन होगा:

उत्तर

40

मैं दूसरे जंक्शन तालिका का प्रयोग करेंगे। आपके पास प्रत्येक कॉलम से Movie और Category तालिका में एक विदेशी कुंजी भी होगी।

जंक्शन तालिका इस के समान दिखेगा:

create table movie_category_junction 
(
    movie_id int, 
    category_id int, 
    CONSTRAINT movie_cat_pk PRIMARY KEY (movie_id, category_id), 
    CONSTRAINT FK_movie 
     FOREIGN KEY (movie_id) REFERENCES movie (movie_id), 
    CONSTRAINT FK_category 
     FOREIGN KEY (category_id) REFERENCES category (category_id) 
); 

देखें SQL Fiddle with Demo

PRIMARY KEY के रूप में इन दो फ़ील्ड का उपयोग करके डुप्लिकेट मूवी/श्रेणी संयोजन को तालिका में जोड़ने से रोक दिया जाएगा।

+1

मैं वही काम करूंगा। एक तीसरा कॉलम जोड़ने से डुप्लिकेट रिकॉर्ड हो सकते हैं। –

+0

इस मामले में एक समग्र प्राथमिक कुंजी बनाने के लिए आवश्यक है? –

+0

@ हैरी.Naeem यदि आप नहीं करते हैं, तो आप तालिका में डुप्लिकेट रिकॉर्ड आसानी से समाप्त कर सकते हैं। मुझे नहीं लगता कि आप इसे चाहते हैं। – Taryn

16

इस पर विचार के विभिन्न स्कूल हैं। एक स्कूल प्राथमिक कुंजी को शामिल करता है और लिंकिंग टेबल का नामकरण करता है जो कि लिंक करने वाली दो तालिकाओं की तुलना में कुछ महत्वपूर्ण है। तर्क यह है कि हालांकि तालिका केवल एक लिंकिंग टेबल की तरह प्रतीत हो सकती है, लेकिन यह महत्वपूर्ण डेटा के साथ अपनी तालिका बन सकती है।

एक उदाहरण पत्रिकाओं और ग्राहकों के बीच बहुत से उदाहरण हैं। वास्तव में यह लिंक अपनी विशेषताओं, जैसे कि समाप्ति तिथि, भुगतान स्थिति इत्यादि के साथ एक सदस्यता है

हालांकि, मुझे लगता है कि कभी-कभी एक लिंकिंग टेबल केवल एक लिंकिंग टेबल है। श्रेणियों के साथ कई रिश्तों में से कई इस का एक अच्छा उदाहरण है।

तो इस मामले में, एक अलग एक फ़ील्ड प्राथमिक कुंजी आवश्यक नहीं है। आपके पास एक ऑटो-असाइन कुंजी हो सकती है, जो कुछ भी चोट नहीं पहुंचाएगी, और विशिष्ट रिकॉर्ड को आसान बना देगा। यह एक सामान्य अभ्यास के रूप में अच्छा हो सकता है, इसलिए यदि तालिका बाद में अपने महत्वपूर्ण डेटा (सब्सक्रिप्शन के रूप में) के साथ एक महत्वपूर्ण तालिका में विकसित हो जाती है तो इसमें पहले से ही एक ऑटो-असाइन प्राथमिक कुंजी होगी।

डुप्लीकेट से बचने के लिए आप दो क्षेत्रों पर एक अद्वितीय अनुक्रमणिका डाल सकते हैं। यदि आपके पास एक अलग ऑटो-असाइन कुंजी है तो यह डुप्लीकेट को भी रोक देगा। आप दोनों क्षेत्रों को अपनी प्राथमिक कुंजी के रूप में उपयोग कर सकते हैं (जो एक अद्वितीय अनुक्रमणिका भी है)।

तो, विचार का एक स्कूल पूर्णांक ऑटो-असाइन प्राथमिक कुंजी के साथ चिपक सकता है, और यौगिक प्राथमिक कुंजी से बचाता है। ऐसा करने का यह एकमात्र तरीका नहीं है, और शायद सबसे अच्छा नहीं है, लेकिन यह आपको एक समस्या में गलत नहीं करेगा, जहां आपको वास्तव में खेद है।

लेकिन, आप जो कुछ भी कर रहे हैं उसके लिए, आप शायद केवल दो क्षेत्रों के साथ ठीक होंगे। मैं अभी भी दो क्षेत्रों को एक यौगिक प्राथमिक कुंजी बनाने, या कम से कम दो क्षेत्रों पर एक अद्वितीय अनुक्रमणिका डालने की सलाह दूंगा।

0

मैं दूसरी जंक्शन तालिका के साथ जाऊंगा। लेकिन उन दो क्षेत्रों को प्राथमिक कुंजी के रूप में बनाएं। यह डुप्लिकेट प्रविष्टियों को प्रतिबंधित करेगा।

संबंधित मुद्दे