2010-05-24 12 views
25

प्रोजेक्ट स्केल के संदर्भ में, सिद्धांत बनाम ज़ेंड-डीबी-टेबल की गति और प्रदर्शन, मुझे ज़ेंड प्रोजेक्ट के अंदर सिद्धांत का उपयोग कब करना चाहिए, और जब ज़ेंड-डीबी-टेबल?सिद्धांत ओआरएम का उपयोग कब करना चाहिए और जब ज़ेंड-डीबी-टेबल?

उत्तर

27

कोई भी ओआरएम ढांचा आपको विकास उत्पादकता के लिए लाभ देता है, रनटाइम दक्षता नहीं। इस संबंध में Zend_Db_Table से सिद्धांत अलग नहीं है।

यदि आप Doctrine और Zend_Db_Table के बीच चयन कर रहे हैं, तो उन सुविधाओं के आधार पर चुनें जो कोड लिखने के लिए आसान या तेज़ बनाते हैं।

कोई ओआरएम ढांचा सामान्य मामले में डेटाबेस क्वेरी को स्वचालित रूप से तेज़ी से नहीं बना सकता है। यदि आपको उच्च-प्रदर्शन डेटाबेस क्वेरीज़ की आवश्यकता है, तो आपको SQL क्वेरी को कोड करना सीखना चाहिए, और आपके स्कीमा और इंडेक्स को डिज़ाइन करने के लिए आवश्यक प्रश्नों के प्रदर्शन के समर्थन के लिए डिज़ाइन करना चाहिए।

+1

"कोई ओआरएम ढांचा स्वचालित रूप से डेटाबेस नहीं बना सकता"। क्षमा करें क्योंकि मेरे पास अभी यह लिंक नहीं है, लेकिन मैंने PHP 5.3 के साथ सिद्धांत 2 बेंचमार्क देखा है जो दिखाता है कि कुछ मामलों में यह मूल पीडीओ से तेज़ी से चलता है। मुझे पता है, कि बेंचमार्क बुरा हैं, लेकिन क्या यह वास्तव में संभव नहीं है? – takeshin

+0

आपको बहुत बहुत धन्यवाद। – Yosef

+8

@takeshin: सिद्धांत 2 कुछ परिदृश्यों के प्रदर्शन में सुधार के लिए लेनदेन प्रबंधन और कैशिंग का उपयोग करता है। यह * क्वेरी * तेजी से नहीं चलता है। –

8

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

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

+0

प्रश्नों का अनुकूलन महत्वपूर्ण विचार करता है, तो सिद्धांत यह ऑटो और ज़ेड-DB यह ऑटो नहीं करते हैं: यहाँ मेरी FastTablegateway वर्ग है। धन्यवाद – Yosef

2

यदि आपके पास बहुत से SQL प्रश्न हैं, और ज्ञान की कमी है (कैशिंग या क्वेरी ऑप्टिमाइज़ेशन इत्यादि के बारे में कुछ भी नहीं जानते) और समय के उपयोग की कमी Zend_DB यह समझना तेज़ और आसान है और यह आपके लिए पर्याप्त है - जो ज्ञान और समय की कमी में है और जितना संभव हो सके तेज़ी से बनना चाहता है।

लेकिन यदि आप एक हत्यारा ओआरएम सिद्धांत जीतना चाहते हैं। लेकिन इसे कुशलता से उपयोग करने के लिए अधिक समय और ऊर्जा की आवश्यकता होती है।

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

0

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

<?php 
namespace Application\Libraries; 

use Zend\Db\TableGateway\TableGateway; 
use Zend\Db\Adapter\AdapterInterface; 
use Zend\Db\ResultSet\ResultSetInterface; 
use Zend\Db\Sql\Select; 
use Zend\Db\Sql\Sql; 

class FastTablegateway extends TableGateway{ 

    protected $mysqli_adapter = null; 

    /** 
    * Constructor 
    * 
    * @param string $table 
    * @param AdapterInterface $adapter 
    * @param Feature\AbstractFeature|Feature\FeatureSet|Feature\AbstractFeature[] $features 
    * @param ResultSetInterface $resultSetPrototype 
    * @param Sql $sql 
    * @throws Exception\InvalidArgumentException 
    */ 
    public function __construct($table, AdapterInterface $adapter, $features = null, ResultSetInterface $resultSetPrototype = null, Sql $sql = null, $mysqli = null) 
    { 
     $this->mysqli_adapter = $mysqli; 
     parent::__construct($table, $adapter, $features, $resultSetPrototype, $sql); 
    } 


    protected function executeSelect(Select $select) 
    { 
     $time = time(); 
     $selectState = $select->getRawState(); 
     if ($selectState['table'] != $this->table) { 
      throw new \Exception\RuntimeException('The table name of the provided select object must match that of the table'); 
     } 

     if ($selectState['columns'] == array(Select::SQL_STAR) 
     && $this->columns !== array()) { 
      $select->columns($this->columns); 
     } 

     //apply preSelect features 
     $this->featureSet->apply('preSelect', array($select)); 

     if(!$this->mysqli_adapter){ 
      // prepare and execute 
      $statement = $this->sql->prepareStatementForSqlObject($select); 
      $result = $statement->execute(); 
     }else{ 
      $q = $this->sql->getSqlStringForSqlObject($select); 
      //var_dump($q); 
      $result = $this->mysqli_adapter->query($q); 
      $result = is_object($result) ? $result->fetch_all(MYSQLI_ASSOC) : [] ; 
     } 

     // build result set 
     $resultSet = clone $this->resultSetPrototype; 
     //var_dump(is_object($result) ? $result->num_rows : 'A'); 
     $resultSet->initialize($result); 

     // apply postSelect features 
     //$this->featureSet->apply('postSelect', array($statement, $result, $resultSet)); 

     return $resultSet; 
    } 

}