Zend_Db es una capa de abstracción de base de datos, y está
pensada para proporcionar una API común para las operaciones
SQL. Zend_Db_Table es un
Table Data Gateway, pensado para abstraer las operaciones comunes de base de datos a nivel de
tabla. Debido a su naturaleza abstracta y a la "magia" que realizan internamente para llevar a
cabo sus operaciones, en ocasiones pueden introducir sobrecarga en el rendimiento.
Con el fin de mantener el uso lo más sencillo posible, y también para soportar
esquemas en constante cambio durante el desarrollo,
Zend_Db_Table realiza cierta magia internamente: en el
primer uso, obtiene el esquema de la tabla y lo almacena en miembros del
objeto. Esta operación suele ser costosa, independientemente de la
base de datos, lo que puede contribuir a cuellos de botella en producción.
Afortunadamente, existen técnicas para mejorar la situación.
Zend_Db_Table puede utilizar opcionalmente
Zend_Cache para almacenar en caché los metadatos de la
tabla. Esto suele ser más rápido de acceder y menos costoso que obtener los
metadatos directamente desde la base de datos.
La documentación de Zend_Db_Table
incluye información sobre el almacenamiento en caché de metadatos.
A partir de la versión 1.7.0, Zend_Db_Table también ofrece soporte
para codificar directamente los metadatos en la definición de la tabla. Este
es un caso de uso avanzado, y solo debería usarse cuando sepa que el
esquema de la tabla es poco probable que cambie, o que es capaz de mantener
las definiciones actualizadas.
Zend_Db_Select es relativamente bueno en su tarea. Sin
embargo, si está realizando consultas complejas que requieren joins o
subconsultas, a menudo puede resultar bastante ingenuo.
La única respuesta real es escribir su propio SQL;
Zend_Db no requiere el uso de
Zend_Db_Select, por lo que proporcionar sus propias
sentencias SQL select optimizadas es un enfoque
perfectamente legítimo,
Ejecute EXPLAIN en sus consultas, y pruebe una variedad de
enfoques hasta que pueda aprovechar de forma fiable sus índices de la manera más
eficiente posible, y luego codifique directamente el SQL
como una propiedad o constante de clase.
Si el SQL requiere argumentos variables, proporcione
marcadores de posición en el SQL, y utilice una
combinación de vsprintf() y
array_map() para inyectar los valores en el
SQL:
// $adapter is the DB adapter. In Zend_Db_Table, retrieve
// it using $this->getAdapter().
$sql = vsprintf(
self::SELECT_FOO,
array_map(array($adapter, 'quoteInto'), $values)
);