Quand devrait-on utiliser doctrine ORM et quand zend-db-table?

En termes d'échelle de projet, doctrine vs Zend-db-Table vitesse et performance, Quand dois-je utiliser doctrine dans Zend project, et quand zend-db-table?

25
demandé sur Charles 2010-05-24 20:45:10

4 réponses

Tout framework ORM vous donne des avantages pour la productivité du Développement, pas pour l'efficacité de l'exécution. La Doctrine N'est pas différente de Zend_Db_Table à cet égard.

Si vous choisissez entre Doctrine et Zend_Db_Table, choisissez en fonction des fonctionnalités qui facilitent ou accélèrent l'écriture du code.

Aucun framework ORM ne peut automatiquement accélérer les requêtes de base de données dans le cas général. Si vous avez besoin de requêtes de base de données hautes performances, vous devriez apprendre à coder des requêtes SQL et à concevoir votre schéma et Index pour prendre en charge les performances compte tenu des requêtes que vous devez exécuter.

27
répondu Bill Karwin 2010-05-24 22:55:25

Utilisez ce avec quoi vous êtes le plus à l'aise et vous rendra le plus efficace. Vous et vos collègues développeurs êtes probablement la ressource la plus chère, et il est probablement moins cher d'acheter du matériel supplémentaire, si nécessaire, que de vous soucier des éventuelles considérations de performances futures.

Bien sûr, vous devrez toujours effectuer des optimisations de base de données telles que la création d'index sensibles, etc. Mais je pense que ces "optimisations" vont sans dire.

8
répondu PatrikAkerstrand 2010-05-24 17:02:46

Si vous avez beaucoup de requêtes SQL et un manque de connaissances (ne sachant rien sur la mise en cache ou l'optimisation des requêtes, etc.) et le manque de temps utiliser Zend_DB il est plus rapide et plus facile à comprendre et il est assez bon pour vous - celui qui est en manque de connaissances et de temps et veulent être aussi vite que possible.

Mais si vous voulez une doctrine ORM tueur gagne. mais il faut plus de temps et d'énergie pour être utilisé efficacement.

Et si vous voulez être un tueur de DB, nous allons hors sujet. il est différent. et il n'est pas nécessairement basé sur les outils que vous utilisez. (certains tueurs DB utilisent probablement PDO lui-même et leurs propres modèles, qui sait?)

2
répondu shampoo 2012-08-23 08:01:18

Doctrine vous aide à définir une meilleure logique métier et ORM, mais c'est un tueur de performance absolu en termes de mémoire et de CPU. Zend table gateway est 5 fois plus rapide que Doctrine. Et vous pouvez étendre Zend table gateway pour supprimer un analyseur de type de données et cela vous donnera une amélioration de 5 fois plus en préservant toujours l'avantage de L'ORM simple. Voici ma classe 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;
    }

}
0
répondu albanx 2017-04-27 09:45:32