sql यवस क्या यह संबंधपरक डेटाबेस में पता जानकारी मॉडल करने का एक अच्छा तरीका है?




संबंधपरक डेटाबेस प्रबंधन प्रणाली (6)

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

विकल्प 1 सभी पता कॉलम को विभिन्न तालिकाओं पर विशेषताओं के रूप में रखें। आपूर्तिकर्ता से नीचे दिए गए विवरण को पीओ में कॉपी करें। संभावित रूप से कई प्रतियों को स्टोर करें

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

मैं विकल्प 2 की तरफ झुका रहा हूं। क्या कोई बेहतर तरीका है?

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

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


संदेह के बिना विकल्प 2।

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

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


मैं वास्तव में इसे अपने साक्षात्कार के सवालों में से एक के रूप में उपयोग करता हूं। शुरू करने के लिए निम्नलिखित एक अच्छी जगह है:

Addresses
---------
AddressId (PK)
Street1
... (etc)

तथा

AddressTypes
------------
AddressTypeId
AddressTypeName

तथा

UserAddresses (substitute "Company", "Account", whatever for Users)
-------------
UserId
AddressTypeId
AddressId

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

एक संभावित बड़े डेटाबेस के लिए कुछ हद तक विरोधाभासी सलाह का एक टुकड़ा: आगे बढ़ें और "HasMoreAddresses" फ़ील्ड के साथ सीधे अपनी संस्थाओं (इस मामले में उपयोगकर्ता तालिका में) पर "प्राथमिक" पता डालें। यह सिर्फ ऊपर साफ डिजाइन का उपयोग करने की तुलना में icky लगता है, लेकिन सामान्य उपयोग मामलों के लिए कोडिंग को सरल बना सकता है, और denormalization प्रदर्शन के लिए एक बड़ा अंतर कर सकते हैं।


पता तालिका पर पंक्तियों में से कोई भी पंक्ति अप्रयुक्त क्यों होगी? निश्चित रूप से वे अभी भी खरीद आदेश द्वारा इंगित किया जाएगा जो उन्हें इस्तेमाल किया?

ऐसा लगता है कि डुप्लिकेट को रोकना प्राथमिकता होना चाहिए, इस प्रकार किसी भी सफाई के लिए आवश्यकता को अस्वीकार कर देना चाहिए।


क्या आप खरीद आदेश पर मूल रूप से किस पते का ऐतिहासिक रिकॉर्ड रखना चाहते हैं?

यदि हाँ विकल्प 1 के साथ जाते हैं, अन्यथा इसे आपूर्तिकर्ता तालिका में संग्रहीत करें और आपूर्तिकर्ता को प्रत्येक खरीद आदेश को लिंक करें।

बीटीडब्लू: खराब डीबी डिज़ाइन का एक निश्चित संकेत डेटा को "साफ" या सिंक में रखने के लिए स्वचालित नौकरी की आवश्यकता है। विकल्प 2 उस उपाय से एक बुरा विचार है


आदेशों के मामले में, यदि आप आदेश भेजा गया है तो आप पते को अपडेट नहीं करना चाहेंगे क्योंकि व्यक्ति (या कंपनी) पता बदल गया है। ऑर्डर के साथ कोई समस्या होने पर ऑर्डर वास्तव में भेजा गया था, जहां आपने रिकॉर्ड किया था।

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


मैंने विकल्प 1 का उपयोग करके प्रत्येक सिस्टम को डेटा गुणवत्ता की परेशानी में पाया है। 5 वर्षों के बाद सभी पते का 30% अब चालू नहीं होगा।







rdbms