कोड में इसे करने के बजाय RDBMS को काम करना कैसे बेहतर है?


12

ठीक है, मैं इसका मुकाबला करूंगा: मैं डेटाबेस में एक बेहतर कोडर हूं, और मैं सोच रहा हूं कि "सर्वोत्तम प्रथाओं" पर विचार SQL क्वेरी बनाम "सरल" गणनाओं के विषय में कैसे हो सकता है? कोड, जैसे कि यह MySQL उदाहरण (मैंने इसे नहीं लिखा था, मुझे बस इसे बनाए रखना है!) - यह उपयोगकर्ता नाम और अंतिम घटना के रूप में आयु देता है।

SELECT u.username as user, 
       IF ((DAY(max(e.date)) - DAY(u.DOB)) < 0 ,   
       TRUNCATE(((((YEAR(max(e.date))*12)+MONTH(max(e.date)))
       -((YEAR(u.DOB)*12)+MONTH(u.DOB)))-1)/12, 0),  
       TRUNCATE((((YEAR(max(e.date))*12)+MONTH(max(e.date))) -            
       ((YEAR(u.DOB)*12)+MONTH(u.DOB)))/12, 0)) AS age   
FROM users as u
JOIN events as e ON u.id = e.uid
...

कोड में "भारी" उठाने की तुलना में:

प्रश्न:

SELECT u.username, u.DOB as dob, e.event_date as edate
FROM users as u
JOIN events as e ON u.id = e.uid

कोड:

function ageAsOfDate($birth, $aod)
{    //expects dates in mysql Y-m-d format...
     list($by,$bm,$bd) = explode('-',$birth);
     list($ay,$am,$ad) = explode('-',$aod);

     //Insert Calculations here 
     ...
     return $Dy; //Difference in years
}

echo "Hey! ". $row['user'] ." was ". ageAsOfDate($row['dob'], $row['edate']) . " when we last saw him."; 

मैं इस तरह के एक साधारण मामले में बहुत यकीन है कि यह बहुत अंतर नहीं होगा (डरावनी भावना के अलावा जब मुझे पहले वाले प्रश्नों की तरह बदलाव करना होगा), लेकिन मुझे लगता है कि इससे मुझे स्पष्ट होता है कि मैं क्या हूं ' मैं देख रहा हूँ

धन्यवाद!


1
यह एक अच्छा सवाल है - मैं एक ही मुद्दे पर आया हूं।
माइकल के

यहाँ कब क्या करें इसका एक अच्छा उदाहरण है: Calendar.sql (हाँ, यह मेरी राक्षसी है, हाँ, यह एक बुरा विचार था, और नहीं, यह धीमा नहीं है।)
ग्रेफेड

ये ख़ुशबूदार देवता ... मैं शर्त लगाता हूं कि एमडी 5 उस चीज़ के लिए "CthulhuFhtagn" है
GeminiDomino

जवाबों:


13

आप प्रदर्शन कारणों से डेटाबेस में सभी सेट-आधारित संचालन करना चाहते हैं। अतः एकत्रीकरण कार्य, छँटाई कार्य, जोड़ आदि।

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


मैं सहमत हूँ। कोड जो प्रदर्शन उद्देश्यों के लिए मानों के साथ निर्धारित होता है, वह आपके ऐप कोड में होना चाहिए।
तहरीशके

4

प्रत्येक मामला अलग है

क्या तर्क ...

  • अन्य ग्राहकों द्वारा की जरूरत है? DRY: डेटाबेस में
  • आगे की प्रक्रिया के लिए उपयोग किया जाता है? उदाहरण के लिए, अवरोही क्रम से आयु: डेटाबेस में
  • क्षेत्रीय सेटिंग्स की आवश्यकता है? dd / mm / yyyy या mm / dd / yyyy: क्लाइंट में
  • अक्सर इस्तेमाल किया जाता है? बार-बार इसकी गणना क्यों करें: डेटाबेस में कंप्यूटेड और परसेंटेड कॉलम का उपयोग करें

में इस मामले में, मैं डेटाबेस में एक गणना की और मौजूदा कॉलम का उपयोग करके

यह बदतर हो सकता है: आप डेटाबेस में यह कर सकते हैं:

"Hey! ". u.username." was ". <datecalc>. " when we last saw him."

3

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

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


1

आपने एक का उल्लेख किया: विशेषज्ञता का क्षेत्र। हो सकता है कि डेटाबेस की संरचना बहुत अधिक सघन न हो, इसलिए आप टीम के सदस्य के लिए कुछ लॉजिक डेवलपमेंट को ऑफलोड करने का निर्णय लेते हैं जो कि अधिक डेटाबेस केंद्रित है। आदर्श नहीं हो सकता है, लेकिन अगर आप समय के लिए परेशान हैं ...

डेटाबेस हार्डवेयर में अन्य सर्वरों की तुलना में काफी अधिक संसाधन हैं और आप इसे बदल नहीं सकते हैं। यह इस विशिष्ट स्थिति पर लागू नहीं हो सकता है, लेकिन इस पर विचार करने की आवश्यकता हो सकती है।

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


"डेटाबेस हार्डवेयर में अन्य सर्वरों की तुलना में काफी अधिक संसाधन हैं और आप इसे बदल नहीं सकते हैं।" -- एह? वो दो बयान कहां से आए?
पीटर बॉटन

मुझे लगता है कि जेफ स्टैंडअलोन डेटाबेस सर्वर के बारे में बात कर सकता है। मुझे शायद यह निर्दिष्ट करना चाहिए था कि मैं ज्यादातर एलए [एमपी] पी सेटअप पर काम करता हूं।
मिथुनदोमिनो

1
LAMP सेटअप का कोई कारण नहीं है कि स्टैंडअलोन डेटाबेस सर्वर नहीं है, और न ही एक स्टैंडअलोन डेटाबेस सर्वर अधिक संसाधनों की गारंटी है और न ही इसे बदलने में सक्षम है।
पीटर बॉटन

मानव संसाधन विकास मंत्री। तब यकीन नहीं होता।
मिथुन राशि

@Peter Boughton, DB और app एक ही सर्वर में इंटरफ़ेस कनेक्शन और परिमाण अधिक IO भर के लिए कम समय का आदेश है, इन दोनों को एक साथ खोजने के लिए वास्तविक कारण हैं।
19

0

मैं हमेशा DB पर अधिक से अधिक प्रसंस्करण लगाने पर गलत है। उपरोक्त आपके सिंटैक्स को DB कार्यों के साथ भी लिखा जा सकता है जो IMO एक बहुत ही स्वच्छ समाधान होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.