5

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

मेरे पास Project मॉडल है जो has_many :donations है।

मैं एक परियोजना के लिए अद्वितीय दाताओं की संख्या गिनना चाहता हूं।

तालिका में num_donors नामक तालिका है, और जब कोई नया दाता एक अच्छा विचार बनाया जाता है तो इसे बढ़ाता है?

या @num_donors = Donor.count(:select => 'DISTINCT user_id') ऐसा कुछ है जो दक्षता के मामले में समान है या डेटाबेस अनुकूलन के लिए धन्यवाद? क्या मुझे user_id और किसी अन्य फ़ील्ड के लिए इंडेक्स बनाने की आवश्यकता होगी, जिसे मैं गिनना चाहता हूं?

क्या वही उत्तर दान की गई कुल राशि को एकत्रित करने के लिए है?

उत्तर

10

शीर्षक प्रश्न का उत्तर देने के लिए। हां यह अनावश्यक है, लेकिन आपको यह करना चाहिए कि यह आपकी स्थिति पर निर्भर करता है।

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

ज्यादातर स्थितियों में, आपको इसका सहारा लेना नहीं चाहिए और नहीं करना चाहिए।

आप परिकलित मान संग्रहीत करना आवश्यक है, निम्न कार्य करें:

  • यह incrementing द्वारा तारीख को अप-टू यह न रखें। हर बार जब आप इसे अपडेट करते हैं तो सभी डेटा से गिनती/कुल का पुनर्मूल्यांकन करें।
  • यदि आपके पास बहुत सारे अपडेट नहीं हैं, तो कोड को अपडेट ट्रिगर में पर सेट करें/गिनती को अद्यतित रखें।
  • डेटाबेस में अनावश्यकता के साथ समस्या यह है कि जब असहमत हैं, तो आप अनिश्चित हैं कि आधिकारिक है। दस्तावेज को एक नोट में जोड़ें कि स्रोत डेटा पर आधिकारिक स्रोत है यदि वे असहमत हैं और ओवरराइट किए जा सकते हैं।
7

हालांकि यह आपके डेटाबेस के आकार पर निर्भर करता है, ये ऐसे प्रकार के संचालन हैं जिनके डेटाबेस में विशेषज्ञ हैं, इसलिए उन्हें तेज़ होना चाहिए। यह शायद समयपूर्व अनुकूलन का मामला है - आपको कुल योग को संग्रहित करना शुरू नहीं करना चाहिए, इस प्रकार इसे आसान बनाना - और यदि आवश्यक हो तो बाद में अनुकूलित करें।

4

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

ActiveRecord ने has_many संबंधों पर स्वचालित रूप से गणना करने के लिए कार्यक्षमता में कुछ बनाया है। यह Railscast on counter caches देखें।

5

अधिकतम याद रखें "एक घड़ी वाला एक आदमी हमेशा समय जानता है। दो घड़ियों वाले एक आदमी को कभी यकीन नहीं है।" मैं केवल व्युत्पन्न संख्या को संग्रहीत करता हूं यदि:

प्रदर्शन समस्याएं आपको आवश्यकतानुसार व्युत्पन्न संख्या प्राप्त करने से रोकती हैं (जो इस मामले में कोई समस्या नहीं होनी चाहिए क्योंकि उत्तर इंडेक्स से उपलब्ध होने की संभावना है)

या

आप विश्वास है कि आप प्रोग्रामर त्रुटि या जानबूझकर या आकस्मिक उपयोगकर्ता क्रिया के माध्यम से मुख्य तालिका के रिकॉर्ड खो रहे हैं कारण है। उस मामले में, यदि आप वर्तमान में गणना की संख्या ऑडिट करने के लिए अपने व्युत्पन्न नंबर का उपयोग कर सकते हैं

+0

मैक्सिम से प्यार करें - पहले इसे नहीं सुना है। इसे ध्यान में रखेगा :) – nfm

3

क्या आप जानते हैं कि एक सरल ध्वज ActiveRecord जादू करता है?

class ThingOwner 

# it has a column like 
# t.integer things_count, :default => 0 

has_many :things, :counter_cache => true 

end 

प्रश्न का सवाल है - हाँ, यकीन है कि यह अनावश्यक है, मैं इस तरह के एक काउंटर अगर और केवल अगर things.count के समय की हिस्सेदारी बहुत बड़ी है जोड़ना होगा।

अन्यथा यह समयपूर्व अनुकूलन है।

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