2012-04-08 14 views
10

तो हम सभी जानते हैं कि रेल की एसटीआई (एकल तालिका विरासत) icky है क्योंकि यह एक अव्यवस्थित डेटा मॉडल और उप-डेटाबेस डेटाबेस की ओर जाता है।ActiveRecord में PostgreSQL विरासत?

हालांकि PostgreSQL विरासत को काफी सुंदर तरीके से संभालने लगता है!

दर्दनाक चौड़े तालिकाओं और "प्रकार" कॉलम के बजाय पोस्टग्रेस विरासत का उपयोग करते समय रेलों के अच्छे साफ एसटीआई एपीआई प्राप्त करने का कोई तरीका है?

+1

"तो हम सभी जानते हैं कि रेल 'एसटीआई (एकल तालिका विरासत) icky है क्योंकि यह एक अव्यवस्थित डेटा मॉडल और उप-डेटाबेस डेटाबेस की ओर जाता है।" --- मैं इस आधार को स्वीकार नहीं करता हूं। –

+0

ठीक है शायद यह सामान्यीकरण का थोड़ा सा है .. लेकिन यह केवल एक अच्छा विचार है जब आपके बच्चे के मॉडल में बहुत सारी संपत्तियां नहीं होती हैं जो अन्य बच्चों पर लागू नहीं होती हैं .. अन्यथा आप बड़े पैमाने पर व्यापक टेबल के साथ समाप्त होते हैं शून्य कॉलम रेल परिप्रेक्ष्य से ठीक हो सकता है लेकिन डेटाबेस पर कच्चे एसक्यूएल चलाते समय थोड़ी बदसूरत हो सकती है, शायद पोस्टग्रेएसक्यूएल की विरासत कोई तेज़ नहीं है लेकिन कम से कम यह मुझसे दूर है! : पी –

+0

क्योंकि पोस्टग्रेर्स की विरासत इतनी सहजता से फिट बैठती है, मुझे नहीं लगता कि सिर्फ 'टाइप' कॉलम होना पर्याप्त होगा? जो मैंने विरासत के साथ देखा है, 'SELECT *' सभी संबंधित कॉलम वापस कर देगा (और मुझे लगता है कि सभी असंबद्ध कॉलम भी हैं:/... लेकिन आपकी डीबी संरचना क्लीनर होगी। – stuartc

उत्तर

3

संक्षेप में - अभी आप जो भी करने की कोशिश कर रहे हैं उसके लिए कोई अच्छा साफ एसटीआई एपीआई नहीं है।

मैं वास्तव में एक साल के बारे में पहले कि एक में देखा और एक निष्कर्ष पर पहुंचा है कि यह कई कारणों से एक अच्छा विचार नहीं है:

  1. आप PostgreSQL विशिष्ट सुविधाओं का उपयोग करना चाहते हैं - आप मूल रूप से अपने आप को शादी करने कर रहे हैं उस डीबी के लिए। मुझे गलत मत समझो PostgreSQL एक महान डीबी है और मैंने इसे कई अवसरों पर उपयोग किया है, लेकिन आप उस डीबी और ऐप डिज़ाइन से फंस जाएंगे।
  2. अधिकतर यदि आप डीबी विशिष्ट विशेषताओं का उपयोग करना शुरू करते हैं तो आप या तो उन्हें मैन्युअल रूप से कार्यान्वित कर सकते हैं (डीबी पर कुछ प्रकार के आदेश चला रहे हैं या जीयूआई का उपयोग कर रहे हैं) या किसी भी तरह की स्क्रिप्ट लिख रहे हैं जिसे आप जब भी दौड़ रहे हों तो आपको आमंत्रित करना होगा डीबी: माइग्रेट करें (यदि आप उचित परीक्षण करना चाहते हैं तो आपको इसे करना होगा)। थोड़ी देर बाद यह बोझिल और परेशान हो जाता है।
  3. आप पाते हैं कि आप अधिक से साथ और अधिक नाराज हैं, तो आप को उद्धृत करने के "दुखद विस्तृत टेबल और" प्रकार "कॉलम" तो:
    • आपका तालिका डिजाइन की पुन: कल्पना और
    • आपका मॉडल पुन: किया जा करने की जरूरत है एसटीआई
    • के लिए एक अच्छे उम्मीदवार नहीं हो सकते हैं आपको बस इसके साथ रहना होगा।

अधिकांश आईटी समस्याओं वास्तव में यह करने के लिए नीचे आ: प्रयास बनाम लाभ उठाएं।

आपके मामले में आप अपने आप को इस सवाल पूछना चाहिए:

  • में आप कितना समय कुछ सेकंड के द्वारा एक बेहतर एसटीआई संरचना लागू करने पर खर्च करने के लिए करता है, तो यह केवल आपके कच्चे SQL क्वेरी तेज़ हो जाएगी चाहते हैं ? शायद एक और अधिक स्पष्ट एसक्यूएल क्वेरी लिखना बेहतर है? अधिकांश एप्लिकेशन उस आकार में नहीं बढ़ते हैं जहां यह वास्तव में एक मुद्दा बन जाता है। लेकिन यह आपके मामले में शायद अलग हो सकता है।

पुनश्च:

इसके अलावा

अपने अनुप्रयोग में एसटीआई की संरचना पर एक त्वरित टिप: यदि आप पाते हैं कि आप मॉडल है कि एक ProductCategory, CommentCategory, PhoneCategory, ClientCategory है कि सभी के वारिस की तरह एसटीआई का उपयोग का एक बहुत है, तो Cateogory से - मैं उन्हें मॉडल निर्देशिका के अंदर फ़ोल्डरों में व्यवस्थित करने के लिए जाते हैं। तब application.rb में सिर्फ एक पंक्ति जोड़ें: config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/**}')]

+1

जब आप कभी कोर्स में हों अपने कैरियर स्विच उत्पादन डेटाबेस इंजनों के बारे में?: पी मैं बड़ी लड़के कंपनियों के बारे में बात कर रहा हूं, न कि आपके "स्टार्ट अप" को आपने अपने एचएस दोस्तों के साथ शुरू किया है और आप सीईओ हैं और वह सीटीओ हैं। – Volte

+0

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

+0

@bwicklund - अच्छी तरह से सवाल ActiveRecord (Rails) में PostgreSQL और STI के बारे में था और यदि वहां कोई है नाइस इसे संभालने का साफ तरीका - और जवाब यह था कि सरल मामलों को छोड़कर एसटीआई को संभालने का कोई अच्छा साफ तरीका नहीं था, और मैंने समझाया कि क्यों। सिर्फ इसलिए कि आपको जवाब पसंद नहीं है, इसका मतलब यह गलत नहीं है। यदि आपके पास बेहतर स्पष्टीकरण है तो अपना उत्तर प्रदान करने के लिए स्वतंत्र महसूस करें। – konung

6

हालांकि PostgreSQL काफी खूबसूरती से विरासत को संभालने के लिए लगता है!

वास्तव में?क्या आपने small print in the manual पर नजदीकी नजर डाली? उदाहरण के लिए:

  • अद्वितीय की कमी (और इसलिए भी प्राथमिक कुंजी) नहीं विरासत स्तर पर संभव हो रहे हैं।
  • विरासत तालिकाओं और आधार तालिका के संदर्भ मिश्रण नहीं करते हैं। अर्थात। (मैन्युअल रूप से मैन्युअल से लिया गया): capitalscities फैलाता है। आपकी address तालिका cities को संदर्भित करना चाहता है। यह। लेकिन capital के साथ कोई पता नहीं किया जा सकता है।

ये दो चीजें बहुत छोटी "हैलो वर्ल्ड" परियोजना से परे किसी भी चीज़ में महत्वपूर्ण हैं। तो मैं कल्पना नहीं कर सकता, कि PostgreSQL विरासत का उपयोग कर कुछ भी उत्पादक लागू किया जा सकता है।

+1

असल में जैसा कि मैं समझता हूं कि यह टेबल शेडिंग के लिए काफी उपयोगी है। लेकिन यह सच है कि यह मॉडल-स्पेस विरासत के लिए उपयुक्त नहीं है क्योंकि यह अब खड़ा है। – Divide

+0

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

+0

बेशक यदि आप सरोगेट कुंजी का उपयोग कर रहे हैं तो शेरिंग अक्सर कठिन हो जाती है। Psql दस्तावेज़ों में sharding का एक अच्छा उदाहरण है: http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html – Divide