एसक्यूएल - कई-कई-टेबल प्राथमिक कुंजी


125

इस प्रश्न में एक टिप्पणी पढ़ने के बाद यह प्रश्न आता है:

डेटाबेस डिजाइन

जब आप कई-से-कई तालिका बनाते हैं, तो क्या आपको दो विदेशी कुंजी स्तंभों पर एक समग्र प्राथमिक कुंजी बनाना चाहिए, या एक ऑटो-इंक्रीमेंट सरोगेट "आईडी" प्राथमिक कुंजी बनाना चाहिए, और बस अपने दो एफके कॉलमों पर अनुक्रमणिकाएं डालें (और शायद एक अद्वितीय बाधा)? प्रत्येक मामले में नए रिकॉर्ड / पुन: अनुक्रमण सम्मिलित करने के लिए प्रदर्शन पर निहितार्थ क्या हैं?

मूल रूप से, यह:

PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)

इस बनाम:

PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)

टिप्पणीकार कहता है:

पीके को दो आईडी बनाने का मतलब है कि तालिका भौतिक रूप से उस क्रम में डिस्क पर सॉर्ट की गई है। इसलिए यदि हम (Part1 / Device1), (Part1 / Device2), (Part2 / Device3) सम्मिलित करते हैं, तो (भाग 1 / Device3) डेटाबेस को तालिका को अलग करना होगा और प्रविष्टियों 2 और 3. के बीच अंतिम एक सम्मिलित करना होगा। कई रिकॉर्ड, यह बहुत समस्याग्रस्त हो जाता है क्योंकि इसमें हर बार एक जोड़ने के दौरान सैकड़ों, हजारों, या लाखों रिकॉर्ड शामिल होते हैं। इसके विपरीत, एक autoincrementing PK नए रिकॉर्ड को अंत तक निपटने की अनुमति देता है।

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


यहाँ SO पर एक सिलेमर प्रश्न पोस्ट किया गया है: stackoverflow.com/questions/344068/…
टोनी

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

1
क्या इसका उत्तर इस बात पर निर्भर नहीं करता है कि DBMS का उपयोग क्या है? मुझे संदेह है कि MySQL इस मामले में एक तरह से व्यवहार करेगा, SQL-Server एक और तरीके से थोड़ा-सा इत्यादि
Radu Murzea

कैविएट: एक विशिष्ट डेटाबेस टैग के बिना, यहां जो कुछ कहा गया है, वह संदिग्ध है। अलग-अलग इंजन अलग-अलग काम करते हैं!
रिक जेम्स

जवाबों:


85

एक साधारण दो-स्तंभ कई-से-कई मानचित्रण के साथ, मुझे सरोगेट कुंजी होने का कोई वास्तविक लाभ नहीं दिखता है। पर एक प्राथमिक कुंजी होने (col1,col2)की गारंटी अद्वितीय है ( संदर्भित तालिकाओं में आपके col1और col2मूल्यों को अद्वितीय मानते हुए ) और (col2,col1)उन पर एक अलग सूचकांक उन मामलों को पकड़ लेगा जहां विपरीत क्रम तेजी से निष्पादित होगा। सरोगेट अंतरिक्ष की बर्बादी है।

आपको व्यक्तिगत स्तंभों पर अनुक्रमित करने की आवश्यकता नहीं होगी क्योंकि तालिका का उपयोग केवल दो संदर्भित तालिकाओं को एक साथ जोड़ने के लिए किया जाना चाहिए।

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

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

इसके अलावा, डेटाबेस तालिकाओं के विशाल बहुमत को पढ़ रहे हैं अब तक अधिक बार लिखा है। वह कुछ भी करता है जिसे आप चयन पक्ष पर सम्मिलित की गई किसी भी चीज़ से कहीं अधिक प्रासंगिक बनाते हैं।


अंतिम बिंदु एक अच्छा सामान्यीकरण नहीं है: "डेटाबेस टेबल के विशाल बहुमत को लिखित की तुलना में कहीं अधिक बार पढ़ा जाता है"। मुझे साहचर्य सारणी के कई उदाहरण मिलते हैं जिन्हें बहुत बार लिखा जाना चाहिए उदाहरण के लिए ग्राहक को आदेश देने वाली एक तालिका।
यूजर

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

अमेज़ॅन के बारे में सोचो - हर घंटे हजारों ऑर्डर बनाए गए।
यूजर

9
@buffer, हाँ, लेकिन फिर से, उन आदेशों में से प्रत्येक के लगभग निश्चित रूप से की जाएगी पूछे (उदाहरण के लिए) करने के लिए कई बार पैकेजिंग, बिलिंग, स्थिति अद्यतन, व्यापार विश्लेषिकी और इतने पर। बनाता और पढ़ता के बीच के अनुपात की तुलना में बनाता है की पूर्ण संख्या कम महत्वपूर्ण है।
paxdiablo

1
मेरी बात यह है कि, insertअगर यह प्रति घंटे हजारों बार किया जा रहा है तो कोई बात नहीं होगी। आप बस इसे नजरअंदाज नहीं कर सकते सिर्फ इसलिए के अनुपात insertके लिए selectहै <1. इस मामले में, कितना समय यह आदेश देते समय लेता है के बारे में ग्राहक चिंताओं।
यूजर

19

लिंक टेबल के लिए कोई सरोगेट कुंजी की आवश्यकता नहीं है।

(PK1, col2) पर एक PK और (col2, col1) पर एक और अद्वितीय सूचकांक आपको चाहिए

जब तक आप एक ORM का उपयोग नहीं करते हैं जो आपके लिए अपने DB डिज़ाइन का सामना नहीं कर सकता है और उसे नियंत्रित कर सकता है ...

संपादित करें: मैंने यहां भी उत्तर दिया: एसक्यूएल: क्या आपको कई-कई तालिकाओं के लिए एक ऑटो-वृद्धिशील प्राथमिक कुंजी की आवश्यकता है?


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

@ जीबी: (col2, col1) पर दूसरा सूचकांक अद्वितीय, सही होने की आवश्यकता नहीं है?
उपयोगकर्ता

1
(पीके 1, कॉल 2) पर एक अनोखा सूचकांक डालने के बाद यह पहले से ही एक पीके पूरी तरह से निरर्थक है
डॉन चेडल

@mmcrae: हम कहाँ कर रहे हैं?
gbn

2
@mmcrae: आपकी टिप्पणी "(col1, col2) पर एक अद्वितीय सूचकांक डाल रही है .."। एक सूचकांक मामलों में स्तंभ क्रम। (col2, col1)नहीं है (col1, col2)। पीके (col1, col2)सभी प्रश्नों के लिए उपयुक्त नहीं हो सकता है और स्कैन उत्पन्न करता है, इसलिए इसका उल्टा होने से प्रदर्शन में सुधार होता है क्योंकि यह जहां कॉक्स 2 बेहतर है, वहां अनुमति देता है। उदाहरण के लिए, FK सत्यापन जब col2 वाली तालिका को हटा दिया जाता है। चाइल्ड टेबल स्मट्स को चेक किया जाना चाहिए
gbn

12

यदि तालिका को संदर्भित किया जाता है तो एक वृद्धिशील प्राथमिक कुंजी की आवश्यकता हो सकती है। कई-से-कई तालिका में विवरण हो सकते हैं जिन्हें वृद्धिशील प्राथमिक कुंजी का उपयोग करके किसी अन्य तालिका से खींचने की आवश्यकता होती है।

उदाहरण के लिए

PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Other Details

FK के रूप में PartDevice.ID का उपयोग करके 'अन्य विवरण' को खींचना आसान है। इस प्रकार वृद्धिशील प्राथमिक कुंजी के उपयोग की आवश्यकता है।


1
धन्यवाद! मैं उत्तर के रूप में आया था क्योंकि मैं लगभग उसी परिदृश्य की तलाश कर रहा था जो आपने वर्णित किया था। लेकिन आप "अन्य विवरण" जोड़कर अपने पहले वाक्य से दूर चले गए। क्या होगा यदि मेरे पास कई से कई मैपिंग टेबल हैं, जिन्हें मुझे दूसरी टेबल से संदर्भित करने की आवश्यकता है? मतलब, कई से कई मैपिंग टेबल ने किसी भी अन्य जानकारी को संग्रहीत नहीं किया है ... क्या अतिरिक्त आईडी कॉलम का कोई मतलब होगा? यदि नहीं, तो मैपिंग टेबल के एक रिकॉर्ड के संदर्भ में कैसे?
मिथ्रोप्रोप

यहां दो विकल्प हैं, आप अपनी संदर्भ तालिका से एक विदेशी कुंजी के रूप में यौगिक कुंजी का उपयोग कर सकते हैं (यह आपकी नई तालिका में एक अतिरिक्त स्तंभ जोड़ता है), या आप मैपिंग टेबल के लिए एक आईडी कॉलम बना सकते हैं और मूल परिसर में अद्वितीय बाधा सेट कर सकते हैं प्राथमिक कुंजी जबकि नया आईडी कॉलम प्राथमिक कुंजी बन जाएगा।
Vočko

6

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


2

तो ऐसा लगता है कि अगर केवल दो टेबल को जोड़ने का काम है, तो सबसे अच्छा पीके दोहरे कॉलम वाला पीके होगा।

लेकिन अगर यह अन्य उद्देश्यों को पूरा करता है, तो एक पीके के रूप में एक विदेशी कुंजी और दूसरा अद्वितीय सूचकांक के साथ एक और NDX जोड़ें।

इंडेक्स या पीके यह सुनिश्चित करने का सबसे अच्छा तरीका है कि कोई डुप्लिकेट न हो। पीके Microsoft प्रबंधन स्टूडियो जैसे उपकरण आपके लिए कुछ काम (विचार बनाने) करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.