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