डेटाबेस डिजाइन: नई तालिका बनाम नए कॉलम


38

(यह StackOverflow से यहाँ repost होने का सुझाव दिया गया था)

वर्तमान में एक तालिका है .. और इसमें नए डेटा कॉलम जोड़ना शुरू करना होगा। हर रिकॉर्ड नहीं (यहां तक ​​कि नए डेटा कॉलम जोड़ने के बाद नए डेटा के साथ आगे बढ़ने) में डेटा होगा। इसलिए मैं सोच रहा हूं कि क्या यह एक नई तालिका के लिए अधिक अनुकूल है क्योंकि यह वास्तव में कुछ डेटा पंक्तियों का विस्तार है और हर पंक्ति के लिए लागू नहीं है।

दूसरे शब्दों में, चूंकि उन नए डेटा तत्वों के लिए बहुत सारे अप्रयुक्त कॉलम होंगे, ऐसा लगता है कि यह नई तालिका के लिए अधिक अनुकूल होगा?

पहली तालिका पृष्ठ दृश्य (वर्तमान में 2 मिलियन रिकॉर्ड) का एक रिकॉर्ड है

- आईडी
- आईपी पता
- बार देखा गया
- create_at टाइमस्टैम्प
- तारीख

प्रत्येक आईपी पते के लिए, प्रति दिन एक रिकॉर्ड बनाया जाता है - और लगातार पृष्ठदृश्य प्रति दिन बार देखे गए विचारों में जोड़े जाते हैं

अतिरिक्त क्षेत्र (एस) मूल ट्रैकिंग के बिंदु के लिए होगा (यानी Google विश्लेषिकी स्रोत / माध्यम / अभियान)

हर यात्रा में वह जानकारी नहीं होगी। Im मान सकता है कि लगभग 10% पंक्तियों में डेटा होगा (जैसा कि आमतौर पर केवल पहली यात्रा के लिए जिम्मेदार होता है)

डेटा के लिए मुख्य उपयोग यह होगा कि लोग कहां से आए हैं। यह अधिक बार इस्तेमाल किया जा सकता है (जो तब एकल तालिका में उधार देने लगता है)

प्रतिक्रिया की सराहना करें - यदि आवश्यक हो तो और जोड़ सकते हैं

जवाबों:


29

आप जिस से कुश्ती कर रहे हैं वह ऊर्ध्वाधर विभाजन है। यह प्रदर्शन को बेहतर बनाने के लिए एक भौतिक डेटाबेस डिज़ाइन तकनीक है। किसी भी भौतिक डेटाबेस डिजाइन तकनीक के साथ, इसकी प्रयोज्यता उन विशिष्ट प्रश्नों पर निर्भर करती है जिन्हें आप अनुकूलित करने का प्रयास कर रहे हैं और यदि यह तकनीक उन्हें अनुकूलित करेगी। एक तार्किक दृष्टिकोण से, यदि ये नए क्षेत्र आपकी इकाई के लिए उम्मीदवार कुंजी पर निर्भर करते हैं तो वे इसके बारे में तथ्य हैं जो इसके साथ संबंधित हैं। पहले आपको यह सुनिश्चित करना चाहिए कि आप अपने उम्मीदवार कुंजी पर इन नए क्षेत्रों की कार्यात्मक निर्भरता को पूरी तरह से समझने के लिए सत्यापित करें कि वे वास्तव में दैनिक पृष्ठ विचारों के बारे में तथ्य हैं। यदि वे हैं, तो उन्हें किसी अन्य तालिका में विभाजित करने का निर्णय लेना एक प्रदर्शन अनुकूलन है जिसे केवल तभी किया जाना चाहिए जब यह आपके प्रदर्शन लक्ष्यों को प्राप्त करता है।

सामान्य तौर पर, ऊर्ध्वाधर विभाजन उपयोगी होता है यदि आप इन नए स्तंभों को मूल तालिका में अन्य स्तंभों से अलग और विशिष्ट रूप से क्वेरी करेंगे। उन स्तंभों को किसी अन्य तालिका में रखने से जो आपकी मौजूदा तालिका के समान PK साझा करती हैं, आप इसे सीधे क्वेरी कर सकते हैं जब आप उन नए स्तंभों को चाहते हैं और बहुत अधिक थ्रू-पुट प्राप्त करते हैं क्योंकि आपके पास इस नई तालिका के लिए डिस्क पर प्रति पृष्ठ कई और पंक्तियाँ होंगी मूल तालिका से सभी कॉलम उन पंक्तियों पर नहीं बैठे होंगे। हालाँकि, यदि आप हमेशा इन स्तंभों को मूल तालिका में स्तंभों के साथ क्वेरी करेंगे, तो एक ऊर्ध्वाधर विभाजन बहुत ज्यादा मायने नहीं रखेगा क्योंकि आपको उन्हें प्राप्त करने के लिए हमेशा बाहरी जुड़ना होगा। डिस्क पर टेबल से पृष्ठ स्वतंत्र रूप से कभी भी शामिल नहीं हुए, कभी भी DBMS के बफर पूल में आते हैं, और इस तरह से जुड़ने पर हर क्वेरी के निष्पादन के साथ होना होगा, भले ही डेटा को बफ़र पूल में पिन किया गया हो। इस परिदृश्य में उन्हें मूल तालिका पर NULLABLE कॉलम बनाने से DBMS स्टोरेज इंजन को NULL होने पर उन्हें कुशलतापूर्वक स्टोर करने में सक्षम बनाया जा सकता है और पुनर्प्राप्ति पर शामिल होने की आवश्यकता को समाप्त कर सकता है।

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

आप किस DBMS प्लेटफॉर्म का उपयोग कर रहे हैं? जिस तरह से प्लेटफार्म NULL कॉलम स्टोरेज को हैंडल करता है, वह आपकी क्वेरी को अनुकूलित करता है, साथ ही स्पार्स कॉलम सपोर्ट की उपलब्धता (SQL Server में यह है) निर्णय को प्रभावित करेगा। अंततः मैं प्रोडक्शन साइज़ डेटा और वर्कलोड के साथ एक परीक्षण वातावरण में दोनों डिज़ाइनों को आज़माने की सलाह दूंगा और यह देखना होगा कि आपके प्रदर्शन उद्देश्यों को कौन बेहतर करता है।


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

यहाँ सभी मदद के लिए धन्यवाद .. मैंने खेतों को जोड़ने के साथ जलसेक किया, लेकिन इस बारे में सोचने के बाद, मैंने देखा कि मुझे हर चीज को बेहतर ढंग से पहचानने के लिए कुछ अन्य तालिकाओं का होना चाहिए। आखिरकार यह क्या आया आगंतुक आगंतुक_विजिट्स (जिसमें एक आगंतुक_आईडी है और इसमें स्रोत है) पेज_ साक्षात्कार (जिसमें vistor_id और visitor_visit_id है) क्योंकि मैं वास्तव में जानना चाहता हूं कि यात्रा के लिए किस पृष्ठ_दृश्य को जिम्मेदार ठहराया गया है, मैंने उस लिंक को जोड़ा। मैंने इसके लिए थोड़ा
संघर्ष किया

10

व्यक्तिगत रूप से मैं मौजूदा तालिका में कॉलम जोड़ने की ओर झुकता हूं। नई तालिका वास्तव में आपको कुछ भी नहीं खरीदती है:

  • आप वास्तव में बहुत अधिक स्थान नहीं बचाते हैं क्योंकि मूल तालिका में पूर्ण मान किसी भी स्थान को नहीं लेते हैं, और नई तालिका को किसी प्रकार के पहचानकर्ता की आवश्यकता होती है जो किसी भी बचत को बंद कर देता है
  • आपके प्रश्न अधिक जटिल हो जाते हैं ... where newcolumn is not nullaleft outer join

एकल तालिका में इसका मतलब है कि आपकी पंक्ति का आकार पृष्ठ से पृष्ठ पर भिन्न हो सकता है - लेकिन इससे आपके कई मौजूदा पृष्ठ प्रभावित नहीं होते हैं, खासकर यदि आपका क्लस्टर इंडेक्स एक नीरस रूप से बढ़ते कॉलम (पहचान या दिनांक / समय) पर है।


चूंकि तालिका वर्तमान में विस्तृत नहीं है (आपके विवरण के आधार पर) और यह डेटा इसे बहुत व्यापक नहीं बनाएगा, इसलिए मैं सहमत हूं।
HLGEM

4

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

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

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

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