सबसे पहले, एक रिलेशनल डेटाबेस का राइसन डीट्रे (होने का कारण) संस्थाओं के बीच संबंधों को मॉडल करने में सक्षम होना है। जुड़ाव बस वे तंत्र हैं जिनके द्वारा हम उन रिश्तों को आगे बढ़ाते हैं। वे निश्चित रूप से मामूली लागत पर आते हैं, लेकिन जुड़ने के बिना, वास्तव में एक संबंधपरक डेटाबेस होने का कोई कारण नहीं है।
शैक्षणिक दुनिया में हम विभिन्न सामान्य रूपों (1, 2, 3, बॉयस-कोडड, आदि) जैसी चीजों के बारे में सीखते हैं, और हम विभिन्न प्रकार की चाबियों (प्राथमिक, विदेशी, वैकल्पिक, अद्वितीय, आदि) और कैसे के बारे में सीखते हैं। डेटाबेस को डिजाइन करने के लिए ये चीजें एक साथ फिट होती हैं। और हम संरचना और डेटा (DDL & DML) दोनों में हेरफेर करने के साथ-साथ SQL की अशिष्टताओं को भी सीखते हैं।
कॉरपोरेट जगत में, कई अकादमिक निर्माण काफी हद तक कम व्यवहार्य हैं, जितना हम विश्वास करने के लिए नेतृत्व कर रहे थे। एक आदर्श उदाहरण एक प्राथमिक कुंजी की धारणा है। अकादमिक रूप से यह वह विशेषता (या विशेषताओं का संग्रह) है जो विशिष्ट रूप से तालिका में एक पंक्ति को पहचानती है। इसलिए कई समस्या डोमेन में, उचित शैक्षणिक प्राथमिक कुंजी 3 या 4 विशेषताओं का एक संयोजन है। हालांकि, आधुनिक कॉर्पोरेट दुनिया में लगभग हर कोई तालिका की प्राथमिक कुंजी के रूप में एक ऑटो-जेनरेट किया गया, अनुक्रमिक पूर्णांक का उपयोग करता है। क्यों? दो कारण। पहला कारण यह है कि जब आप FKs को पूरे स्थान पर स्थानांतरित कर रहे हैं तो यह मॉडल को बहुत अधिक स्वच्छ बनाता है। इस सवाल का दूसरा और सबसे जर्मेन है, यह है कि जॉइन के माध्यम से डेटा को पुनः प्राप्त करना एक ही पूर्णांक पर तेज और अधिक कुशल है, यह 4 वर्कर कॉलम पर है (जैसा कि कुछ लोगों द्वारा पहले ही उल्लेख किया गया है)।
आइए अब वास्तविक विश्व डेटाबेस के दो विशिष्ट उपप्रकारों में थोड़ा गहरा खुदाई करें। पहला प्रकार एक लेनदेन डेटाबेस है। आधुनिक साइटों को चलाने वाले कई ई-कॉमर्स या सामग्री प्रबंधन अनुप्रयोगों के लिए यह आधार है। लेन-देन DB के साथ, आप "लेन-देन थ्रूपुट" की ओर बहुत अधिक अनुकूलन कर रहे हैं। अधिकांश वाणिज्य या सामग्री एप्लिकेशन को सम्मिलित प्रदर्शन (अन्य तालिकाओं में) के साथ क्वेरी प्रदर्शन (कुछ तालिकाओं से) को संतुलित करना होता है, हालांकि प्रत्येक ऐप के पास अपने स्वयं के अनूठे व्यवसाय संचालित मुद्दे होंगे।
वास्तविक विश्व डेटाबेस का दूसरा प्रकार एक रिपोर्टिंग डेटाबेस है। इनका उपयोग लगभग विशेष रूप से व्यावसायिक डेटा एकत्र करने और सार्थक व्यावसायिक रिपोर्ट उत्पन्न करने के लिए किया जाता है। वे आमतौर पर लेनदेन डेटाबेस की तुलना में भिन्न आकार के होते हैं जहां डेटा उत्पन्न होता है और वे बड़े या जटिल डेटा सेट के साथ बल्क डेटा लोडिंग (ETL) और क्वेरी प्रदर्शन की गति के लिए अत्यधिक अनुकूलित होते हैं।
प्रत्येक मामले में, डेवलपर या डीबीए को कार्यक्षमता और प्रदर्शन घटता दोनों को सावधानीपूर्वक संतुलित करने की आवश्यकता होती है, और समीकरण के दोनों तरफ बहुत सारे प्रदर्शन को बढ़ाने वाली चालें होती हैं। ओरेकल में आप वह कर सकते हैं जिसे "स्पष्टीकरण योजना" कहा जाता है ताकि आप विशेष रूप से देख सकें कि किसी क्वेरी को कैसे पार्स और निष्पादित किया जाता है। आप DB के इंडेक्स के उचित उपयोग को अधिकतम करने के लिए देख रहे हैं। एक सच में बुरा नहीं-नहीं एक क्वेरी के क्लॉज में एक फ़ंक्शन डालना है। जब भी आप ऐसा करते हैं, तो आप गारंटी देते हैं कि ओरेकल उस विशेष कॉलम पर किसी भी इंडेक्स का उपयोग नहीं करेगा और आपको स्पष्टीकरण योजना में एक पूर्ण या आंशिक टेबल स्कैन दिखाई देगा। यह केवल एक विशिष्ट उदाहरण है कि एक क्वेरी कैसे लिखी जा सकती है जो धीमा हो रही है, और इसमें कुछ भी नहीं है।
और जब हम टेबल स्कैन के बारे में बात कर रहे होते हैं, तो वे स्पष्ट रूप से तालिका के आकार के अनुपात में क्वेरी की गति को प्रभावित करते हैं। 100 पंक्तियों की एक पूर्ण तालिका स्कैन भी ध्यान देने योग्य नहीं है। एक ही क्वेरी को 100 मिलियन पंक्तियों वाली तालिका पर चलाएँ, और आपको वापसी के लिए अगले सप्ताह वापस आना होगा।
चलो एक मिनट के लिए सामान्यीकरण के बारे में बात करते हैं। यह एक और बड़े पैमाने पर सकारात्मक शैक्षणिक विषय है जो अति-तनावग्रस्त हो सकता है। अधिकांश समय जब हम सामान्यीकरण के बारे में बात करते हैं, तो हम वास्तव में डुप्लिकेट डेटा के उन्मूलन को अपनी तालिका में डालकर और एफके का माइग्रेशन करते हैं। आमतौर पर लोग 2NF और 3NF द्वारा बताई गई पूरी निर्भरता वाली चीजों को छोड़ देते हैं। और फिर भी एक चरम मामले में, यह निश्चित रूप से एक परिपूर्ण बीसीएनएफ डेटाबेस है जो बहुत बड़ा है और इसके खिलाफ कोड लिखने के लिए एक पूर्ण जानवर है क्योंकि यह बहुत सामान्यीकृत है।
तो हम संतुलन कहां रखते हैं? एक भी श्रेष्ठ उत्तर नहीं है। सभी बेहतर उत्तर संरचना संरचना के रखरखाव में आसानी, डेटा रखरखाव में आसानी और कोड निर्माण / रखरखाव में आसानी के बीच कुछ समझौता करते हैं। सामान्य तौर पर, डेटा का कम दोहराव, बेहतर।
तो कभी-कभी क्यों धीमी गति से जुड़ते हैं? कभी-कभी यह खराब संबंधपरक डिज़ाइन होता है। कभी-कभी यह अप्रभावी अनुक्रमण होता है। कभी-कभी यह एक डेटा वॉल्यूम समस्या है। कभी-कभी यह एक भयावह लिखित प्रश्न होता है।
इस तरह के लंबे जवाब के लिए खेद है, लेकिन मैंने अपनी टिप्पणियों के चारों ओर एक मांसल संदर्भ प्रदान करने के लिए मजबूर महसूस किया, बजाय 4-बुलेट प्रतिक्रिया के केवल खड़खड़ाने के लिए।