एक बड़े "भगवान की मेज" का उपयोग करने के कई कारण खराब हैं। मैं कोशिश करता हूँ और एक उदाहरण डेटाबेस के साथ समस्याओं का वर्णन करता हूँ। मान लेते हैं कि आप खेल स्पर्धाओं को मॉडल बनाने की कोशिश कर रहे हैं। हम कहेंगे कि आप खेलों और उन खेलों में खेलने वाली टीमों को मॉडल बनाना चाहते हैं। कई तालिकाओं के साथ एक डिजाइन इस तरह दिख सकता है (यह उद्देश्य पर बहुत सरल है, इसलिए उन जगहों पर नहीं पकड़ा जाना चाहिए जहां अधिक सामान्यीकरण लागू किया जा सकता है):
Teams
Id | Name | HomeCity
Games
Id | StartsAt | HomeTeamId | AwayTeamId | Location
और एक एकल तालिका डेटाबेस इस तरह दिखेगा
TeamsAndGames
Id | TeamName | TeamHomeCity | GameStartsAt | GameHomeTeamId | GameAwayTeamId | Location
सबसे पहले, आइए उन तालिकाओं पर सूचकांक बनाते हुए देखें। अगर मुझे टीम के लिए होम सिटी पर एक इंडेक्स की जरूरत है, तो मैं इसे Teams
टेबल या TeamsAndGames
टेबल पर आसानी से जोड़ सकता हूं । याद रखें कि जब भी आप कोई इंडेक्स बनाते हैं, तो उसे कहीं न कहीं डिस्क पर स्टोर करना पड़ता है और टेबल पर पंक्तियों को जोड़कर अपडेट किया जाता है। Teams
तालिका के मामले में यह बहुत सीधा है। मैंने एक नई टीम में रखा, डेटाबेस इंडेक्स को अपडेट करता है। लेकिन किस लिए TeamsAndGames
? ठीक है, एक ही से लागू होता हैTeams
उदाहरण। मैं एक टीम जोड़ता हूं, सूचकांक अपडेट हो जाता है। लेकिन यह भी होता है जब मैं एक खेल जोड़ता हूं! भले ही वह क्षेत्र किसी गेम के लिए शून्य हो, फिर भी इंडेक्स को उस गेम के लिए डिस्क पर अपडेट और स्टोर किया जाना है। एक सूचकांक के लिए, यह बहुत बुरा नहीं है। लेकिन जब आपको इस तालिका में शामिल कई संस्थाओं के लिए कई सूचकांकों की आवश्यकता होती है, तो आप सूचक को संग्रहीत करने के लिए बहुत सारे स्थान बर्बाद करते हैं और बहुत से प्रोसेसर समय उन चीजों के लिए अपडेट करते हैं जहां वे लागू नहीं होते हैं।
दूसरा, डेटा संगति। दो अलग-अलग तालिकाओं का उपयोग करने के मामले में, मैं यह परिभाषित Games
करने के लिए Teams
तालिका से टेबल पर विदेशी कुंजियों का उपयोग कर सकता हूं कि कौन सी टीम खेल में खेल रही है। और यह मानते हुए कि मैं HomeTeamId
और AwayTeamId
स्तम्भों को अशक्त नहीं बनाता , डेटाबेस यह सुनिश्चित करेगा कि मेरे द्वारा लगाए गए हर खेल में 2 टीमें हों और वे टीमें मेरे डेटाबेस में मौजूद हों। लेकिन एकल तालिका परिदृश्य के बारे में क्या? खैर, चूंकि इस तालिका में कई इकाइयां हैं, इसलिए उन स्तंभों को अशक्त होना चाहिए (आप उन्हें अशक्त नहीं कर सकते और कचरा डेटा को वहां भेज सकते हैं, लेकिन यह सिर्फ एक भयानक विचार है)। यदि वे कॉलम अशक्त हैं, तो डेटाबेस अब यह गारंटी नहीं दे सकता है कि जब आप कोई गेम डालें तो उसमें दो टीमें हों।
लेकिन क्या होगा अगर आप वैसे भी इसके लिए जाने का फैसला करते हैं? आप विदेशी कुंजियों को सेट करते हैं, जैसे कि फ़ील्ड उसी तालिका में किसी अन्य इकाई पर वापस जाती हैं। लेकिन अब डेटाबेस केवल यह सुनिश्चित करेगा कि उन संस्थाओं की तालिका में मौजूद हैं, न कि वे सही प्रकार हैं। आप बहुत आसानी GameHomeTeamId
से किसी अन्य गेम की आईडी पर सेट हो सकते हैं और डेटाबेस बिल्कुल भी शिकायत नहीं करेगा। यदि आपने कोशिश की कि एकाधिक तालिका परिदृश्य में, डेटाबेस एक फिट फेंक देगा।
आप इन मुद्दों को "ठीक है, हम कह सकते हैं कि हम यह सुनिश्चित करेंगे कि हम कोड में कभी ऐसा न करें"। यदि आप पहली बार बग फ्री कोड लिखने की अपनी क्षमता पर विश्वास कर रहे हैं और उपयोगकर्ता द्वारा कोशिश की जा सकने वाली चीजों के हर अजीब संयोजन को ध्यान में रखने की आपकी क्षमता है, तो ठीक है। मैं व्यक्तिगत रूप से उन दोनों चीजों को करने की अपनी क्षमता में विश्वास नहीं कर रहा हूं, इसलिए मैं डेटाबेस को मुझे एक अतिरिक्त सुरक्षा जाल दूंगा।
(यह तब और भी बदतर हो जाता है जब आपका डिज़ाइन वह होता है जहां आप विदेशी कुंजियों का उपयोग करने के बजाय पंक्तियों के बीच सभी प्रासंगिक डेटा को कॉपी करते हैं। किसी भी वर्तनी / अन्य डेटा असंगतता को हल करना मुश्किल होगा। आप कैसे बता सकते हैं कि "जॉन" जॉन की गलत वर्तनी है। "या अगर यह जानबूझकर था (क्योंकि वे दो अलग-अलग लोग हैं)?"
तीसरा, लगभग हर स्तंभ को अशक्त होने की आवश्यकता है या उसे कॉपी किए गए या कचरा डेटा से भरा होना चाहिए। एक खेल एक की जरूरत नहीं है TeamName
या TeamHomeCity
। तो या तो हर खेल को वहां किसी प्रकार के प्लेसहोल्डर की जरूरत होती है या उसे अशक्त होने की जरूरत होती है। और अगर यह अशक्त है, तो डेटाबेस ख़ुशी के साथ कोई खेल लेगा TeamName
। यह बिना नाम वाली टीम भी लेगा, भले ही आपका व्यवसाय तर्क कहता हो कि ऐसा कभी नहीं होना चाहिए।
वहाँ कुछ अन्य कारण हैं कि आप अलग-अलग तालिकाओं को क्यों विकसित करना चाहते हैं (जिसमें विकासकर्ता संन्यास भी शामिल है)। यहां तक कि कुछ कारण भी हैं कि एक बड़ी तालिका बेहतर हो सकती है (पुनरावृत्ति कभी-कभी प्रदर्शन में सुधार करती है)। उन परिदृश्यों के बीच कुछ और दूर हैं (और आमतौर पर सबसे अच्छा संभाला जाता है जब आपके पास प्रदर्शन मैट्रिक्स है यह दिखाने के लिए कि यह वास्तव में समस्या है, लापता सूचकांक या कुछ और नहीं)।
अंत में, कुछ ऐसा विकसित करें जिसे बनाए रखना आसान होगा। सिर्फ इसलिए कि यह "काम करता है" इसका मतलब यह नहीं है कि यह ठीक है। भगवान की मेज (जैसे देव वर्गों) को बनाए रखने की कोशिश एक बुरा सपना है। आप बस बाद में दर्द के लिए खुद को स्थापित कर रहे हैं।