मुझे पर्ल के डीबीआईएक्स :: क्लास का उपयोग कब करना चाहिए?


17

DBIx :: क्लास किसी भी डेटाबेस के लिए एक लोकप्रिय पर्ल इंटरफ़ेस है जिसे आप DBI के माध्यम से कनेक्ट कर सकते हैं । इसके तकनीकी विवरण के लिए अच्छा प्रलेखन है, लेकिन इसके उचित उपयोग के बारे में जानकारी (उन स्थितियों सहित जहां आप शायद इसे नहीं चाहते हैं)।

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

पिछले कुछ महीनों से मैं लोगों से पूछ रहा हूँ "आप DBIx :: Class का उपयोग क्यों करते हैं?" और केवल एक अच्छा उत्तर मिला है (और वह व्यक्ति भी अनुवर्ती "जब आप इसका उपयोग नहीं करेंगे" का उत्तर देने में सक्षम था)। प्रमुख डेवलपर, पीटर रैबिटसन, FLOSS वीकली पर अपने साक्षात्कार में एक उत्तर के करीब पहुंच गए , लेकिन यह साक्षात्कार के बीच में थोड़ा सा दफन है।

तो, मैं यह कैसे तय कर सकता हूं कि क्या DBIx का उपयोग करना :: किसी परियोजना के लिए वर्ग उपयुक्त है?


3
क्या आप दूसरी किताब लिख रहे हैं? :)
सिमबेक 15

1
मेरे अनुभव में दर्द तब होता है जब डीबीआईसी का उपयोग उन परिस्थितियों में किया जाता है जहां यह ओवरकिल है। और, बहुत शक्तिशाली होने के बावजूद, यह अक्सर ओवरकिल होता है क्योंकि लोग केवल मूल सुविधाओं (SQL पीढ़ी और जुड़ाव) का उपयोग करते हैं और किसी और चीज की आवश्यकता नहीं होती है। इसलिए मैंने DBIx :: Lite लिखा, जो उन बुनियादी सुविधाओं को प्रदान करता है और किसी भी स्कीमा को हार्ड-कोडित करने की आवश्यकता नहीं होती है।
एलेसेंड्रो

जवाबों:


24

इससे पहले कि मैं प्रश्न का उत्तर दूं, मुझे लगता है कि कुछ पृष्ठभूमि क्रम में है।

समस्या का मूल

डेवलपर्स के साक्षात्कार और काम पर रखने के वर्षों के बाद, मैंने दो चीजें सीखी हैं:

  1. डेवलपर्स के विशाल बहुमत को डेटाबेस डिजाइन में बहुत कम अनुभव है।

  2. मैंने उन लोगों के बीच एक ढीला सहसंबंध देखा है जो डेटाबेस को नहीं समझते हैं और जो ओआरएम से नफरत करते हैं।

(नोट: और हाँ, मुझे पता है कि ऐसे लोग हैं जो डेटाबेस को अच्छी तरह समझते हैं जो ORM से नफरत करते हैं)

जब लोगों को समझ में नहीं आता क्यों विदेशी कुंजी कारण है कि आप में निर्माता नाम एम्बेड न करें, महत्वपूर्ण हैं itemतालिका, या क्यों customer.address1, customer.address2है, और customer.address3क्षेत्रों में एक अच्छा विचार लिखने डेटाबेस कीड़े को यह उनके लिए आसान बनाने के लिए एक ORM जोड़ने नहीं हैं, कुछ भी मदद करने के लिए नहीं जा रहा है।

इसके बजाय, ठीक से डिज़ाइन किए गए डेटाबेस और एक ओएलटीपी उपयोग के मामले के साथ, ओआरएम सुनहरे हैं। ग्रंट का अधिकांश काम चला जाता है और डीबीआईएक्स :: क्लास :: स्कीमा :: लोडर जैसे टूल के साथ , मैं एक अच्छे डेटाबेस स्कीमा से काम करने वाले पर्ल कोड तक मिनटों में जा सकता हूं। मैं पेरेटो नियम का हवाला देता हूं और कहता हूं कि मेरी 80% समस्याओं को 20% काम के साथ हल कर दिया गया है, लेकिन वास्तव में, मुझे इससे भी अधिक लाभ मिलता है।

समाधान का दुरुपयोग

एक और कारण है कि कुछ लोग ORM से नफरत करते हैं क्योंकि वे अमूर्त रिसाव होने देंगे। आइए MVC वेब ऐप्स के सामान्य मामले पर विचार करें। यहां कुछ ऐसा है जो हम आमतौर पर देखते हैं (छद्म कोड):

GET '/countries/offices/$company' => sub {
    my ( $app, $company_slug ) = @_;
    my $company = $app->model('Company')->find({ slug => $company_slug }) 
      or $app->redirect('/');
    my $countries = $app->model('Countries')->search(
     {
         'company.company_id' => $company->company_id,
     },
     {
         join     => [ offices => 'company' ],
         order_by => 'me.name',
     },
   );
   $app->stash({
     company   => $company,
     countries => $country,
   });
}

लोग इस तरह नियंत्रक मार्ग लिखते हैं और खुद को पीठ पर थपथपाते हुए सोचते हैं कि यह अच्छा है, साफ कोड है। वे अपने नियंत्रकों में हार्ड-कोडिंग एसक्यूएल पर सहमत होंगे, लेकिन उन्होंने एक अलग एसक्यूएल सिंटैक्स को उजागर करने की तुलना में थोड़ा अधिक किया है। उनके ORM कोड को एक मॉडल में नीचे धकेल दिया जाना चाहिए और फिर वे ऐसा कर सकते हैं:

GET '/countries/offices/$company' => sub {
   my ( $app, $company_slug ) = @_;
   my $result = $app->model('Company')->countries($company_slug)
     or $app->redirect('/');
   $app->stash({ result => $result });
}

तुम्हें पता है कि अब क्या हुआ है? आपने अपने मॉडल को ठीक प्रकार से समझाया है, आपने ORM को उजागर नहीं किया है, और बाद में, जब आप पाते हैं कि आप डेटाबेस के बजाय कैश से उस डेटा को प्राप्त कर सकते हैं, तो आपको अपना नियंत्रक कोड बदलने की आवश्यकता नहीं है (और यह आसान है) इसके लिए परीक्षण लिखना और तर्क का पुन: उपयोग करना)।

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

रिपोर्टिंग और अन्य सीमाएँ

जैसा कि रोब कियोन ने ऊपर स्पष्ट किया है, रिपोर्ट करना ओआरएम में कमजोरी है। यह एक बड़ी समस्या का एक सबसेट है जहाँ जटिल एसक्यूएल या एसक्यूएल जो कई तालिकाओं को फैलाते हैं कभी-कभी ओआरएम के साथ अच्छी तरह से काम नहीं करते हैं। उदाहरण के लिए, कभी-कभी ORM एक सम्मिलित प्रकार को बाध्य करता है जो मैं नहीं चाहता और मैं यह नहीं बता सकता कि इसे कैसे ठीक किया जाए। या हो सकता है कि मैं MySQL में एक सूचकांक संकेत का उपयोग करना चाहता हूं , लेकिन यह आसान नहीं है । या कभी-कभी एसक्यूएल केवल इतना जटिल जटिल होता है कि यह एब्सट्रैक्ट प्रदान करने के बजाय एसक्यूएल लिखना अच्छा होगा।

यह उस कारण का हिस्सा है जिसे मैंने DBIx :: Class :: Report लिखना शुरू किया है । अब तक यह अच्छी तरह से काम करता है और लोगों के अधिकांश मुद्दों को यहां हल करता है (जब तक कि वे केवल पढ़ने के लिए इंटरफ़ेस के साथ ठीक हैं)। और जब यह एक बैसाखी की तरह लगता है, वास्तविकता में, तो जब तक आप अपने अमूर्त को लीक नहीं कर रहे हैं (जैसा कि पिछले भाग में बताया गया है), तो यह और DBIx::Classभी आसान काम करता है।

तो मैं कब DBIx :: क्लास चुनूंगा?

मेरे लिए, मैं इसे ज्यादातर बार चुनूंगा कि मुझे एक डेटाबेस के लिए एक इंटरफ़ेस की आवश्यकता है। मैं वर्षों से इसका उपयोग कर रहा हूं। हालाँकि, मैं इसे OLAP सिस्टम के लिए नहीं चुन सकता, और नए प्रोग्रामर निश्चित रूप से इसके साथ संघर्ष करने जा रहे हैं। इसके अलावा, मुझे अक्सर लगता है कि मुझे मेटा-प्रोग्रामिंग की आवश्यकता है और DBIx::Classउपकरण प्रदान करते समय , वे बहुत खराब दस्तावेज हैं।

DBIx::Classसही ढंग से उपयोग करने की कुंजी अधिकांश ORM के समान है:

  1. अमूर्त रिसाव मत करो।

  2. अपने शापित परीक्षण लिखें।

  3. आवश्यकतानुसार एसक्यूएल को नीचे जाने का तरीका जानें।

  4. डेटाबेस को सामान्य करने का तरीका जानें।

DBIx::Class, एक बार जब आप इसे सीख लेते हैं, तो आप के लिए अपने अधिकांश भारी उठाने का ध्यान रखेंगे और इसे जल्दी से आवेदन लिखने के लिए एक हवा बनाते हैं।


1
हो सकता है कि जब आप इसका उपयोग नहीं करेंगे तो आप दूसरी सूची जोड़ सकते हैं। :)
ब्रायन डी फॉय

1
यह आपके लिए स्पष्ट है, लेकिन संभवत: कई पाठकों के लिए स्पष्ट नहीं है (मैं कहता हूं, वर्षों का समय #dbix-classऔर #catalyst) - "अमूर्त को लीक न करें" बिट की कुंजी यह है कि हर एक चीज जो आप डीबीआईसी में काम कर रहे हैं। किसी चीज़ का उपवर्ग जो कुकी-कटर व्यवहार प्रदान करता है। आपको अपने उपवर्गों में विधियाँ जोड़ने के लिए दृढ़ता से प्रोत्साहित किया जाता है, और जब तक आप एक प्रश्नोत्तर कार्य नहीं कर रहे हैं, केवल आपके द्वारा लिखी गई विधियाँ आपके सार्वजनिक इंटरफ़ेस का हिस्सा होनी चाहिए।
हॉब्स

@hobbs: वास्तव में, यह वह जगह है जहां मैं देख रहा हूं कि लोग इसके साथ सबसे ज्यादा गलत हैं और यह है कि वे कैसे DBIC के साथ फंस जाते हैं। हम अक्सर मान लेते हैं कि लोग जानते हैं कि वे छोटे में क्या कर रहे हैं, लेकिन यह पता लगाएं कि वे बड़े नहीं हैं।
ब्रायन डी फॉय

9

यह जानने के लिए कि किसी चीज़ का उपयोग कब करना है, यह समझना महत्वपूर्ण है कि चीज़ का उद्देश्य क्या है। उत्पाद का लक्ष्य क्या है।

DBIx :: क्लास एक ORM - ऑब्जेक्ट-रिलेशनल मैपर है। एक ORM रिलेशनल / सेट-आधारित रिलेशनल डेटाबेस डेटा संरचनाओं को लेता है और इसे ऑब्जेक्ट ट्री में मैप करता है। पारंपरिक मानचित्रण एक वस्तु प्रति पंक्ति है, एक वर्ग विवरण के रूप में तालिका की संरचना का उपयोग करते हुए। डेटाबेस में पैरेंट-चाइल्ड रिलेशनशिप को ऑब्जेक्ट्स के बीच रिलेशनशिप माना जाता है।

यही इसकी हड्डियां हैं। लेकिन, इससे आपको यह तय करने में मदद नहीं मिलती है कि आपको ORM का उपयोग करना चाहिए। ORM मुख्य रूप से तब उपयोगी होते हैं जब निम्नलिखित सत्य होते हैं:

  • आप एक रिलेशनल डेटाबेस का उपयोग करते हैं।
  • आपका डेटा काफी हद तक OLTP (ऑनलाइन ट्रांजेक्शन प्रोसेसिंग) के लिए उपयोग किया जाता है।
  • आप अपने आवेदन के भीतर रिपोर्ट नहीं लिखते हैं।

एक ORM के पास सबसे बड़ी ताकत है संबंधपरक डेटा संरचना के शीर्ष पर एक ट्री ग्राफ को ओवरलैड चलने के लिए अच्छी SQL का निर्माण करना। SQL अक्सर बालों और जटिल है, लेकिन यह प्रतिबाधा बेमेल के प्रबंधन की कीमत है।

जबकि ORMs पंक्ति-निष्कर्षण SQL लिखने में बहुत अच्छे हैं, वे collating SQL लेखन में बहुत खराब हैं। यह SQL का प्रकार है जिस पर रिपोर्ट बनाई गई हैं। इस तरह के टकराव को विभिन्न उपकरणों का उपयोग करके बनाया गया है, न कि ओआरएम।

कई भाषाओं में कई ओआरएम हैं, कई पर्ल में हैं। अन्य मैपर क्लास हैं :: डीबीआई और रोज़ :: डीबी। DBIx :: कक्षा को अक्सर अपने परिणामों के बल पर दूसरों की तुलना में बेहतर माना जाता है। यह एक अवधारणा है जहां SQL पीढ़ी SQL निष्पादन से अलग होती है।


अद्यतन : ओविड के जवाब में, DBIx :: क्लास (SQL :: Abstract) दोनों को निर्दिष्ट करने की क्षमता प्रदान करता है कि कौन से कॉलम वापस लौटें और साथ ही साथ कौन से इंडेक्स का उपयोग करना है।

सामान्य तौर पर, हालांकि, यदि आप ऐसा करना चाहते हैं, तो आप उस विशिष्ट क्वेरी के लिए ORM का उपयोग नहीं कर रहे हैं। याद रखें - एक ओआरएम का प्राथमिक उद्देश्य एक वर्ग की वस्तुओं के लिए तालिका में पंक्तियों को मैप करना है जिनके गुण तालिका के कॉलम हैं। यदि आप केवल कुछ विशेषताओं को पॉप्युलेट कर रहे हैं, तो उस ऑब्जेक्ट के संभावित उपयोगकर्ताओं को पता नहीं चलेगा कि कौन सी विशेषताएँ पॉपुलेटेड हैं या नहीं। यह भयानक रक्षात्मक प्रोग्रामिंग और / या ओआरएम की एक सामान्य घृणा की ओर जाता है।

लगभग हमेशा, सूचकांक संकेत या सीमा का उपयोग करने की इच्छा जो कॉलम लौटाए जाते हैं या तो गति और / या एक समग्र क्वेरी के लिए एक अनुकूलन है।

  • एग्रीगेटिंग क्वेश्चन उपयोग के मामले हैं ORMs के लिए डिज़ाइन नहीं किए गए हैं। हालांकि DBIx :: क्लास एग्रीगेटिंग क्वेरीज़ बना सकता है, आप ऑब्जेक्ट ग्राफ़ नहीं बना रहे हैं, इसलिए सीधे DBI का उपयोग करें।
  • प्रदर्शन अनुकूलन का उपयोग किया जाता है क्योंकि आपके द्वारा एक्सेस किए जाने के बावजूद, डेटा अंतर्निहित डेटा के लिए बहुत बड़ा है। अधिकांश संबंधपरक डेटाबेस SSDs से चलने वाली 1-3MM पंक्तियों वाली तालिकाओं के लिए आदर्श होते हैं, जहां अधिकांश डेटा + सूचकांकों को RAM में फिट किया जाता है। यदि आपकी स्थिति इससे बड़ी है, तो हर संबंधपरक डेटाबेस में समस्याएँ होंगी।

हां, एक महान डीबीए Oracle या SQL * सर्वर में 100MM + पंक्तियों फ़ंक्शन के साथ तालिकाओं को बना सकता है। यदि आप इसे पढ़ रहे हैं, तो आपके पास कर्मचारियों पर एक महान डीबीए नहीं है।

यह सभी ने कहा, एक अच्छा ओआरएम ऑब्जेक्ट ग्राफ बनाने से अधिक करता है - यह आपके डेटाबेस की एक आत्मनिरीक्षण परिभाषा भी प्रदान करता है। आप इसका उपयोग तदर्थ प्रश्नों को बनाने में मदद कर सकते हैं और उनका उपभोग कर सकते हैं, जैसा कि आप वस्तु ग्राफ बनाए बिना, DBI के साथ करेंगे।


मुझे लगता है कि लगभग सभी चीजें जो मैं लिखता हूं रिपोर्टें देखता है, शायद यही कारण है कि लोगों को मैन्युअल प्रश्नों को छोड़ना पड़ता है (और यही दर्द है)।
ब्रायन डी फॉय

1
मुझे समझ नहीं आ रहा है कि आपको रिपोर्ट के लिए मैन्युअल प्रश्नों को छोड़ने की आवश्यकता क्यों है। मैंने DBIC का उपयोग करके कुछ बहुत ही जटिल रिपोर्ट बनाई हैं। बेशक, इसमें अक्सर 'प्रीफच' और 'जॉइन' के भारी उपयोग के साथ एक बड़े पैमाने पर अनुकूलित परिणाम बनाना शामिल होता है।
डेव क्रॉस

डेव: मैनुअल एसक्यूएल लिखना बहुत आसान हो सकता है और यह सुनिश्चित करने के लिए कि आप केवल तीन फ़ील्ड्स से सात फ़ील्ड्स खींच रहे हैं और उन्हें एक पंक्ति में प्रस्तुत कर रहे हैं। इसके अलावा, कच्चे SQL लिखते समय संकेत प्रदान करने के लिए बहुत आसान है।
कर्टिस पोए

> यह सुनिश्चित करने के लिए कि आप केवल उन सात क्षेत्रों को खींच रहे हैं, जिनकी आपको आवश्यकता है हां, यह वही है जो ResultSet खोजों के लिए "कॉलम" attr के लिए उपयोग किया जाता है। कच्चे SQL करने के लिए मैंने केवल मान्य तर्क सुने या देखे हैं: 1. बेहद जटिल उप-प्रश्न, जो आमतौर पर एक बुरी तरह से डिज़ाइन की गई तालिका / DB का उत्पाद है। DDL या अन्य 'डू' ऑपरेशंस चलाना, जो DBIC isn है 'टी वास्तव में के लिए बनाया गया है। 3. सूचकांक के संकेत में हैक करने की कोशिश करना। फिर, यह RDBMS की कमजोरी से अधिक है, लेकिन कभी-कभी इसे करने की आवश्यकता होती है। और यह संभव है कि डीबीआईसी में केवल उस प्रकार की कार्यक्षमता को जोड़ा जाए।
ब्रेंडन बायर्ड

8

इंटरचेंज 6 ई-कॉमर्स प्लेटफॉर्म (और प्राथमिक स्कीमा चेनसा) के मुख्य डेवलपर्स में से एक के रूप में मेरे पास डीबीआईसी के साथ काफी गहन अनुभव है। यहाँ कुछ चीजें हैं जो इसे इतना अच्छा मंच बनाती हैं:

  • क्वेरी जनरेटर आपको कई डेटाबेस इंजनों (और प्रत्येक के कई संस्करणों) के लिए एक बार लिखने की अनुमति देता है। वर्तमान में हम MySQL, PostgreSQL और SQLite के साथ इंटरचेंज 6 का समर्थन करते हैं और समय और संसाधन मिलते ही अधिक इंजन के लिए समर्थन जोड़ देंगे। पूरी परियोजना में वर्तमान में केवल दो कोड पथ हैं, जिनके पास इंजनों के बीच अंतर को पूरा करने के लिए अतिरिक्त कोड है और यह विशुद्ध रूप से या तो एक विशिष्ट डेटाबेस फ़ंक्शन की कमी (SQLite स्थानों में कमी है) या MySQL के मूढ़ता के कारण है: जिस तरह से इसका LEAST फ़ंक्शन दो छोटे संस्करणों के बीच NULL को संभालता है।

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

  • कम्पोज़ेबल क्वेरी जेनरेशन प्रश्नों को छोटे-छोटे समझने योग्य पूर्वनिर्धारित प्रश्नों में विभाजित करने की अनुमति देता है और फिर जटिल प्रश्नों को बनाने के लिए एक साथ जंजीर बनाया जाता है, जो एक कदम में निर्माण किए जाने पर या तो DBIC (शुद्ध SQL में भी बदतर) में दीर्घकालिक बनाए रखना मुश्किल होगा।

  • स्कीमा :: लोडर ने हमें जीवन के नए पट्टे और भविष्य के लिए बहुत सरल मार्ग देने वाली विरासत अनुप्रयोगों के साथ डीबीआईसी का उपयोग करने की अनुमति दी है।

  • DBIC प्लगइन्स, परिनियोजनहैंडलर और माइग्रेशन सभी उपकरण के सेट में बहुत जोड़ते हैं जो मेरे जीवन को सरल बनाते हैं।

DBIC और अधिकांश अन्य ORM / ORM जैसे प्लेटफार्मों के बीच एक बड़ा अंतर यह है कि यद्यपि यह आपको अपने काम करने के तरीके में मार्गदर्शन करने की कोशिश करता है, लेकिन यह आपकी पसंद के किसी भी पागल सामान को करने से नहीं रोकता है:

  • आप SQL फ़ंक्शन और संग्रहीत कार्यविधियों का उपयोग कर सकते हैं जो DBIC को क्वेरी में एक कुंजी के रूप में फ़ंक्शन नाम की आपूर्ति करके ही नहीं जानता है (कुछ मजेदार भी हो सकता है जब आप MySQL में LEAST का उपयोग करने की कोशिश करते हैं ^ लेकिन यह DBIC की गलती नहीं है) ।

  • शाब्दिक SQL का उपयोग तब किया जा सकता है जब कुछ करने के लिए कोई 'DBIC तरीका' न हो और लौटाया गया परिणाम अभी भी एक्सेसर्स के साथ अच्छी कक्षाओं में लिपटा हो।

टीएल; डॉ। मैं शायद इसे सिर्फ एक-दो टेबल के साथ एक साधारण अनुप्रयोग के लिए इस्तेमाल करने की जहमत नहीं उठाऊंगा, लेकिन जब मुझे कुछ अधिक जटिल प्रबंधन करने की आवश्यकता होती है, विशेष रूप से जहां क्रॉस-इंजन संगतता और दीर्घकालिक स्थिरता महत्वपूर्ण है, तो DBIC है आम तौर पर मेरा पसंदीदा रास्ता।


7

(इससे पहले कि मैं शुरू करूं, मुझे बस डीबीआईसी, डीबीआई और मोजो-आधारित डीबीआई रैपर की तुलना करनी चाहिए। मेरे पास किसी भी अन्य पर्ल ओआरएम के साथ अनुभव नहीं है और इसलिए सीधे उन पर टिप्पणी नहीं करेंगे)।

DBIC कई चीजों को बहुत अच्छी तरह से करता है। मैं इसका भारी उपयोगकर्ता नहीं हूं, लेकिन मैं सिद्धांत जानता हूं। यह SQL जनरेशन का काफी अच्छा काम करता है और विशेष रूप से (जैसा कि मुझे बताया गया है) जॉइनिंग आदि को हैंडल करता है। यह अन्य संबंधित डेटा को भी अच्छी तरह से प्रीफेक्ट कर सकता है।

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

निश्चित स्कीमा तैनाती कठिन हो सकती है, लेकिन यह हमेशा कठिन होती है। DBIC में उपकरण (कुछ बाहरी मॉड्यूल में) होते हैं जो इसे आसान बनाते हैं, और हाथ से अपने स्वयं के स्कीमा को प्रबंधित करने की तुलना में शायद आसान होते हैं।

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

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

TL, DR, DBIC का उपयोग करते हैं जब तक कि आप SQL से प्यार नहीं करते हैं या आपको async की आवश्यकता होती है, जिस स्थिति में Mojo फ्लेवर्ड DBI रैपर की जांच करते हैं।


6

मैंने तीन साल पहले डीबीआईसी बनाम डीबीआई में इस पर अपने विचार लिखे थे। संक्षेप में, मैंने दो मुख्य कारण सूचीबद्ध किए हैं:

  1. DBIC का मतलब है कि मुझे उन सभी तुच्छ एसक्यूएल के बारे में सोचने की ज़रूरत नहीं है जो मुझे लिखने वाले किसी भी एप्लिकेशन के लिए आवश्यक हैं।
  2. DBIC मुझे डंब डेटा संरचनाओं के बजाय डेटाबेस से ऑब्जेक्ट वापस देता है। इसका मतलब है कि मेरे पास खेलने के लिए सभी मानक OO अच्छाई है। विशेष रूप से मुझे लगता है कि यह मेरे DBIC ऑब्जेक्ट्स में विधियों को जोड़ने में सक्षम होने के लिए वास्तव में उपयोगी है।

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


2
हुह, मैं टाइपोस को ठीक नहीं कर सकता क्योंकि मैं पर्याप्त वर्ण ("आरटी टीटूल") नहीं बदलता। उत्सुकता से लंगड़ा। लेकिन यह उस तरह का जवाब है जो मुझे पहेली बना रहा है। मुझे लगता है कि आपके PerlHacks पोस्ट में, आप एक बात को संबोधित करते हैं जो Rob इंगित करता है, लेकिन दूसरे पर विचार न करें। कई मामलों में, मैंने पाया है कि लोग मैन्युअल SQL पर वापस जा रहे हैं।
ब्रायन डी फॉय

1

जिस तरह से मैं इसे पैमाने बनाता हूं:

  1. DBI सॉकेट कंस्ट्रक्टर और परीक्षण विधियों को प्रदान करने वाला एक वर्ग बनाएं।

  2. उस वर्ग को अपनी SQL क्वेरी कक्षाओं (प्रति वर्ग तालिका में एक वर्ग) में प्राप्त करें और निर्माण के समय सॉकेट के लिए परीक्षण करें।

  3. अपनी तालिका नाम और प्राथमिक इंडेक्स कॉलम नामों को रखने के लिए वर्ग स्कूप किए गए चर का उपयोग करें।

  4. अपने सभी SQL इंटरपोलिंग टेबल नाम और प्राथमिक इंडेक्स कॉलम को उन वेरिएबल्स से लिखें, बजाय कि उन्हें एसक्यूएल में परिभाषित करने के।

  5. केवल sql स्टेटमेंट में टाइप करते हुए आपको मूल DBI मेथड जोड़े (तैयार करना और निष्पादित करना) की अनुमति देने के लिए एडिटर मैक्रोज़ का उपयोग करें।

यदि आप ऐसा कर सकते हैं, तो आप पूरे दिन डीबी के शीर्ष पर स्वच्छ एपीआई कोड को सापेक्ष आसानी से लिख सकते हैं।

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

मैंने अपेक्षाकृत अच्छे प्रदर्शन के साथ सैकड़ों डीबीआई विधियों के पैमाने पर इस दृष्टिकोण का उपयोग किया है। मैं DBI कोड को किसी अन्य तरीके से प्रयास और बनाए रखना नहीं चाहता।

कब उपयोग करें DBI: हमेशा

मुझे नहीं लगता कि यह आपका असली सवाल था। आपका असली सवाल था: "यह एक विशाल पीआईटीए जैसा दिखता है, कृपया मुझे बताएं कि मुझे ऐसा करने की ज़रूरत नहीं है?"

तुम नहीं। इसे सही तरीके से बिछाएं और डीबीआई का हिस्सा बेमानी हो जाता है जो इसे ज्यादातर स्वचालित करने में सक्षम होता है।


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

0

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

मैं DBI से शुरुआत करना चाहता हूं क्योंकि मुझे लगता है, "ओह, यह एक सरल परियोजना है, मुझे ORM के ब्लोट की आवश्यकता नहीं है और मैं सेटअप और स्कीमा मॉड्यूल के साथ परेशानी नहीं करना चाहता।" लेकिन बहुत जल्दी - लगभग हर बार - मैं जल्दी से उस फैसले के लिए खुद को अभिशाप देना शुरू कर देता हूं। जब मैं अपने एसक्यूएल प्रश्नों (डायनेमिक क्वेश्चन, न केवल तुलना प्लेसहोल्डर्स) में रचनात्मक होना शुरू करना चाहता हूं, तो मैं डीबीआई का उपयोग करके विवेक बनाए रखने के लिए संघर्ष करता हूं। SQL :: Abstract बहुत मदद करता है, और आमतौर पर यह मेरे लिए पर्याप्त है। लेकिन मेरा अगला मानसिक संघर्ष मेरे कोड के अंदर बहुत अधिक एसक्यूएल बनाए हुए है। मेरे लिए यह बहुत ही विचलित करने वाली बात है कि बदसूरत heredocs के अंदर एम्बेडेड SQL की लाइनें और रेखाएं हैं। शायद मुझे एक गुणवत्ता आईडीई का उपयोग करने की आवश्यकता है।

अंत में, नहीं की तुलना में अधिक बार, मैं सीधे DBI के साथ रहना। लेकिन मैं चाहता हूं कि वहां एक बेहतर तरीका हो। DBIx :: क्लास में कुछ बहुत ही साफ-सुथरी विशेषताएं हैं और मैंने इसे कुछ बार इस्तेमाल किया है, लेकिन यह सभी के लिए सिर्फ इतना ओवरकिल लगता है लेकिन सबसे बड़ा प्रोजेक्ट है। मुझे यह भी निश्चित नहीं है कि मुझे कौन सा अधिक बोझिल लगता है: DBI बिखरे हुए स्कीमा मॉड्यूल के साथ SQL या DBIC।

(ओह, बाधाओं और ट्रिगर जैसी चीजें डीबीआईसी के लिए मेरे लिए बहुत बड़ा प्लस है।)


4
यह उत्तर बहुत अच्छी तरह से नहीं आता है - निश्चित रूप से, जब आप डीबीआईएक्स का उपयोग करते हैं, तो आपको समस्याएं होती हैं, लेकिन आपको वे समस्याएं क्यों हैं? क्या डीबीआई लचीला नहीं है, बहुत कसकर डीबी से जुड़ा हुआ है, स्केलेबल नहीं है या क्या है?
जे एलस्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.