Comunidad de diseño web y desarrollo en internet online

Clases en Php y Base de datos

Citar            
MensajeEscrito el 15 Dic 2007 02:23 am
Hola a todos. Estoy empezando con Php orientado a objetos y me surge una duda conceptual.
Le explico mejor con un ejemplo:

Tengo 2 tablas (Artículos y Categorías) en la base de datos. Sus columnas son:
tbl_artículos(id, titulo, contenido)
tbl_categorías(id, categoría)

La relación entre ellas es n:m ya que 1 categoría puede tener muchos artículos y 1 articulo puede pertenecer a varias categorías. Por este motivo creo una tercera tabla "tbl_relación" con los id de las tablas como clave principal.

En Php cree 2 clases (Articulos y Categorias). Donde cada columna de la tabla representa una propiedad en la clase y tienen métodos como obtenerListado, insertar, borrar, contar, etc.

Lo que me interesa saber es como debería plantear el tema de la relación n:m en las clases.

Desde ya muchas gracias.
Saludos.

Por GustavoV

Claber

136 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 15 Dic 2007 02:35 am
Crea una clase para esa tercera tabla. Con métodos del tipo:

Código :

$Tercera->getArticulosPorCategoria($idCategoria);
$Tercera->getCategoriasDeArticulo($idCategoria);


Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 20 Dic 2007 04:54 pm
Para empezar yo creo que no es recomendable establecer una conexion entre un modelo entidad/relacion como es el caso de las db relacionales con un modelo como el orientado a objetos.
No creo que sea buena idea el establecer una tercera clase del tipo ArticulosCategorias ni nada por el estilo. Yo veo esta relacion entre las categorias y lo articulos como una relacion de asociacion.
En UML y en la OO se establecen una serie de relaciones estructurales entre las clases, en el nivel superior encontramos tres tipos de relaciones generales, la dependencia, la generalizacion y las asociaciones, pues bien, en el caso de los articulos y las categorias se presenta este tipo de relacion.
Para lo que quieres realizar yo estableceria una relacion de asocion entre estas dos clases, con una multiplicidad de 1.*, es decir, que un articulo puede pertenecer a una o mas categorias y que una cateogria puede contener 1 o mas articulos. El problema aqui es que esta relacion la podemos hacer de diferentes formas, tambien podriamos hacer que los articulos solo puedan pertenecer a una sola categoria, como una relacion 1 a 1 en una db relacional, todo depende de como lo queramos modelar.
Para mas informacion sobre tipos de relaciones quiza te interese esto:

http://docs.kde.org/stable/es/kdesdk/umbrello/uml-elements.html

Para realizar esto con php yo estableceria una propiedad en la clase Categoria que fuese una lista
con referencias a los objetos Articulo, de esta manera conseguimos que las categorias conozcan que articulos pertenecen a las mismas pero los articulos no tienen ni idea de a que categoria pertenecen. Pero esto tambien depende de lo que queramos hacer.

Ademas creo que te podria ser de ayuda el mirar algunos patrones de bases de datos relacionales,
estos patrones existen precisamente como dije al principio por las limitaciones dl modelo relacional frente al orientado a objetos. Lo que hacen estos patrones es crear una abstraccion de la base de datos para de estar forma evitar un fuerte acoplamineto entre la logica de dominio y el origen de datos. Para mas informacion sobre esto puedes ver un articulo que escribi en mi blog no hace mucho tiempo:

http://www.thinkinginblue.com/?p=49

Por Pitxon

38 de clabLevel



Genero:Masculino  

Madrid

firefox
Citar            
MensajeEscrito el 20 Dic 2007 05:25 pm
Muy bueno tu comentario, en mi caso no hago SQL, de todas las tablas de mi DB tengo objetos(clases) y estos heredan de DBTable, por eso si tengo clases de ese tercer objeto, pero como bien dices si trabajará normalmente, tal vez en el modelo no sería tan necesario una clase para esa tercera tabla.

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 21 Dic 2007 04:14 pm
En realidad da igual si utilizas SQL o no, siempre es recomendable crear una abstraccion de las db
relacionales ya que nos facilita mucho mas el trabajo y ademas nos permite poder cambiar de un gestor de bases de datos a otro diferente facilmente y sin realizar cambios en el codigo de la logica de dominio.
Lo perfecto seria el utilizar una db orientada a objetos ya que nos evitariamos crear el mapeo a la base de datos, esto es de gran ayuda sobre todo en proyectos muy grandes en los que el origen de datos es muy complejo.

Por cierto, ya lo escribi en una entrada anterior pero nadie me ha contestado, ¿existe alguna db orientada a objetos para PHP?, yo por lo que he estado mirando por ahi no hay ninguna.

Por esta inexistencia de bases de datos OO para PHP me estoy planteando utilizar una db OO para Java de manera que se pueda utilizar con php. Si hay alguien al que le interese como se podria hacer esto puede ser de gran ayuda empezar por aqui:
http://www.php-es.com/ref.java.html

Por Pitxon

38 de clabLevel



Genero:Masculino  

Madrid

firefox
Citar            
MensajeEscrito el 21 Dic 2007 04:27 pm
Explicaba lo del SQL porqué decias que no era necesario una clase para la tercera tabla(yo no puedo dejar una tabla sin su respectiva clase), luego dices que sí en tu segunda respuesta, jeje, en fin ya no hay que desviar el tema, esperemos que GustavoV saque conclusiones.

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 21 Dic 2007 04:48 pm
Creo que me has entendido mal, nunca creo que sea buena idea el crear una tercera clase como la que dices, simplemente digo que el crear el mapeo es bueno y necesario para poder desacoplar totalmente los datos de la logica del dominio. Nunca deberia existir un clase en PHP como por ejemplo del tipo ArticulosCategorias. Imaginate que pasaria si decidiesemos heredear de articulos o de categorias, me da miedo con solo pensar los problemas que podria suponer el hacer esto.

Por Pitxon

38 de clabLevel



Genero:Masculino  

Madrid

firefox
Citar            
MensajeEscrito el 21 Dic 2007 10:21 pm
Para el problema de GustavoV, efectivamente puede no ser necesario crear una tercera clase. De hecho lo mejor hubiera sido poner como le hago yo en esos casos. Yo creo la clase Category, en esta implemento un método para traer las categorias, dado un artículo. También crearía una clase de artículos, que puede traerte todo los artículos dada una categoria.

Código :

public class Category extends DBTable
{
  public function Category()
  {
  }
  public function getCategoriesByItem( $idItem ) 
  {
    //TODO: Handle the search
  }
}



Nunca deberia existir un clase en PHP como por ejemplo del tipo ArticulosCategorias

Yo creo la tercera clase para el control de la tabla(CRUD). La tabla de relaciones, que es lo que creo no has entendido:

Código :

$RelationTable = new RelationTable();
$RelationTable->idCategory = 1; 
$RelationTable->idItem = 3;
$RelationTable->insert();

La clase RelationTable es construida automáticamente por mi FrameWork, este levanta el crud de la tabla en PHP, de forma sencilla puedo heredar de esta o usarla por composición en mas objetos. DBTabla hace automaticamente los insert, edit, remove, search, getRow y demás funciones genéricas en las tablas. Reitero y espero ser claro, para la problemática de GustavoV, no es necesario construir la tercera clase, que yo erroneamente sugerí en mi primera respuesta. Pero de eso a que no exista razón para crear una clase de cada tabla es distinto.


Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 23 Dic 2007 02:19 am
Muchas gracias por sus respuestas.

Por GustavoV

Claber

136 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.