Foros del Web » Programando para Internet » PHP »

Instanciar relacion Uno a muchos

Estas en el tema de Instanciar relacion Uno a muchos en el foro de PHP en Foros del Web. Buenas noches amigos, Estoy intentando realizar un código y tengo ciertas dudas, como siempre con respecto a la mejor forma de hacer las cosas, y ...
  #1 (permalink)  
Antiguo 12/02/2015, 21:36
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 389
Antigüedad: 13 años, 8 meses
Puntos: 16
Instanciar relacion Uno a muchos

Buenas noches amigos,

Estoy intentando realizar un código y tengo ciertas dudas, como siempre con respecto a la mejor forma de hacer las cosas, y pues, como siempre decidí consultar por aqui a ver si pueden alumbrarme con sus opiniones.

Estoy trabajando en estos momentos en un sistema el cual está estructurado en MVC pero no con un framework, los modelos heredan de una clase padre que tiene un conjunto de funciones generales para el manejo de BD. sin embargo, quiero agregarle la funcionalidad para manejar la relación "uno a muchos" de un objeto. Es allí en donde viene la cuestión, no sé si sea apropiado que se declaren las relaciones en una array y que al momento que se instancie la clase sea consultada la bd y me busque todas las relaciones 1 a muchos del objeto.... o que por el contrario esa consulta se haga por medio de un metodo que sea consultado en el momento en que se requiera.

Creo q para ambas tengo un contra. la primera, es que no sé que podría pasar con una clase donde la relación a muchos tenga bastantes registros. con la Segunda, pues que eso implica que si requiero de esos datos relacionados consecutivamente, deberé estar haciendo esa consulta a base de datos más veces de lo que podria querer.

Gracias d antemano a quien pueda leer y responder. Saludos
__________________
Lo imposible es lo posible visto por los ojos de un incapaz.
Si te sirve la respuesta. dale + al karma.
Saludos
  #2 (permalink)  
Antiguo 13/02/2015, 04:18
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: Instanciar relacion Uno a muchos

Como pides opinion, te doy la mía:
Lo primero, y para mí fundamental: no uses la BD para conocer nada del objeto.Si me apuras, los modelos no los derives de nada que tenga que ver con la BD.El hecho de que guardes tus zapatos en una caja, no significa que Zapato herede de Caja.La Caja está diseñada para guardar cosas, no para describirlas.
La relación uno a muchos, como cualquier otra cosa, es una propiedad de la clase, y puede mapearse de mil formas (en BD, en XML, en json, en MongoDB,en...).Toda la metainformación de la clase (campos, tipos de datos, relaciones,etc), las guardo en un array que es una variable miembro del modelo (en realidad, en una clase separada, pero lo mismo da).
Asi puedes hacer algo como esto:
Código PHP:
Ver original
  1. class User
  2. {
  3.        var $definition=array(
  4.              "FIELDS"=>array(....),
  5.              "INVERSE_RELATIONS"=>array(
  6.                     "posts"=>array(
  7.                                  "MODEL"=>"Post",
  8.                                   "REMOTEFIELD"=>"id_author",
  9.                                   "LOCALFIELD"=>"id_user",
  10.                                   "CARDINALITY"=>1000),
  11.                     "friends"=>array(
  12.                                     "MODEL"=>"Friends",
  13.                                     "LOCALFIELD"=>"id_user",
  14.                                     "REMOTEFIELD"=>"id_user",
  15.                                      "CARDINALITY"=>20)
  16.               )
  17. }
En este ejemplo, indico que el modelo "Post" tiene un campo "id_author", que se relaciona con el campo "id_user" del modelo actual.Aqui, entre otras cosas que se te ocurran, puedes añadir un campo "CARDINALITY", que dé una idea aproximada de cuántos modelos remotos (posts) va a tener cada modelo local (user).En este caso, me da por decir que cada user va a tener de media 1000 posts.
De la misma forma, digo que, de media, cada usuario va a tener unos 20 amigos.
El sistema de resolución de relaciones inversas, usa ese campo para saber si, cuando se accede a esa relación, sale "rentable" obtener todos los registros, o no.Una variable de configuración del sistema, indica a partir de qué cardinalidad, y según qué motor de almacenado (Mysql,MongoDB,etc), se toman todos los registros,o uno a uno.
Por otro lado, tampoco es cierto que se tomen de uno en uno.Por defecto, puedes siempre tomar N registros, ya que la diferencia entre tomar 1 y tomar N, tampoco es tan grande.
Cosas como especificar la cardinalidad de las relaciones, después se usa en la generación de código, ya que si sabes que una relación tiene una cardinalidad de 1000, para buscar sobre ella, hay que generar campos de autocompletado, mientras una cardinalidad de 20 , con un simple select basta, etc,etc
  #3 (permalink)  
Antiguo 13/02/2015, 06:55
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 389
Antigüedad: 13 años, 8 meses
Puntos: 16
Respuesta: Instanciar relacion Uno a muchos

Muchas gracias dashtrash por tu respuesta. Más o menos algo así tenia pensado en caso de que obtuviera los registros de una vez, poner una especie de limite. Ahora, me dijiste esto :
El sistema de resolución de relaciones inversas, usa ese campo para saber si, cuando se accede a esa relación, sale "rentable" obtener todos los registros, o no.Una variable de configuración del sistema, indica a partir de qué cardinalidad, y según qué motor de almacenado (Mysql,MongoDB,etc), se toman todos los registros,o uno a uno.
Por otro lado, tampoco es cierto que se tomen de uno en uno.Por defecto, puedes siempre tomar N registros, ya que la diferencia entre tomar 1 y tomar N, tampoco es tan grande.
Dices que la diferencia entre 1 y n no es mucha... supongo que eso depende de el número que sea ese "n" ¿Cierto? y por eso es que comentas que va según el motor de almacenados? por ejemplo en las bds más comunes como mysql o psql.... ¿tienes idea de cual es ese limite?

Muchas gracias por tu explicación. muy útil.
__________________
Lo imposible es lo posible visto por los ojos de un incapaz.
Si te sirve la respuesta. dale + al karma.
Saludos
  #4 (permalink)  
Antiguo 13/02/2015, 07:50
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: Instanciar relacion Uno a muchos

Cita:
Iniciado por rjulio21 Ver Mensaje
Dices que la diferencia entre 1 y n no es mucha... supongo que eso depende de el número que sea ese "n" ¿Cierto? y por eso es que comentas que va según el motor de almacenados? por ejemplo en las bds más comunes como mysql o psql.... ¿tienes idea de cual es ese limite?

Muchas gracias por tu explicación. muy útil.
Eso es.Cuánto es ese n? Depende de muchos factores, por eso es una variable de configuración.Si es una BD, yo lo suelo poner a 20, en requests no paginadas, y en 3*<tamaño de pagina> en requests paginadas.
Pero depende de si recorres muchas relaciones inversas o no, etc.Si la carga sube demasiado, se modifica en configuración, y listo.
  #5 (permalink)  
Antiguo 13/02/2015, 08:09
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 389
Antigüedad: 13 años, 8 meses
Puntos: 16
Respuesta: Instanciar relacion Uno a muchos

Ok. dash. muchas gracias por tu ayuda. estaré trabajando con eso.
__________________
Lo imposible es lo posible visto por los ojos de un incapaz.
Si te sirve la respuesta. dale + al karma.
Saludos

Etiquetas: instanciar, muchos, registro, relacion
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 04:17.