2012-11-07 15 views
7

तो कई कारणों से पॉलिमॉर्फिक एसोसिएशन को खराब डेटाबेस डिज़ाइन माना जाता है, उदा। आपके पास पॉलिमॉर्फिक आईडी कॉलम पर विदेशी कुंजी नहीं हो सकती है, इसलिए संदर्भित अखंडता समाप्त हो गई है।पॉलिमॉर्फिक एसोसिएशन के बजाय क्या उपयोग करें?

और, एसटीआई को भी खराब माना जाता है जब तक उप-प्रकार केवल व्यवहार पर भिन्न होते हैं।

तो मेरे सवाल का रेल/ActiveRecord के लिए है क्या इस परिदृश्य में कम बुराई है:

मैं अपने उपयोगकर्ताओं संस्थाओं के कई प्रकार के एक हाथ से आदेश दिया संग्रह बनाने के लिए अनुमति देने के लिए की जरूरत है।

बहुरूपी संघों स्कीमा का उपयोग करते हुए कुछ इस तरह दिखेगा:

-- collections 
id, name, ... 

-- exhibits 
id, collection_id, exhibitable_type, exhibitable_id, position 

-- photographs 
id, ... 

-- films 
id, ... 

-- paintings 
id, ... 

-- songs 
id, ... 

-- sculptures 
id, ... 

मैं एसटीआई इस्तेमाल कर सकते हैं और कुछ इस तरह है:

-- collections 
id, name, ... 

-- exhibits 
id, collection_id, artwork_id, position 

-- artworks 
id, type, <photograph columns>, <film columns>, <painting columns>, etc. 

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

एसटीआई ऐसा प्रतीत होता है कि कम से कम क्वेरी और कोड के लिए यह आसान होगा।

तो कम बुराई कौन सा है?

-- collections 
id, name, ... 

-- exhibits 
id, collection_id, artwork_id, position 

-- artworks 
id 

-- photographs 
artwork_id, <photograph columns> 

-- films 
artwork_id, <film columns> 

इस एसटीआई के शून्य समस्या से छुटकारा पाने के हैं और यह भी तालिका नीचे आकार रखें:

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

सत्य मुझे लगता है मैं मल्टी-टेबल विरासत समाधान सबसे अच्छा

मैं स्थिति स्तंभ की जरूरत नहीं किया, तो मैं बस collections_photographs की तरह अलग में शामिल होने के टेबल का प्रयोग करेंगे, collections_paintings, collections_films, आदि लेकिन मुझे पसंद है लगता है कहा जा मैन्युअल ऑर्डरिंग की आवश्यकता है।

तो, ऐसा लगता है विकल्प हैं:

  • PA: nulls के बहुत सारे के साथ बड़ी मेज: रेफेरेंन्शिअल सत्यनिष्ठा की हानि (यह व्यवहार में फर्क पड़ता है अगर हमेशा डेटाबेस का उपयोग के लिए ActiveRecord का उपयोग कर?)
  • एसटीआई
  • CTI/एमटीआई: एक मणि पर निर्भर है कि व्यापक रूप से

कम बुराई है कौन सा नहीं किया जाता है और कोई अन्य विकल्प क्या हैं? मैं पोस्टग्रेस का उपयोग कर रहा हूँ।

उत्तर

1

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

0

यदि आप पोस्टग्रेस में partitioned table का उपयोग करते हैं, तो आप दोनों पॉलिमॉर्फिसिज्म और विदेशी कुंजी को कार्यान्वित कर सकते हैं, क्योंकि अलग-अलग विभाजनों का प्रतिनिधित्व करने वाली सारणी प्रत्येक अलग-अलग उप-प्रकार का प्रतिनिधित्व कर सकती हैं और प्रत्येक के पास बाधाओं का एक अलग सेट हो सकता है।

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

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