Comparando Propel, Doctrine y PropelFinder

El gran François Zaninotto ha escrito un artículo imprescindible titulado Comparing Propel, Doctrine and sfPropelFinder en el que compara de forma práctica los ORM Propel y Doctrine y también su plugin sfPropelFinderPlugin.

Propel es el ORM clásico de Symfony. Su principal ventaja es que está completamente integrado con Symfony y que decenas de plugins sólo funcionan para Propel. Su desventaja es que la versión 1.2 que se utiliza actualmente tiene un rendimiento muy mejorable.

Doctrine es el ORM del futuro de Symfony. Su principal ventaja es el rendimiento en ejecución y la forma tan concisa en la que se pueden escribir consultas muy complejas. Su principal problema es que todavía no dispone del mismo nivel de integración que Propel.

sfPropelFinder es un plugin que mejora las posibilidades de Propel haciendo que su sintaxis sea mucho más concisa.

En su artículo, François compara la sintaxis de los diferentes ORM haciendo las mismas consultas complejas con todos ellos. A continuación se muestran dos ejemplos de consultas complejas.

1) Obtener un artículo de la base de datos a partir de su título:

Con Propel:

$c = new Criteria();
$c->add(ArticuloPeer::TITLE, 'Título del artículo');
$articulo = ArticuloPeer::doSelectOne($c);

Con Doctrine:

$articulo = Doctrine::getTable('Articulo')->
  findOneByTitle('Título del artículo');

Con sfPropelFinderPlugin:

$articulo = sfPropelFinder::from('Articulo')->
  findOneByTitle('Título del artículo');

2) Obtener los últimos 5 comentarios de un artículo:

Con Propel:

$c = new Criteria();
$c->addDescendingOrderByColumn(ComentarioPeer::PUBLISHED_AT);
$c->setLimit(5);
$comentarios = $articulo->getComentarios($c);

Con Doctrine:

$comentarios = Doctrine_Query::create()->
  from('Comentario c')->
  where('c.articulo_id = ?', array($articulo->getId()))->
  orderby('c.published_at DESC')->
  limit(5)->
  execute();

Con sfPropelFinderPlugin:

$comentarios = sfPropelFinder::from('Comentario')->
  relatedTo($articulo)->
  orderBy('PublishedAt', 'desc')->
  find(5);

El artículo original contiene multitud de consultas complejas para que puedas comparar la sintaxis de los tres ORM.

Por último, aunque no muestra los datos exactos, François también indica el rendimiento relativo de cada ORM en forma de lista ordenada:

  1. Propel 1.3 (el que tiene mejor rendimiento)
  2. sfPropelFinder con Propel 1.3
  3. Doctrine 0.11
  4. Propel 1.2
  5. sfPropelFinder con Propel 1.2 (el que tiene peor rendimiento)

Fuente: Comparing Propel, Doctrine and sfPropelFinder

Comentarios

  1. Interesante artículo, aunque más que comparar ORM se compara la sencillez de trabajar de cada uno.

    El tema del rendimiendo no se dan demasiados datos, y temas como las relaciones complejas, seleccionar sólo los campos que quieras, hidratar en array en vez de en objetos seguramente no se cuentan y serían interesantes para una buena comparación.

    pablodip el 9 de julio de 2008, 20:25:28

  2. Pablo, a mí también me ha parecido que en la parte de comparación del rendimiento de los ORM en tiempo de ejecución faltan datos numéricos y pruebas que lo demuestren. Además, me ha sorprendido mucho que Propel 1.3 gane a Doctrine en ambos casos.

    Javier Eguiluz el 9 de julio de 2008, 21:48:47

  3. Cierto, alguien que no sepa cómo funciona cada uno podría pensar que Propel es más sencillo usándolo con sfPropelFinder y más rápido, osea que podría incluso llevarse la impresión de que es mejor.

    Comparando los ORM sin symfony para mi Doctrine le gana por goleada a Propel, ya que Propel se quedaría sin comandos, sin behaviors, sin migraciones, sin schema en yaml, sin i18n... osea cosas imprescindibles para un desarrollo rápido, e incluso para un desarrollo sin más. Y comparándolos con symfony Doctrine aún así ganaría en mejor sistema para plugins, sistema de eventos (similar al de symfony 1.1), DQL, mejor sistema para trabajar con relaciones entre tablas, mejor sistema de configuración... y por contra que Propel tiene más plugins, aunque he de decir que a mi me parece más simple hacer plugins de Doctrine que de Propel.

    Además la filosofía que usa para su desarrollo es similar a la de symfony, para mi de las mejores, usar ideas buenas aunque no sean tuyas.

    En fín, que por algo se va a incluir en symfony 1.2, y esperemos que poco a poco se vaya haciendo más popular.

    pablodip el 9 de julio de 2008, 23:17:07

  4. Me parece importante lo que menciona pablodip sobre la evolucion de symfony, personalmente siempre pense que propel seria el futuro, y me convencí cuando use propel 1.3, definitivamente es mucho mas rapido que doctrine, por usar PDO. Ahora para aclarar, cuando Francois hace la comparacion en el rendimiento desde su punto de vista, él asume que Propel 1.3 + sfPropelFinder van a ser mas rapidos o eficientes que doctrine, pero la verdad solo es una ilusion por que como el mismo me respondio, todavia no esta desarrollado el plugin para propel 1.3 y solo se piensa hacer el port cuando se tenga una version estable del mismo.

    Neonard0 el 10 de julio de 2008, 5:37:47

  5. He trabajado con symfony y propel desde antes de la version 1.0, en aquel momento mi antiguo jefe hizo modificaciones a las clases que manejaba symfony respecto al mapeo de clases con propel...y la clase controladora....el trabajo funcionó hasta la versión 1.2. Hoy en día también contamos con Doctrine quien a futuro sera el ORM definitivo....Alguno de uds trabaja y/o trabajo con esquemas Múltiples en una conexión a Base de Datos?? todo muy lindo mientras que uses el esquema 'public' por defecto pero en caso particular es mas bien pertinente y buena practica agrupar las tablas por esquemas y / o usos específicos. Una de las soluciones era modificar el .conf de postgres que es el manejador que utilizamos en el trabajo pero a la larga tendremos una lista de dimensiones considerables si tomamos en cuenta que los esquemas pueden crecer....Necesito ayuda. Estoy trabajando en esto. Cuando halle algo si uds antes no, lo pondre a disposición. Saludos a Todos

    Jullyeta el 9 de marzo de 2009, 17:21:44

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

9 de julio de 2008

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.