डेटाबेस सामान्यीकरण बनाम स्कीमा पारदर्शिता का जिक्र?


10

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

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

अमूर्तता को स्पष्ट करने के लिए, अलग-अलग उपयोगकर्ता डेटा के तीन समूहों पर विचार करें: प्रोफेसरों, प्रशासन, छात्रों (नहीं, यह एक होमवर्क असाइनमेंट नहीं है। वादा करें!)

मानचित्रण 1

(Professor_id, admin_id, और student_id अपनी संबंधित तालिकाओं के लिए विदेशी कुंजी हैं)

| mailing_id (KEY) | professor_id | admin_id | student_id | 
-------------------------------------------------------
| 1001             |     NULL     |    87    |  NULL      |
| 1002             |     123      |   NULL   |  NULL      |
| 1003             |     NULL     |   NULL   |  123       |

इस दृष्टिकोण के लिए +/- विपक्ष पर बहुत भारी लगता है:

  • प्रति पंक्ति दो "बर्बाद" फ़ील्ड
  • 2NF का उल्लंघन करता है
  • विसंगतियों को सम्मिलित / अद्यतन करने के लिए कमजोर (केवल 0-1 फ़ील्ड सेट NULL, उदा) के साथ एक पंक्ति

हालांकि, पेशेवरों की अपनी योग्यता के बिना नहीं हैं:

  • मैपिंग को एकल लुकअप के साथ पूरा किया जा सकता है
  • Mailing_id से किसी दिए गए उपयोगकर्ता के लिए "स्रोत" डेटा को आसानी से निर्धारित करें

सच कहा जाए, तो मेरी आंत में, मुझे यह विचार बिल्कुल पसंद नहीं है।

मानचित्रण २

(मान लें कि MSG_ * परिभाषित स्थिरांक, एनम प्रकार या एक अन्य उपयुक्त पहचानकर्ता हैं)

| mailing_id (KEY)  | user_type (UNIQUE1) | internal_id (UNIQUE2)| 
------------------------------------------------------------------
| 1001              | MSG_ADMIN          | 87                    |
| 1002              | MSG_PROF           | 123                   |
| 1003              | MSG_STUDENT        | 123                   |

इस सेटअप के साथ, और {user_type, internal_id} चीजों का एक अद्वितीय समग्र सूचकांक बहुत अधिक क्लीनर हो जाता है, 3NF बनाए रखा जाता है, और एप्लिकेशन कोड को I / U विसंगतियों के लिए जांचने की आवश्यकता नहीं होती है।

नकारात्मक पक्ष में, उपयोगकर्ता स्रोत तालिकाओं को निर्धारित करने में पारदर्शिता का थोड़ा नुकसान होता है, जो DB के बाहर संभाला जाना होता है, मूल रूप से तालिकाओं के लिए user_type मानों के अनुप्रयोग-स्तर मैपिंग की राशि होती है। अभी, मैं (बल्कि दृढ़ता से) इस 2 मैपिंग की ओर झुक रहा हूं, क्योंकि नकारात्मक पहलू मामूली है।

लेकिन मैं अपनी खुद की सीमाओं के बारे में अच्छी तरह से जानता हूं, और मुझे यकीन है कि मैंने शायद दोनों दिशाओं में फायदे या ठोकरें खाई हैं, इसलिए मैं दिमाग की तुलना में समझदार हूं।



यह वास्तव में दिलचस्प था। दुख की बात है कि मेरी विशिष्ट समस्या पर बहुत अधिक जानकारी नहीं है
GeminiDomino

आप प्रोफेसरों को प्राप्त करने जा रहे हैं जो प्रशासक बन जाते हैं और छात्र जो प्रशासन में नौकरी प्राप्त करते हैं या यहां तक ​​कि संकाय के रूप में 10 साल बाद वापस आते हैं। आप शायद पहले से ही उनके पास हैं। क्या आप उन्हें अलग रखने जा रहे हैं या एकजुट करने की कोशिश कर रहे हैं?
एलिन

भूमिकाएं सिर्फ उदाहरण हैं, लेकिन मैं आपकी बात देखता हूं। व्यवहार में, भले ही उपयोगकर्ताओं ने स्विच भूमिकाएं की हों, फिर भी वे अलग रिकॉर्ड के रूप में बने रहेंगे।
मिथुनदोमिनो

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

जवाबों:


1

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

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

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

"समस्या बच्चा" जो आपको मैपिंग 2 में असुविधा दे रहा है वह USER_TYPEस्तंभ है। यह कॉलम महत्वपूर्ण है क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि INTERNAL_IDउपयोगकर्ता के प्रकार के अनुसार केवल एक बार दिखाई दे। केवल समय के लिए आपको किसी ऐसे कोड की आवश्यकता होती है जो इस बात से भी अवगत हो USER_TYPEकि वह कोड है जो आपके मैपिंग टेबल से सम्मिलित और हटाता है। यह बहुत अच्छी तरह से स्थानीयकृत किया जा सकता है। मुझे लगता है कि आप अपने कोड में एक एकल बिंदु बनाएंगे जहाँ मानचित्रण तालिका सामग्री बनी रहती है। इस एक स्थान पर एक अतिरिक्त स्तंभ जहां डेटा लिखा गया है वह कोई बड़ी बात नहीं है। क्या आप वास्तव में बचना चाहते हैं हर जगह अतिरिक्त कॉलम जोड़ रहा है डेटा पढ़ा जाता है

आपके उप-एप्लिकेशनों में कोड जिसे मैपिंग का उपयोग करने की आवश्यकता होती USER_TYPEहै, प्रत्येक उप-एप्लिकेशन को एक आवेदन-विशिष्ट उपयोगकर्ता प्रकार के लिए मैपिंग को फ़िल्टर करने वाले दृश्य को देकर केवल सरलता से अनभिज्ञ हो सकता है ।


3

अनुभव से मेरी सिफारिश लालित्य या 'सर्वोत्तम अभ्यास' पर स्थिरता का चयन करना है। यह मौजूदा डिजाइन से मेल खाता है और एक साधारण mailing_id, user_idक्षेत्र संरचना के साथ तीन मेलिंग टेबल (प्रत्येक भूमिका के लिए एक) के साथ जाना है ।

यह अशुभ है, लेकिन इसके कुछ फायदे हैं ...

  1. मौजूदा संरचना से मेल खाना किसी और के लिए आसान होगा जो चारागाह लगाने से पहले इस स्कीमा पर काम करेगा।
  2. आपके पास कोई बर्बाद खेत नहीं हैं और आप db को उन चीजों से मेल खाने के लिए नहीं कह रहे हैं जो मौजूद नहीं होंगी।
  3. क्योंकि प्रत्येक तालिका केवल एक दूसरे के लिए होगी और यह एक दृष्टिकोण बनाने में अपेक्षाकृत आसान होगा जो आपके रूटीन के सभी डेटा को उपयोग करने के लिए बाँधता है।

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


उस दृष्टिकोण के साथ समस्या यह है कि डेटाबेस तब आईडी मेल करने में विशिष्टता को लागू नहीं कर सकता है, जो पहली जगह में मैपिंग का प्राथमिक उद्देश्य है: अन्यथा, प्रत्येक उपयोगकर्ता की व्यक्तिगत आईडी फ़ील्ड को "उपयोगकर्ता प्रकार" सूचक के साथ जोड़ा जा सकता है। बिना किसी बदलाव के।
मिथुन राशि

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

"उपयोगकर्ता प्रकार" फ़ील्ड उस विशेष रिकॉर्ड के साथ संबद्ध करने के लिए कौन सी तालिका निर्धारित करेगी। इसे आवेदन के स्तर पर किसी भी तरह से संभालना होगा, और चूंकि वे अलग-अलग तालिकाओं में हैं, इसलिए इसे एक विदेशी कुंजी बनाने का कोई अच्छा तरीका नहीं है। मूल डेवलपर्स इस समस्या पर बिल्कुल भी विचार नहीं करते हैं, दुर्भाग्य से, यही वजह है कि यह इस तरह की गड़बड़ में बदल रहा है। :)
जैमिनीडोमिनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.