वास्तव में आपके द्वारा वर्णित डिज़ाइन (सामान्य तालिका प्लस उपप्रकार-विशिष्ट तालिकाएं) को क्लास टेबल इनहेरिटेंस .
कंक्रीट टेबल इनहेरिटेंस उप-प्रकार तालिकाओं में सभी सामान्य विशेषताओं को डुप्लिकेट किया जाएगा, और आपके पास कोई सुपरटेप तालिका नहीं होगी जैसा कि आप अभी करते हैं।
मैं ईएवी के सख्त खिलाफ हूं। मैं इसे एक एसक्यूएल एंटीपैटर्न मानता हूं। यह एक सुरुचिपूर्ण समाधान की तरह लग सकता है क्योंकि इसके लिए कम तालिकाओं की आवश्यकता होती है, लेकिन आप बाद में बहुत अधिक सिरदर्द के लिए खुद को स्थापित कर रहे हैं। आपने कुछ कमियों की पहचान की है, लेकिन कई अन्य हैं। IMHO, EAV का उचित उपयोग केवल तभी किया जाता है जब आपको बिल्कुल नहीं करना चाहिए जब आप एक नया उपप्रकार पेश करते हैं, या यदि आपके पास असीमित संख्या में उपप्रकार हैं (उदाहरण के लिए उपयोगकर्ता नई विशेषताओं को तदर्थ परिभाषित कर सकते हैं) तो एक नई तालिका बनाएं।
आपके पास कई उपप्रकार हैं, लेकिन फिर भी उनमें से एक सीमित संख्या है, इसलिए यदि मैं यह प्रोजेक्ट कर रहा होता तो मैं क्लास टेबल इनहेरिटेंस के साथ रहता। . आपके पास प्रत्येक उपप्रकार की कुछ पंक्तियाँ हो सकती हैं, लेकिन कम से कम आपको कुछ आश्वासन है कि प्रत्येक उपप्रकार की सभी पंक्तियों में समान स्तंभ हैं, आप NOT NULL
का उपयोग कर सकते हैं यदि आपको आवश्यकता हो, तो आप SQL डेटा प्रकारों का उपयोग कर सकते हैं, आप संदर्भात्मक अखंडता बाधाओं का उपयोग कर सकते हैं, आदि। एक संबंधपरक दृष्टिकोण से, यह EAV से बेहतर डिज़ाइन है।
एक और विकल्प जिसका आपने उल्लेख नहीं किया वह है सीरियलाइज्ड LOB . अर्थात्, कस्टम विशेषताओं के अर्ध-संरचित संग्रह के लिए एक BLOB कॉलम जोड़ें। एक्सएमएल, वाईएएमएल, जेएसओएन, या अपना खुद का DSL स्टोर करें उस कॉलम में। आप एसक्यूएल के साथ उस बीएलओबी से अलग-अलग विशेषताओं को आसानी से पार्स नहीं कर पाएंगे, आपको पूरे बीएलओबी को अपने आवेदन में वापस लाना होगा और कोड में अलग-अलग विशेषताओं को निकालना होगा। तो कुछ मायनों में यह कम सुविधाजनक है। लेकिन अगर यह आपके डेटा के उपयोग को संतुष्ट करता है, तो इसमें कुछ भी गलत नहीं है।