En términos de escala de proyecto, doctrina vs zend-db-table velocidad y rendimiento, ¿cuándo debería usar la doctrina dentro del proyecto Zend, y cuándo zend-db-table?¿Cuándo debería usar doctrine ORM y cuándo zend-db-table?
Respuesta
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.
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.
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
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?)
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;
}
}
- 1. ¿Cuándo debería usar Silverlight y cuándo XNA?
- 2. ¿Cuándo debería usar TCP_NODELAY y cuándo TCP_CORK?
- 3. ¿Cuándo debería usar require() y cuándo usar define()?
- 4. ¿Cuándo debería usar _aligned_malloc()?
- 5. ¿Cuándo debería usar CompiledQuery?
- 6. ¿Cuándo debería usar GC.SuppressFinalize()?
- 7. ¿Cuándo debería usar ConcurrentSkipListMap?
- 8. Cuándo debería usar SynchronousQueue
- 9. ¿Cuándo debería usar semáforos?
- 10. En SQL Server, ¿cuándo debería usar GO y cuándo debería usar punto y coma?
- 11. ¿Cuándo debería usar async/await y cuándo no?
- 12. ¿Cuándo y por qué debería usar TStringBuilder?
- 13. ¿Cuándo debería usar IEnumerable y GetEnumerator?
- 14. ¿Cuándo debería usar remove_reference y add_reference?
- 15. C# ¿Cuándo debería usar List y cuándo debería usar el arraylist?
- 16. ¿Cuándo debería usar Import-Package y cuándo debería usar Require-Bundle?
- 17. ¿Cuándo debería usar stdClass y cuándo debería usar una matriz en php oo?
- 18. ¿Cuándo debería usar std_logic_vector y cuándo debería usar otros tipos de datos?
- 19. En Objective-C, ¿cuándo debería usar métodos de clase y cuándo debería usar métodos de instancia?
- 20. ¿Cuándo debería usar html5 sessionStorage?
- 21. C#: ¿Cuándo debería usar TryParse?
- 22. Cuándo usar Pepino y cuándo usar RSpec?
- 23. ¿Cuándo debería usar "use" y cuándo "require" y cuándo "AUTOLOAD" en perl [buena práctica de programación]?
- 24. ¿Cuándo debería usar git add?
- 25. ¿Cuándo debería usar marcos HTML?
- 26. ¿Cuándo debería usar los parámetros?
- 27. ¿Cuándo debería usar # en ColdFusion?
- 28. ¿Cuándo debería usar un analizador?
- 29. ¿Cuándo usar == y cuándo usarlo?
- 30. Cuándo usar categorías y cuándo usar subclases?
"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
muchas gracias. – Yosef
@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. –