2010-05-24 1 views

ответ

27

Любая структура ORM дает вам преимущество для производительности разработки, а не эффективности работы. В этом отношении доктрина ничем не отличается от Zend_Db_Table.

Если вы выбираете между Doctrine и Zend_Db_Table, выберите на основе функций, которые упрощают или быстрее записывают код.

Никакая структура ORM не может автоматически делать запросы к базе данных быстрее в общем случае. Если вам нужны высокопроизводительные запросы к базам данных, вы должны научиться кодировать SQL-запросы и разрабатывать свою схему и индексы для поддержки производительности с учетом запросов, которые необходимо выполнить.

+1

«Никакая структура ORM не может автоматически создавать базу данных». Извините, у меня сейчас нет этой ссылки, но я видел тесты Doctrine 2 с PHP 5.3, которые показывают, что в некоторых случаях он работает быстрее, чем собственный PDO. Я знаю, что тесты являются злыми, но разве это невозможно? – takeshin

+0

большое спасибо. – Yosef

+8

@takeshin: Doctrine 2 использует управление транзакциями и кэширование для повышения производительности для определенных сценариев. Это не ускоряет выполнение * запросов *. –

8

Используйте все, что вам больше всего нравится, и сделают вас наиболее эффективными. Вы и ваши коллеги-разработчики, вероятно, самый дорогой ресурс, и, вероятно, дешевле купить дополнительное оборудование, если это необходимо, чем вам приходится беспокоиться о возможных будущих соображениях производительности.

Конечно, вам все равно нужно будет выполнять базовые оптимизации баз данных, такие как создание разумных индексов и т. Д. Но я чувствую, что эти «оптимизации», разумеется.

+0

Оптимизация важных вопросов, если доктрина делает это автоматически, а zend-db не делает это автоматически. Спасибо – Yosef

2

Если у вас много запросов SQL и отсутствие знаний (ничего не зная о кешировании или оптимизации запросов и т. Д.) И нехватке времени, используйте Zend_DB, это быстрее и проще для понимания, и это достаточно хорошо для ВАС - тот, кто испытывает недостаток знаний и времени и хочет быть как можно быстрее.

, но если вы хотите, чтобы доктрина убийцы ORM побеждала. но для этого требуется больше времени и энергии.

и если вы хотите быть убийцей БД, мы собираемся уйти с темы. это отличается. и это не обязательно зависит от того, какие инструменты вы используете. (некоторые DB-убийцы, вероятно, используют PDO самостоятельно и свои собственные модели, кто знает?)

0

Doctrine помогает вам определить лучшую бизнес-логику и ORM, но это абсолютный убийца производительности с точки зрения памяти и процессора. Почтовый шлюз Zend в 5 раз быстрее, чем Доктрина. И вы можете расширить шлюз таблицы Zend для удаления некоторого синтаксического анализатора данных, и это даст вам улучшение в 5 раз, сохраняя при этом преимущества и простое ORM. Вот мой класс FastTablegateway:

<?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; 
    } 

}