2011-05-12 11 views
8

मुझे किसी प्रकार की रिपोर्टिंग (लॉगिंग) सेवा करने के लिए कहा गया था। कर्मचारी ने कई कंपनियों में स्थानीय रूप से स्थापित वेब एप्लिकेशन (केवल कुछ गतिशील वेबसाइट, PHP में लिखा है) स्थापित किया है। यह वेब ऐप किसी प्रकार का सर्वेक्षण है। सभी डेटा स्थानीय डेटाबेस पर सहेजा जाता है, लेकिन अब आवश्यकता यह है कि प्रत्येक डेटा सबमिट करने के बाद यह डेटा (सर्वेक्षण का परिणाम) केंद्रीय सर्वर पर भी भेजा जाएगा।रेल में एक एआर मॉडल के भीतर एकाधिक डेटाबेस टेबल 3

चार प्रकार के सर्वेक्षण हैं। उन्होंने इसे इस तरह से व्यवस्थित किया है कि कई परियोजनाएं हैं, और प्रत्येक परियोजना में प्रत्येक प्रकार का केवल एक सर्वेक्षण हो सकता है (यहां एसटीआई?) और सर्वेक्षण एक परियोजना से संबंधित है। प्रत्येक सर्वेक्षण को स्थानीय ऐप से एक रिपोर्ट प्राप्त होगी, इसलिए इसमें कई रिपोर्टें होंगी। इस रिपोर्ट को लॉग करने वाले रेल 3 एप को इस तर्क को किसी भी तरह नकल करना चाहिए। पहला सवाल यह है: क्या यह एआर संरचना आपके लिए समझ में आता है?

Project-1--------1-Survey-1-------*-Report 

    Project 
    has_one :survey 
    has_many :reports, :through => :survey 

    Survey 
    belongs_to :project 
    has_many :reports 

    Report 
    belongs_to :survey 

दूसरा प्रश्न एक एआर मॉडल के लिए एकाधिक टेबल रखने के बारे में है। यदि सभी डेटा reports तालिका में संग्रहीत किए जाएंगे, तो तालिका बहुत जल्दी हो जाएगी, और विशिष्ट सर्वेक्षण से संबंधित रिपोर्ट के लिए कुशल पूछताछ कुछ समय बाद समस्या हो सकती है। शायद प्रत्येक सर्वेक्षण के लिए अलग-अलग टेबल रखना बेहतर होगा? reports_<survey_id> की तरह। क्या यह संभव है?

इसके अलावा, मुझे किसी भी तरह से MySQL का उपयोग करने के लिए मजबूर किया गया है, लेकिन यदि कोई दूसरा है, तो इसके लिए बेहतर समाधान है, मैं इसे धक्का देने की कोशिश कर सकता हूं।

आप अभी भी यहाँ हैं, तो आप इस पढ़ने के लिए धन्यवाद :)

उत्तर

4

दूसरा प्रश्न एक एआर मॉडल के लिए एकाधिक तालिकाओं के बारे में है। यदि सभी डेटा रिपोर्ट तालिका में संग्रहीत किए जाएंगे, तो तालिका बहुत जल्दी हो जाएगी, और विशिष्ट सर्वेक्षण से संबंधित रिपोर्ट के लिए कुशल पूछताछ कुछ समय बाद समस्या हो सकती है। शायद प्रत्येक सर्वेक्षण के लिए अलग-अलग टेबल रखना बेहतर होगा? Reports_ की तरह। क्या यह संभव है?

हां, यह संभव है।

आप इसे इस तरह से कर सकते हैं:

class Report < AR::Base 
    table_name_suffix = '' 
end 

Report.table_name_suffix = 'foo' 

अद्यतन


# simple example of sharding model 

class Survey < AR::Base 
    has_many :reports 

    def shard_reports 
    Report.table_name_suffix = "_survey_#{self.id}" 
    returning(reports){ Report.table_name_suffix = "" } 
    end 

end 

Survey.first.reports_shard 
+0

धन्यवाद, आसान लग रहा है। मुझे आशा है कि इससे कोई समस्या नहीं आएगी। – Ernest

+0

समस्याएं होंगी;) क्योंकि, आपको इसे मैन्युअल रूप से नियंत्रित करना चाहिए। और जब आप सर्वेक्षण – Anton

+0

@ एंटन बनाते हैं तो नई रिपोर्ट तालिका बनाएं? यह एक गड़बड़ की तरह लगता है। Http://stackoverflow.com/questions/44145/database-sharding-and-rails – coreyward

5

अपने विदेशी कुंजी (जैसे Reports.survey_id) में से प्रत्येक पर एक सूचकांक रखो और थोड़ा विश्राम। आप अभी प्रदर्शन के बारे में पूरी तरह से चिंता कर रहे हैं। इससे पहले कि आप MySQL से कोई प्रदर्शन समस्या देखेंगे, आपको कम से कम आपकी रिपोर्ट तालिका में लाखों रिकॉर्ड्स की आवश्यकता होगी।

+0

हाँ, शायद मैं बहुत ज्यादा चिंता कर रहा हूँ। एंटोन के जवाब पर मेरी आखिरी टिप्पणी देखें। आपकी युक्तियों के लिए फिर से धन्यवाद। – Ernest

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