Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Busco comentarios sobre un ¿nuevo? concepto

Estas en el tema de Busco comentarios sobre un ¿nuevo? concepto en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, Creo que este es el lugar apropiado para publicar esto, porque aunque tiene que ver con bases de datos, tiene aún más que ver ...
  #1 (permalink)  
Antiguo 08/01/2008, 18:38
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Pregunta Busco comentarios sobre un ¿nuevo? concepto

Hola,

Creo que este es el lugar apropiado para publicar esto, porque aunque tiene que ver con bases de datos, tiene aún más que ver con OO.
Quizás algunos recuerden que hace un tiempo pedí comentarios sobre una librería de acceso a BD que había creado (la llamé PHP5DBObject). Aunque en el momento no lo sabía con certeza, esta librería no es más que una implementación de un ActiveRecord o como otros le dicen: un ORM (Object-Relational Mapping).

La idea era hacer bastante transparente el acceso a BD para la carga de data en forma de objetos.
Pues bueno, he estado investigando más al respecto y me he encontrado con algunas cosas interesantes como los manejadores de base de datos orientados a objetos que por lo general están muy integrados con el lenguaje de programación y que se encargan de la persistencia de la información de los objetos.

Ahora bien, estos manejadores de BD han tenido una adopción bastante baja y creo que es principalmente porque funcionan bajo un paradigma bastante diferente al de las bases de datos relacionales. Algunas diferencias son:
1.- en las relacionales se trata con tablas, en las OO se trata con clases.
2.- en las relacionales, las relaciones entre datos se llevan con claves foráneas, etc, se utilizan tablas intermedias para las N a N, etc. En las OO, todo se hace por apuntadores.
3.- en las relacionales existe SQL para obtener la info que se desea y la BD se puede encargar de hacer parte de lógica con los SP, en las OO, sólo se encargan de la persistencia de los datos.

y otras más.

En fin, estoy queriendo evolucionar mi librería a algo más que un ORM (Object-Relational Mapping), me gustaría que fuera una capa de abstracción completa que permita la interacción con la base de datos como si esta fuera una base de datos orientada a objetos... pero a diferencia de las implementaciones típicas (casi todas en Java, no he conseguido ninguna en PHP... y tiene sentido por no ser un lenguaje fuertemente-tipeado... anglisismo de strongly-typed), quiero además que exista un SQL, para que sea un punto intermedio... por esto estoy comenzando con diseñar un lenguaje de query que permita la interacción con los datos (la verdadera transformación a BD no es muy relevante ahora)... y esto lo he apodado SOQL (Standard Object Query Language... ya que no hay ningún estándar... igual este sirve).

Por esto me gustaría mostrarles lo que llevo de SOQL y que me digan si les parece bien, comentarios, dudas, etc para ir aclarando ideas:

CREATE [ABSTRACT] CLASS class_name (
<property_definition> [, <property_definition>] ...
) [EXTENDS class_name] [IMPLEMENTS interface_name] [, IMPLEMENTS <interface_name>] ...;

CREATE INTERFACE interface_name (
<property_definition> [, <property_definition>] ...
) [EXTENDS interface_name];

DROP CLASS class_name;

DROP INTERFACE interface_name;

ALTER CLASS class_name <alter_definition> [, <alter_definition>] ...

CREATE INDEX ON class_name <index_definition>

DROP INDEX index_name

INSTANTIATE class_name [(property_name [, property_name] ...)] VALUES (value [, value] ...)

DELETE FROM class_name WHERE <where_condition>

UPDATE class_name SET property_name=value [, property_name=value] ... [ WHERE <where_condition>]

CAST FROM class_name WHERE <where_condition> TO class_name [WITH (property_name=value [, property_name=value] ...)]

SELECT [NON HIERARCHYCAL] [class_name|interface_name] WHERE <where_condition> [ORDER BY property_name [ASC|DESC] [, property_name [ASC|DESC]]... ] [LIMIT offset,numcols]

SHOW CLASSES

SHOW INTERFACES

SHOW INDEXES

Where:
property_definition:
<property_name> <property_type>[(<max_size>)] [NOT NULL]

property_type:
<simple_property> | <complex_property> | <vector_property>

simple_property:
boolean
| byte
| int
| long
| float
| double
| char(max_length)
| datetime
| binary(max_length)

complex_property:
<class_name>
| <interface_name>

vector_property:
vector(<simple_property> [, max_cardinality])
| vector(class_name [, max_cardinality])
| vector(interface_name [, max_cardinality])
| vector(<complex_property> [, max_cardinality])

index_definition:
<index_name> [NON HIERARCHYCAL] (property_name [, property_name] ...)

alter_definition:
ADD PROPERTY <property_name> <property_definition>
| DROP PROPERTY <property_name>
| MODIFY PROPERTY <property_name> <property_definition>
| ADD KEY <index_definition>
| DROP KEY <index_name>
| EXTENDS <class_name>
| ADD INTERFACE <interface_name>
| DROP INTERFACE <interface_name>

Qué les parece?
Se entiende lo que quiero hacer?

Saludos
  #2 (permalink)  
Antiguo 08/01/2008, 19:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Busco comentarios sobre un ¿nuevo? concepto

Si sabes ingles, encontraras este documento muy interesante: Object Database.

Saludos.
  #3 (permalink)  
Antiguo 08/01/2008, 19:29
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Busco comentarios sobre un ¿nuevo? concepto

Hola GatorV,

Sí... he estado ahí, lamentablemente la entrada sobre OQL (Object Query Language) es bastante escueta... de hecho no muestra un solo ejemplo de OQL. Además, lamentablemente, el ODMG (Object Database Management Group) ya no existe, aunque parece que el OMG (Object Management Group) tiene en sus planes retomar la idea.
En fin, está todo un poco en el aire... si conoces de algún ejemplo específico de OQL o un enlace, sería de ayuda ver qué hicieron.

Saludos,
  #4 (permalink)  
Antiguo 08/01/2008, 19:35
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Busco comentarios sobre un ¿nuevo? concepto

Corrijo el post anterior...
Aquí se pueden encontrar enlaces de ejemplos de OQL:
http://www-cse.ucsd.edu/classes/wi00/cse132a/oql.htm y
http://infolab.stanford.edu/~ullman/fcdb/spr99/lec15.pdf (Cuidado, es un PDF)

De verlo un poco, me parece que el lenguaje peca de ser muy SQL-like, pues no siempre retorna objetos... qué clase de OODBMS es ese?

En fin, algún otro comentario idea... me gustaría que fuera bastante OO puro
  #5 (permalink)  
Antiguo 08/01/2008, 19:50
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Re: Busco comentarios sobre un ¿nuevo? concepto

Parece interesante la idea, lo que te sugiero es que te crees dos cosas para potenciar el tema: un blog y un hosting en code.google.com

Seguro que varios seguiremos tus pasos.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #6 (permalink)  
Antiguo 11/01/2008, 02:50
venkman
Invitado
 
Mensajes: n/a
Puntos:
Re: Busco comentarios sobre un ¿nuevo? concepto

No sé si lo conocerás, pero has echado un vistazo a Propel? ( http://propel.phpdb.org/trac/ )
Es un ORM para PHP5 y es usado por algunos frameworks como symfony. Es relativamente maduro y estable.
  #7 (permalink)  
Antiguo 11/01/2008, 15:30
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Busco comentarios sobre un ¿nuevo? concepto

Hola Venkman,

Gracias por el enlace, de hecho ya (aquí en el foro) GatorV me había dirigido hasta Propel y de hecho el proyecto del que hablo al principio (PHP5DBObject) es un ORM como Propel... de hecho lo coloqué aquí para comentarios y me di cuenta de que el parecido era bastante grande... mira en: http://www.forosdelweb.com/f68/podri...breria-541459/

Ahora bien, existe una diferencia conceptual grande entre un ORM y lo que busco conseguir.
Verás, un ORM es, por decirlo de alguna manera, lo mejor que se puede hacer para trabajar en OO con una base de datos relacional. Te das cuenta de esto cuando para obtener un objeto utilizas un ID. Aunque parezca extraño esto que digo (lo es bastante para quienes trabajamos con BD relacionales desde hace mucho), el ID único que utilizamos siempre en el proceso de normalización de las BD, es una característica típica de trabajar en un modelo relacional.

En un modelo puro de Objetos, el concepto de BD no existe como tal, es simplemente una forma de hacer que los objetos sean persistentes... pero la forma de programar sería en cierta manera como si todos los objetos estuvieran en memoria y para uno debería ser transparente si se deben traer de almacenamiento persistente o no. Para ponerlo de otra forma, es como si trabajaras en una aplicación Stand-alone.

Me he explicado bien?
  #8 (permalink)  
Antiguo 14/01/2008, 05:41
venkman
Invitado
 
Mensajes: n/a
Puntos:
Re: Busco comentarios sobre un ¿nuevo? concepto

Hola, pragone

Comenté lo de Propel más que nada por tu comentario de que no habías encontrado ORMs en PHP. Dicho eso, lo otro que buscas, no acabo de tener claro qué objetivo exacto pretendes alcanzar.

Es decir, con tu lenguaje SOQL, ¿qué haces? Cuando tienes un...
CREATE CLASS mueble (nombre char(20), material char(40), precio float);
¿esto en qué se traduce? ¿Se supone que crea una clase en PHP y a la vez crea una tabla en la base de datos que corresponde con la clase? ¿O qué, cómo funciona? ¿Es "sólo" un generador de código o pretendes implementar una base de datos orientada a objetos en PHP?
  #9 (permalink)  
Antiguo 14/01/2008, 07:25
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Busco comentarios sobre un ¿nuevo? concepto

Pues la idea es que sea una capa de abstracción que te permita trabajar en OO sin pensar en la BD... ahora bien... eso también podría ser la definición de Propel (por ejemplo).

Sin embargo, hay una diferencia. Por ejemplo:
Imagina que tienes:
Clase Vehículo. Propiedades: nombre y precio
Coche extiende a Vehículo. Propiedades: puertas
Carroza extiende a Vehículo. Propiedades: caballos

En un ORM si quieres encontrar un Vehículo con cierto rango de precios (sin importar el tipo de vehículo), deberías buscar en Coche por el rango que deseas y en Carroza por el mismo rango. Esto es así porque un ORM funciona bajo un paradigma funcional.

Sin embargo, bajo un paradigma OO, lo lógico sería buscar en todos los Vehículos.
Eso es lo que permitiría esto. Hacer un:
SELECT Vehículo WHERE precio BETWEEN 0 AND 100
Y esto te devolvería indiferentemente Coches o Carrozas.

En pocas palabras, es algo que toma en consideración la herencia (la base del OO) y que sí te abstrae completamente de la forma en la que implementes la persistencia.

¿Para qué?, por ahora es simplemente conceptual aunque estoy trabajando en su desarrollo.

Desde un punto de vista de implementación, efectivamente esto se traduciría en tablas en el manejador de BBDD relacional, pero por ahora no he puesto la implementación (todavía estoy trabajando en el diseño... apenas lo tenga lo coloco para que me den su feedback )
  #10 (permalink)  
Antiguo 14/01/2008, 08:35
venkman
Invitado
 
Mensajes: n/a
Puntos:
Re: Busco comentarios sobre un ¿nuevo? concepto

Bueno, si es ese el asunto, Propel soporta herencia mediante una tabla compartida por jerarquía y te permite hacer lo que cuentas en el ejemplo. Quizá la tabla compartida no es la mejor de las soluciones en todos los casos, pero sí tiene cosas buenas y como de todos modos pretendes esconder por completo lo que pase por detrás en el almacenamiento, entonces no le veo demasiado problema.



En realidad a lo que quiero llegar es a si, más allá de lo interesante que podría ser, te has planteado un balance de ventajas y desventajas. Y no lo digo en absoluto con intención de quitarte las ganas, pero es que no acabo de ver claro que vaya a aportar más que el esfuerzo que puede requerir. Crear un lenguaje entero nuevo. Aprenderlo...
No sólo, has pensado que las BBDD orientadas a objetos se han intentado ya y, salvo casos muy puntuales, no tienen ningún éxito? ¿has pensado en el rendimiento que puede tener algo así hecho en php (o quizá pensabas hacer una extensión en C)?
  #11 (permalink)  
Antiguo 14/01/2008, 13:43
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Busco comentarios sobre un ¿nuevo? concepto

Hola Venkman,

En primer lugar, aprecio mucho tus comentarios... y no te preocupes... soy bastante terco y me gusta mucho "discutir" sobre los paradigmas y cómo es la forma óptima de hacer las cosas, por lo que te agradezco que rebatas mis puntos de vista.

Gracias por indicarme lo de la herencia en Propel... he visto cómo se hace y aunque es un hack, resulta interesante pues ofrece las mismas capacidades que busco. De hecho dejo el enlace a un snippet en el que hablan sobre cómo hacerlo para quien interese: herencia con Propel.

Estoy consciente de lo que comentas sobre la baja aceptación que han tenido los manejadores de BD OO, sin embargo, me parece que la curva de aprendizaje con frameworks que requieren una configuración en XML con un schema desconocido no es muy diferente de la de aprender un lenguaje a la SQL... supongo que es un poco cuestión de gustos, sin embargo, mi idea no es crear un generador de código (por lo menos que no sea necesario hasta que requieras un buen boost en performance) y creo que eso facilita la adopción.

Para explicar un poco mi motivación, yo trabajo en una página web con muchas visitas al mes (unas 110 MM de páginas vistas y 4MM de visitantes únicos)... y me preguntaba como sería hacer esta página bajo un esquema OO (ahora no es así) y cómo tendría que ser el acceso a BD para poder hacer algunas cosas... entre ellas el manejo de herencia (en el caso de la página los objetos son anuncios y en algunas categorías deberían tener campos adicionales).
Y de ahí surge el concepto para esto.

Definitivamente voy a estudiar un poco mejor Propel, aunque para la parte de herencia me parece un poco ineficiente (le he dado muchas vueltas al asunto y decidí no implantarlo como se explica en el hack porque implicaría mucha carga sobre los servidores de BD).

No sé si tienes mucha experiencia con Propel, pero aquellos de ustedes que hayan trabajado con él podrían hablarme un poco de su performance (especialmente bajo fuerte carga).

Gracias.
  #12 (permalink)  
Antiguo 15/01/2008, 02:22
venkman
Invitado
 
Mensajes: n/a
Puntos:
Re: Busco comentarios sobre un ¿nuevo? concepto

No tengo particular experiencia con Propel bajo cargas muy elevadas, así que en eso no te puedo ayudar.
Lo que sí te puedo decir es que, de las varias soluciones que se pueden hacer para implementar la herencia sobre un sistema relacional ( ver http://www.hibernate.org/hib_docs/reference/en/html/inheritance.html ) (que todas son hacks), la de tabla compartida por jerarquía es la más rápida.



En cuanto a tu idea general de hacer la página orientada a objetos... Lo único que te puedo decir es que evalúes bien todos los elementos implicados. Por un lado seguramente ganarías en mantenibilidad, el código sería más limpio y fácil de seguir y modificar. Pero por otro lado, ten cuidado en no complicar excesivamente la arquitectura. Si cambias a algo demasiado complejo, seguramente el rendimiento no mejore, sino que sea más lento.

Mi recomendación es ir a una arquitectura ordenada, pero lo más sencilla posible. Es decir, no se trata simplemente de hacer tu arquitectura OO por el hecho de hacerla OO. Se trata de hacer una arquitectura ordenada pero eficiente. Si se hace OO estupendo, pero tampoco tiene que ser radicalmente OO donde todo sean objetos y todo tenga que amoldarse a una idea en lugar de buscar las ideas que mejor funcionen.
  #13 (permalink)  
Antiguo 15/01/2008, 07:24
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Busco comentarios sobre un ¿nuevo? concepto

Hola Venkman,

Muchas gracias por el enlace a hibernate... estuvo interesante... hace un repaso por las distintas formas de implementación.

Con respecto a la página... realmente no tengo intenciones de cambiarla... ha sido uno de esos ¿y cómo sería...? De hecho, esto está completamente desligado del trabajo.

He seguido estudiando un poco a Propel y me parece bastante interesante... creo que las diferencias conceptuales entre lo que ofrece y lo que me "gustaría" son más que salvables.

Así que por el momento voy a aparcar el desarrollo de esta librería, voy a aprovechar un proyecto que tengo en mente y lo usaré como experimento para aprender symfony y propel... si luego de eso, todavía me parece que pudiera ser útil esta librería la seguiré desarrollando, sin embargo, no quiero volver a inventar la rueda así que lo que me queda es ponerme al día con las nuevas librerías / frameworks... igual algo mejor se me ocurre y aquí se los contaré ;)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:19.