Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/07/2011, 08:38
RatoN7
 
Fecha de Ingreso: marzo-2010
Mensajes: 71
Antigüedad: 14 años, 7 meses
Puntos: 24
Me cayo la ficha. Modelos, Mappers, Zend_Db, Doctrine..

Buenos dias.

Solo quiero comentar algo que entendi hace poco sobre el tratamientos de los datos, saber si lo entendi bien y tambien conocer otras formas de manejarse.

Hace algunos meses venia programando con CodeIgniter. El cual es un framework simple y facil. La forma de crear modelos que utilizaba era solo de crear funciones con consultas a la DB que traian y formateaban los datos para que lo utilice el controlador o la vista. Todo muy bien, en las cosas complicadas utilizaba mucho SQL en un minimo de consultas para optimizar lo mas posible.

Ahora, vengo utilizando Zend Framework. La forma de utilizar los modelos es muy diferente a como lo venia haciendo yo, antes traia y llevaba arrays(u objetos stdClass, que es lo mismo) con datos, mientras que ahora son objetos bien formados que son instancias de su propia clase del modelo.

Como ya venia aprendiendo bastante me anime tambien a usar Doctrine 2. Usaba Doctrine y Zend_Db a medias. Para poder aprender como usarlos, ver diferencias y saber cual es la ventaja/desventaja de cada uno.

Al principio no podia entender porque se me hacia tan complicado hacer un join con Zend_Db_Table, o porque esta clase te selcciona siempre todos los campos de la tabla, incluso tambien no podia entender porque Zend_Db recomienda utilizar el count de php despues de traer todos los datos en vez de hacerlo desde mysql COUNT (Estaba acostumbrado en hacer todo en un minimo de consultas con joins, counts, etc y traer solamente los datos que iba a utilizar)
Con doctrine tambien parecido, para actualizar se debe traer primero el objeto, luego cambiar sus atributos y despues grabarlo en la db(me parecia ilogico hacer dos consultas si sabia que podia hacer solo una).

Hay muchas mas cosas que no entendia, pero no me voy a explayarme en eso. Lo que quiero indicar es que me acostumbre a optimizar lo mas posible mysql haciendo las menos consultas posibles y trayendo los datos necesarios. Siempre que podia en las cosas complicadas tambien venia mysql en ayuda, utilizaba UNION SELECT, (JOINs, de todo tipo), COUNT, CONCAT, etc etc etc.
Pero bueno, despues de trabajar por un tiempo con Doctrine y Zend_Db creo que entendi bien su funcionamiento y quiero explicar lo que entendi. Si hay algo mal, u otras formas de manejarse por favor haganmelo saber, la idea es seguir aprendiendo.

Zend_Db
Segun entendi por el quick start y otros ejemplos, el modelo es la estructura del objeto, con sus atributos, setters y getters. El DbTable, el que hace la conexion con la base de datos. Y el mapper, es el que interactua con los dos anteriores, armando los objetos del modelo al traer los datos del Dbtable, o grabando los objetos en la base de datos.
El formateo de los datos antes de ingresarlos a la db(o para mostrarlos en el view) lo haria cuando se interactua con el objeto en los setters y getters del mismo.
Cosas extras no relacionados con la db pero si con los datos(como un envio de mail despues de grabar), no irian al modelo(antes lo ubicaba ahi). Y para evitar un controller muy extenso se usaria un Service Layer.

Doctrine
Con doctrine esto es muy facil. Al crear bien las entidades y las relaciones se puede manejar todos los objetos de una manera muy simple y facil. Si queres aumentar el rendimiento en algunas cosas se utilizaria DQL. Pero practicamente una vez que esta todo bien armado, es parecido a Zend_Db. Siempre se traen y se graban objetos.

Me fue muy dificil acostumbrarme. La nueva forma de manejarse es siempre con objetos, y no con datos agrupados. Al principio queria hacer todo con DQL(o con Zend_Db_Select) y traer solo arrays con datos(que es la manera con la que venia acostumbrado a hacerlo), pero era un codigo muy desastroso xD.

Me es todavia un poco dificil de aceptar el hecho de hacer varias consultas a la Db y de traer varios datos en vez de los que necesito. Esta claro que hay cierta perdida de rendimiento al utilizar todo en objetos, aunque a decir verdad queda todo mucho mejor estructurado y mas facil de entender. Asi que finalizando a todo esto pregunto y no molesto mas, realmente es mucha la perdida de rendimiento al trabajar todo con objetos?? o es relativamente bajo?.

Estaria bueno tambien que comenten como se manejan ustedes, mas aun los experimentados, que es lo que utilizan, de que forma, etc, asi aprendemos todos

Tambien acepto criticas constructivas

Gracias

Última edición por RatoN7; 20/07/2011 a las 19:46 Razón: Ya solucione una de mis dudas con el manual