С точки зрения масштаба проекта, доктрина против скорости и производительности zend-db-table, когда я должен использовать доктрину внутри проекта Zend и когда zend-db-table?
Любая структура ORM дает вам преимущество для производительности разработки, а не эффективности работы. В этом отношении доктрина ничем не отличается от Zend_Db_Table.
Если вы выбираете между Doctrine и Zend_Db_Table, выберите на основе функций, которые упрощают или быстрее записывают код.
Никакая структура ORM не может автоматически делать запросы базы данных быстрее в общем случае. Если вам нужны высокопроизводительные запросы к базам данных, вы должны научиться кодировать SQL-запросы и разрабатывать свою схему и индексы для поддержки производительности с учетом запросов, которые необходимо выполнить.
Используйте то, что вам больше всего нравится, и сделают вас наиболее эффективными. Вы и ваши коллеги-разработчики, вероятно, самый дорогой ресурс, и, вероятно, дешевле купить дополнительное оборудование, если это необходимо, чем вам приходится беспокоиться о возможных будущих соображениях производительности.
Конечно, вам все равно придется выполнять базовые оптимизации баз данных, такие как создание разумных индексов и т. Д. Но я чувствую, что эти «оптимизации», разумеется.
если у вас много SQL-запросов и нехватка знаний (ничего не зная о кешировании или оптимизации запросов и т. д.), а нехватка времени использует Zend_DB, это быстрее и проще для понимания, и это достаточно хорошо для ВАС – того, кто испытывает недостаток знаний и времени и хочет быть как можно быстрее.
но если вы хотите, чтобы доктрина ORM убийцы победила. но для этого требуется больше времени и энергии.
и если вы хотите быть убийцей DB, мы уйдем с темы. это отличается. и это не обязательно зависит от того, какие инструменты вы используете. (некоторые DB-убийцы, вероятно, используют PDO и свои собственные модели, кто знает?)
Doctrine помогает вам определить лучшую бизнес-логику и ORM, но это абсолютный убийца производительности с точки зрения памяти и процессора. Шлюз таблицы Zend в 5 раз быстрее, чем Doctrine. И вы можете расширить шлюз таблицы 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; } }