Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Sobre Doctrine ORM y DBAL en Symfony

15 de septiembre de 2014

Buenas,

Actualmente me encuentro trabajando en un nuevo proyecto en Symfony 2, en el cuál hemos empezado a utilizar el ORM de Doctrine para generar el esquema de la base de datos mediante la definición de las entidades en código. La cuestión es, que preferimos no utilizar el ORM para la realización de las consultas a la base de datos, ya que en nuestra aplicación predominan fundamentalmente las lecturas sobre las escrituras.

Mi duda fundamental consiste en dónde ubicar las consultas a la base de datos realizadas con el DBAL de Doctrine, ya que lo que me parece más correcto desde el punto de vista de la organización del código es implementarlas en los repositorios propios de cada entidad como si fuesen consultas realizadas con el ORM y luego trabajar con estos repositorios como si realmente estuviésemos trabajando con el ORM ($this->getDoctrine->getRepository('FooBundle:FooEntity')->findSomeoneBy('example')).

¿Cómo lo veis, os parece correcto o me recomendáis alguna otra forma de trabajar y organizar las consultas? Se agradece cualquier tipo de consejo o sugerencia.

Un saludo


Respuestas

#1

Con respecto a tu pregunta principal, a mí me parece la mejor forma de hacerlo. De hecho, eso mismo lo he visto hecho en varias aplicaciones Symfony y yo mismo uso algo parecido en aplicaciones Silex, donde no tengo ORM y sólo tiro de DBAL.

Por otra parte, ya que dices que agradeces cualquier tipo de consejo o sugerencia, me gustaría añadir un comentario. Si estamos hablando de un servicio web que ya existe y por tanto sabéis con certeza el tipo de tráfico que tiene, entonces me parece correcto que optimicéis desde el principio estas consultas.

Sin embargo, si estamos hablando de un proyecto totalmente nuevo, entonces no me parece lo más correcto. Un enorme porcentaje de proyectos tecnológicos nuevos ni siquiera ve la luz y la mayoría de los que lo hacen, acaban fracasando rápido. Por eso quizás no es la mejor idea optimizar al máximo las consultas si finalmente no tenéis el tráfico esperado.

Pensad que las consultas de Doctrine son "gratis", en el sentido de que cuestan poquísimo prepararlas y aprovechar todas sus funcionalidades (a menos que sean consultas SQL complejísimas, donde el ORM es una molestia más que una ayuda). Después, cuando el tráfico crezca, podéis activar la caché de Doctrine. Cuando el tráfico crezca más, tiráis el ORM y pasáis las consultas a DBAL. Y cuando crezca mucho más el tráfico, tiráis la base de datos y os pasáis a Redis.

La idea sería optimizar la aplicación solamente cuando te lo pida el tráfico real medido en la aplicación, no en base a estimaciones que podrían no cumplirse.

@javiereguiluz

15 septiembre 2014, 23:25
#2

Hola Javier,

Una vez más muchas gracias por tu ayuda. Entonces, si te he entendido bien, me recomiendas que siga trabajando del modo en que lo venimos haciendo, metiendo las consultas en el repositorio de la entidad aunque estas estén utilizando DBAL en lugar del ORM.

Respecto de lo que me comentas sobre la optimización de las consultas y el uso del ORM, estoy totalmente de acuerdo contigo, pero en este caso no se trata de un nuevo proyecto sino de la reimplementación y rediseño de un proyecto existente que actualmente cuenta con un alto tráfico y en determinados periodos de picos de tráfico experimentamos problemas de rendimiento, es por ello que sí que necesitamos optimizar al máximo las consultas desde un inicio.

Un saludo

@beni0888

16 septiembre 2014, 8:13