एक नई आवश्यकता एक पुराने कोडबेस पर सामने आई है, जो मूल रूप से उपयोगकर्ताओं के दो पूर्व-सीधे-सीधे संबंधित वर्गों के बीच प्रत्यक्ष (आंतरिक) संचार को सक्षम करता है (पूरी तरह से अलग-अलग स्कीमा के साथ अलग-अलग तालिकाओं में संग्रहीत और, दुख की बात है, कोड मुश्किल से ओओ-जागरूक है, बहुत कुछ) कम डिज़ाइन किया गया है, इसलिए कोई अभिभावक वर्ग नहीं है)। चूंकि हम इस पुराने सेटअप पर एक बैग टांगने के लिए बाहर हैं, जिसने कभी इस कार्यक्षमता पर विचार नहीं किया, इसलिए कोई गारंटी नहीं है कि कोई पीके टकराव नहीं हैं - उपयोग में डाटासेट को देखते हुए, यह व्यावहारिक रूप से गारंटी है कि वहाँ हैं।
तो, समाधान स्पष्ट प्रतीत होता है: इसे आग से मारें और पूरी गंदगी को फिर से लिखें एक मानचित्रण तालिका। मैंने मानचित्र को लागू करने के संभावित तरीकों के लिए दो दिशाएं प्राप्त की हैं, लेकिन मैं एक डीबीए नहीं हूं, इसलिए यदि कोई भी पेशेवरों और विपक्ष को याद किया गया है तो मैं अनिश्चित हूं।
अमूर्तता को स्पष्ट करने के लिए, अलग-अलग उपयोगकर्ता डेटा के तीन समूहों पर विचार करें: प्रोफेसरों, प्रशासन, छात्रों (नहीं, यह एक होमवर्क असाइनमेंट नहीं है। वादा करें!)
मानचित्रण 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 मैपिंग की ओर झुक रहा हूं, क्योंकि नकारात्मक पहलू मामूली है।
लेकिन मैं अपनी खुद की सीमाओं के बारे में अच्छी तरह से जानता हूं, और मुझे यकीन है कि मैंने शायद दोनों दिशाओं में फायदे या ठोकरें खाई हैं, इसलिए मैं दिमाग की तुलना में समझदार हूं।