Когда следует использовать доктрину ORM и когда zend-db-table?

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


person Ben    schedule 24.05.2010    source источник


Ответы (4)


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

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

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

person Bill Karwin    schedule 24.05.2010
comment
Никакая структура ORM не может автоматически создавать базу данных. Извините, у меня сейчас нет этой ссылки, но я видел тесты Doctrine 2 с PHP 5.3, которые показывают, что в некоторых случаях он работает быстрее, чем собственный PDO. Я знаю, что бенчмарки — это зло, но неужели это невозможно? - person takeshin; 25.05.2010
comment
@takeshin: Doctrine 2 использует управление транзакциями и кэширование для повышения производительности в определенных сценариях. Это не ускоряет выполнение запросов. - person Bill Karwin; 25.05.2010
comment
@takeshin: я думаю, вы говорите о слайдах 47-55 этого слайд-шоу: slideshare.net/jwage/doctrine-2-not-the-same-old-php-orm. ИМХО - это дешевый трюк, возможно, единственный способ сделать так, чтобы Doctrine могла быть быстрее, чем чистый SQL. Однако ни один знающий SQL человек никогда не напишет такой сырой код SQL. можно просто сделать несколько вставок и сделать это в одном запросе. - person ThatGuy; 21.07.2011
comment
@nix: Да, стоит избегать режима автоматической фиксации, когда вам нужно выполнять повторяющиеся или сложные операции, и Doctrine хорошо отмечает, что наивные разработчики могут упустить это из виду. Но проще ли научиться использовать сложную ORM или как использовать транзакции? - person Bill Karwin; 21.07.2011
comment
@Bill Да, конечно, запрос - это запрос, и он не будет работать быстрее. Но некоторые могут лучше или хуже справляться с набором запросов. Doctrine обеспечивает оптимальный способ работы с этими распространенными сценариями, что дает общее преимущество в производительности. Скорость — это не только скорость одного запроса. - person takeshin; 22.07.2011

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

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

person PatrikAkerstrand    schedule 24.05.2010
comment
Важно учитывать оптимизацию запросов, если доктрина делает это автоматически, а zend-db не делает это автоматически. Спасибо - person Ben; 25.05.2010

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

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

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

person shampoo    schedule 23.08.2012

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

}
person albanx    schedule 27.04.2017