2009-09-19 14 views
5

मेरे पास 4 उप-वर्ग हैं: Video, Image, Note, और Form। प्रत्येक में विभिन्न प्रकार के डेटा होते हैं। उदाहरण के लिए, Image कक्षा में डिस्क और छवि गुणों पर छवि फ़ाइल का पथ होता है, और Form कक्षा में फ़ील्ड फ़ील्ड मान होते हैं। प्रत्येक आइटम के बीच आम तत्व, हालांकि, जीपीएस निर्देशांक और शीर्षक है, इसलिए मैं निम्नलिखित सार आधार वर्ग है:डेटाबेस में एक सार आधार वर्ग और उप-वर्ग मॉडल

public abstract class Content 
{ 
    public float? Latitude { get; set; } 
    public float? Longitude { get; set; } 
    public float? Heading { get; set; } 
} 

हालांकि, जहां मैं धुंधला मिलता है कि कैसे एक डेटाबेस में इस मॉडल के लिए चल रहा है। वर्तमान में मेरे पास Events नामक एक सारणी है (उदाहरण के लिए, मान लीजिए कि एक घटना जन्मदिन की पार्टी है) और 4 टेबल (Videos, Images, Notes, और Forms)। प्रत्येक तालिका में एक विदेशी कुंजी Events 'प्राथमिक कुंजी पर वापस लिंक होती है।

LINQ-to-SQL का उपयोग करके, मुझे प्रत्येक तालिका के लिए 5 कक्षाएं मिलती हैं। यह ठीक है अगर मुझे केवल एक प्रकार का डेटा चाहिए, उदाहरण के लिए Event.Images, लेकिन मैं जो करना चाहता हूं वह है 'सामग्री' की कुल संख्या Event है और जीपीएस निर्देशांक प्राप्त करें। मैं केवल Event.Images.Count() + Event.Videos.Count() + ... का उपयोग करके गिनती को काफी आसान कर सकता हूं, लेकिन मैं जीपीएस निर्देशांक के लिए ऐसा नहीं कर सकता। क्या कोई तरीका है कि मैं डेटाबेस को मॉडल कर सकता हूं ताकि मैं प्रत्येक आइटम के लिए बेस क्लास का उपयोग कर सकूं और फिर भी मुझे अपना डेटा देखने की आवश्यकता होने पर व्यक्ति को दृढ़ता से टाइप किए गए आइटम को प्राप्त करने में सक्षम हो?

उत्तर

8

इस के लिए तीन अलग-अलग पैटर्न उद्यम अनुप्रयोग आर्किटेक्चर, विभिन्न व्यापार गत साथ प्रत्येक के मार्टिन फाउलर की पैटर्न में दर्ज कर रहे हैं:

+0

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

+0

हां, निश्चित व्यापार-बंद हैं। यह सिर्फ नए प्रकार जोड़ने की संभावना पर निर्भर करता है। यदि असंभव है, तो एकाधिक तालिकाओं को पार करने से बचने और एकल तालिका का उपयोग करना बेहतर हो सकता है। यदि संभवतः, अन्य पैटर्न में से एक। और, हां, वे लिंक बहुत अस्पष्ट हैं क्योंकि वे चाहते हैं कि आप पुस्तक खरीद लें :-) यह एक अच्छी किताब है - मुझे लगता है कि लायक है। – SingleShot

1

कि ऐसा करने का एक तरीका है।

प्रति उप-वर्ग
  • तालिका: बजाय डेटाबेस में baseclass साझा करने की कोशिश की, बस हर एक के लिए अलग टेबल बना

    सामान्य शब्दों में, दो अन्य तरीके हैं।

  • प्रति पदानुक्रम तालिका: सभी क्षेत्रों के एक सुपरसेट को एक टेबल में रखें, साथ ही साथ "भेदभावकर्ता" कॉलम रखें, और उन्हें एक ही स्थान पर स्टोर करें।

पता लगाने के लिए सही है, उपयोग प्रतिमानों के बारे में सोचना: अगर आप आम तौर पर उन्हें स्वतंत्र रूप से इलाज

  • , और क्वेरी स्वतंत्र रूप से, अलग टेबल या तो क्या आप go-- लिए एक अच्छा तरीका है प्रति subclass है या टेबल।
  • अगर इन विषम संग्रह के रूप में इलाज कर रहे हैं, तो आप इस तरह के रूप में उन्हें देखना चाहते हैं, एक एकल तालिका आसान

इसके अलावा क्या आपके उपकरण स्वाभाविक रूप से सबसे समर्थन करता है, को देखने के हो सकता है। वे सभी काम करते हैं।

+0

प्रतिक्रिया के लिए धन्यवाद। यह पता चला है कि मुझे किसी भी तरह से पूरे डोमेन मॉडल को बदलने की ज़रूरत है, इसलिए मेरी समस्या स्वयं ठीक हो गई है, इसलिए बोलने के लिए। –

-2

असल में, यह सटीक प्रश्न बहुत भयानक पूछा जाता है, और answered many times रहा है। आपने शायद डेटाबेस शब्दावली का उपयोग नहीं किया है।

समस्या ओओ शब्दावली और गैर-वस्तु विषय क्षेत्र में सोच लागू कर रही है; एक साधारण सीधा-आगे कार्य बहुत जटिल और सीमित बनाते हैं।

मार्टिन फाउलर की और स्कॉट Ambler की किताबें नहीं उनमें से बहुत कुछ के लिए एक डॉलर की कीमत, विवरण this answer में, 11 दिसंबर 10 प्रविष्टि पर शुरू कर रहे हैं।

+6

-1, मैंने आपके द्वारा लिंक किए गए लेखों से पहले 200 9 -19-19 को इस प्रश्न से पूछा था। आपका जवाब बिल्कुल जवाब नहीं है, बल्कि उद्योग में मेरे और दो अच्छी तरह से सम्मानित व्यक्तियों के खिलाफ अपमानित अपमान का अपमान है। –

+2

@ डैनियल। यह धागा अन्य (वर्तमान) धागे पर आ रहा है, जिस तरह से मैंने इसे पाया। क्षमा करें, मैंने यह नहीं देखा कि यह 200 9 से था। आपके लिए कोई अपमान नहीं है। फाउलर और अंबालर के पास जवाब देने के लिए बहुत कुछ है। मुझे विशिष्टताओं का उत्तर देने में प्रसन्नता हो रही है, लेकिन सामान्यताओं को जवाब देना संभव नहीं है, फिर भी फाउलर/एम्बलर या आपकी भावना (उदाहरण के लिए "अपमान" क्या है?) – PerformanceDBA

0

इन SO उदाहरणों पर नज़र डालें, यह सहायक हो सकता है।

संबंधित मुद्दे