2010-05-24 20 views

Respuesta

27

Cualquier marco ORM le ofrece beneficios para la productividad de desarrollo, no para la eficiencia del tiempo de ejecución. Doctrine no es diferente de Zend_Db_Table en este sentido.

Si elige entre Doctrine y Zend_Db_Table, elija según las características que hacen que sea más fácil o más rápido escribir el código.

Ninguna estructura ORM puede hacer consultas de base de datos automáticamente más rápidas en el caso general. Si necesita consultas de bases de datos de alto rendimiento, debe aprender a codificar las consultas SQL y diseñar su esquema e índices para respaldar el rendimiento dadas las consultas que necesita ejecutar.

+1

"Ningún marco ORM puede hacer automáticamente la base de datos". Perdón por no tener este enlace aquí ahora, pero he visto los puntos de referencia de Doctrine 2 con PHP 5.3 que muestran que en algunos casos se ejecuta más rápido que el PDO nativo. Sé que los puntos de referencia son malos, pero, ¿no es realmente posible? – takeshin

+0

muchas gracias. – Yosef

+8

@takeshin: Doctrine 2 usa la administración de transacciones y el almacenamiento en caché para mejorar el rendimiento en ciertos escenarios. Esto no hace que las * consultas * se ejecuten más rápido. –

8

Use lo que le resulte más cómodo y lo hará más eficiente. Usted y sus compañeros desarrolladores son probablemente el recurso más costoso, y probablemente sea más barato comprar hardware adicional, si es necesario, que tener que preocuparse por posibles consideraciones de rendimiento futuro.

Por supuesto, todavía tendrá que realizar optimizaciones básicas de bases de datos, como la creación de índices razonables, etc. Pero creo que esas "optimizaciones" son obvias.

+0

Optimización de las consultas consideración importante si la doctrina lo hace automático y zend-db no lo hace automático. Gracias – Yosef

2

si tiene muchas consultas SQL, y falta de conocimiento (sin saber nada sobre almacenamiento en caché o optimización de consultas, etc.) y falta de tiempo Zend_DB es más rápido y fácil de entender y es lo suficientemente bueno para USTED - el que está en falta de conocimiento y tiempo y quiere ser lo más rápido posible.

pero si quieres una doctrina ORM asesina gana. pero requiere más tiempo y energía para ser utilizado de manera eficiente.

y si quieres ser un asesino de DB, vamos a salir del tema. es diferente. y no se basa necesariamente en las herramientas que usa. (Algunos DB probablemente utilicen PDO y sus propios modelos, ¿quién sabe?)

0

Doctrine lo ayuda a definir una mejor lógica de negocio y ORM, pero es un asesino de rendimiento absoluto en términos de memoria y CPU. Zend table gateway es 5 veces más rápido que Doctrine. Y puede extender la puerta de enlace de la tabla Zend para eliminar algún analizador de tipo de datos y eso le dará una mejora de 5x más conservando aún el beneficio de un ORM simple. Aquí está mi clase 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; 
    } 

} 
Cuestiones relacionadas