Casi he terminado mi Data Mapper, pero ahora estoy en el punto de las relaciones.Data Mapper and Relationships: Estrategias de implementación?
Trataré de ilustrar mis ideas aquí. No pude encontrar buenos artículos/información sobre este tema, así que tal vez estoy reinventando la rueda (estoy seguro, podría usar un gran marco, pero quiero aprender haciéndolo).
1: 1 Relaciones
En primer lugar, veamos 1: 1 relaciones. En general, cuando tenemos una clase de dominio llamada "Compañía" y otra llamada "Dirección", nuestra clase Compañía tendrá algo como id_dirección. Digamos que en la mayoría de los casos solo mostramos una lista de compañías, y la dirección solo es necesaria cuando alguien mira los detalles. En ese caso, mi Data Mapper (CompanyDataMapper) simplemente se carga de forma perezosa, lo que significa que solo obtendrá ese id_dirección de la base de datos, pero no se unirá para obtener también los datos de la dirección.
En general, tengo un método getter para cada relación. Entonces, en este caso, hay un método getAddress (Company companyObject). Toma un objeto de compañía, busca su propiedad de dirección y, si es NULL, obtiene el objeto Address correspondiente de la base de datos, utilizando la clase Mapper para ese objeto Address (AddressDataMapper) y asigna ese objeto de dirección a la propiedad de dirección de la especificada objeto de la empresa
Importante: ¿Se permite a un Data Mapper utilizar otro Data Mapper?
Digamos que en la mayoría de los casos necesita el objeto de la empresa Y el objeto de la dirección, porque siempre lo muestra en una lista todos juntos. En este caso, CompanyDataMapper no solo obtiene objetos de la compañía, sino que realiza una consulta SQL con JOIN para obtener también todos los campos del objeto de dirección. Finalmente, itera sobre el conjunto de registros y alimenta nuevos objetos con sus valores correspondientes, asignando el objeto de dirección al objeto de la compañía.
Sonidos simples, hasta ahora.
1: n Relaciones
¿Qué hay de estos? La única diferencia para 1: 1 es que una empresa puede tener múltiples objetos de dirección. Echemos un vistazo: cuando la mayoría de las veces solo nos interesa la compañía, Data Mapper simplemente establece las direcciones propiedad del objeto de la compañía en NULL. La propiedad de direcciones es una matriz que puede hacer referencia a ninguna, una o varias direcciones. Pero aún no lo sabemos, ya que cargamos perezosamente, por lo que solo es NULL. ¿Pero qué, si necesitaríamos todas las direcciones en la mayoría de los casos también? ¿Si mostramos una gran lista con todas las empresas junto con todas sus direcciones? En este caso, las cosas empiezan a ponerse realmente feas. En primer lugar, no podemos unirnos a la tabla de direcciones cincuenta veces para cada objeto de dirección (creo firmemente que es imposible, y si lo es, el rendimiento sería inferior a cero). Entonces, cuando pensamos esto más adelante en el camino, es imposible NO cargarlo perezosamente en este caso.
Importante: ¿Es esto cierto? ¿Debo enviar 100 consultas para obtener 100 objetos de dirección, si tengo 10 empresas con cada 10 direcciones?
m: n Relaciones
permite decir un objeto de dirección sólo contiene el número del país, estado, ciudad, carretera y casa. Pero una casa podría ser una gran torre de negocios con muchas compañías en ellas.Como uno de esos modernos edificios de oficinas donde cualquiera puede alquilar una pequeña rom para exhibir esa torre en su sitio web. Entonces: muchas compañías pueden compartir la misma dirección.
No tengo planes para lidiar con ese tipo de problema.
Importante: ¿Probablemente no es un problema mayor que las relaciones 1: n?
Si alguien conoce un buen recurso que entra en detalles sobre cómo resolverlo/implementarlo, ¡me alegrará un enlace!