Ver Mensaje Individual
  #2 (permalink)  
Antiguo 13/02/2015, 04:18
Avatar de dashtrash
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
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