Когда следует использовать учение ORM, а когда zend-db-table? - PullRequest
26 голосов
/ 24 мая 2010

С точки зрения масштаба проекта, скорость и производительность doctrine vs zend-db-table, когда мне следует использовать doctrine внутри проекта Zend и когда zend-db-table?

Ответы [ 4 ]

27 голосов
/ 25 мая 2010

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

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

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

8 голосов
/ 24 мая 2010

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

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

2 голосов
/ 23 августа 2012

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

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

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

0 голосов
/ 27 апреля 2017

Doctrine помогает вам определить лучшую бизнес-логику и ORM, но это абсолютный фактор снижения производительности с точки зрения памяти и процессора.Zend Table Gateway в 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;
    }

}
...