¿Qué enfoque en DataMapper Pattern es mejor para tablas múltiples o unidas?

8

Normalmente, un asignador de datos asigna datos de una tabla en particular. (Teóricamente, debería estar comunicándose entre el Almacenamiento y un Objeto de dominio, pero no es posible en mi caso, por lo que me estoy comunicando directamente con las tablas).

Table1Mappper> Table1

Pero si esa tabla requiere que los datos se unan desde otra tabla, entonces está expandiendo el alcance de su Data Mapper, que solo se suponía que debía mapear desde una tabla.

Table1Mapper> Table1: inner-join: Table2

¿No sería mejor si Table2 tuviera su propio mapeador Table2Mapperpara mapear sus datos?

Si piensa Yes, entonces si desea mostrar una lista de registros de Table1Mapper y luego usar Table2Mapper para obtener los datos que se suponía que se unirían, ejecutará una consulta en un bucle, lo que tampoco es bueno.

¿Cuáles son sus ideas de esta manera?


¿Otra forma es cambiar su mapeador para manejar subtablas?

class Table1Mapper {
    public main_table = 'table1';
    public sub_table1 = 'table2';
}

Lo cual creo que está bien, pero solo hasta que el alcance de todo el mapeador esté tratando una entidad particular en la aplicación. Por ejemplo posty post_author. Pero si el alcance es diferente como posty gallery, lo anterior no dará un mapeador de datos ideal. Para ilustrar esto

class PostMapper {
     public table_name = 'tbl_post';
     public gallery_table_name = 'tbl_gallery';
}

No es correcto, ¿verdad? Sin embargo, sin embargo, querrá obtener las galerías de una publicación en una consulta, ya que agregar una sobrecarga de consulta en un bucle no es un buen rendimiento de la solución.

¿Cuál crees que es la forma correcta de resolver esto en DataMapper Pattern / o cualquier otro patrón si tiene una mejor manera de manejar estos casos?

Starx
fuente

Respuestas:

5

Por Data Mapper te refieres a uno descrito por Martin Fowler , ¿verdad? Es uno de los patrones de patrones arquitectónicos de origen de datos. Otros son:

Data Mapper difiere de otros patrones con respecto a la relación entre objetos y tablas. Tanto los patrones de Data Gateway como el patrón de Active Record suponen una asignación casi individual de tablas a objetos.

Echemos un vistazo a un ejemplo:

table BANK_ACCOUNT
   ID

table BANK_ACCOUNT_BALANCE
   ID
   BANK_ACCOUNT_ID
   BALANCE_AMOUNT
   DATE

Los objetos de dominio son entonces:

class BankAccount {
    long id;
}

class BankAccountBalance {
    long id;
    long bankAccountId;
    Decimal balanceAmount;
    Date date;
}

Como puede ver el mapeo uno a uno entre clases y tablas. También hay dos pasarelas de datos de tabla / fila o registros activos diferentes: uno para cada tabla.

Por el contrario, Data Mapper permite la indirección :

Una capa de Mappers (473) que mueve datos entre objetos y una base de datos mientras los mantiene independientes unos de otros y del mapeador.

Entonces, cuando usa Data Mapper, sus objetos pueden diferir de las tablas de la base de datos. Usted es libre de introducir agregación, unirse a otras tablas, realizar operaciones aritméticas, introducir jerarquías de herencia. Entonces, respondiendo a su pregunta: está perfectamente bien unir dos tablas en Data Mapper siempre que el objeto resultante sea un objeto de dominio válido.

En nuestro ejemplo podríamos tener:

class BankAccount {
    long id;
    Decimal latestBalance;
    Date latestBalanceDate;
}

como objeto de dominio devuelto por un solo Data Mapper basado en JOIN y agregación.

Por lo tanto, Data Mapper es perfecto para representar el modelo de dominio no trivial. Si su modelo de dominio es bastante simple, puede considerar usar el patrón de registro activo o las puertas de enlace de datos.

La necesidad de JOINs Data Mapper a veces (pero no debe) indicar que la clase de dominio es demasiado compleja. Verifique el Principio de responsabilidad única , el Principio de segregación de interfaz .

En el diseño controlado por dominio, las clases de dominio (es decir, devueltas por Data Mapper) toman la forma de entidades u objetos de valor. El libro DDD describe bastante bien de qué debería formar parte una entidad. Es posible que desee ver esto.

Además, DDD define los agregados (muy bien descritos aquí ). A menudo se cargan juntos. Unir dos tablas puede sugerir que hay dos entidades en un solo agregado.

Dawid Pytel
fuente
Gracias. Mi única preocupación era que las diferentes tablas, aunque relacionadas entre sí, pudieran tener su Mapper individual manteniéndolas. Si otro mapeador hace una parte de esto porque los datos están relacionados, entonces la lógica de mantener o abstraer los datos de los relacionados está separada entre dos mapeadores. Esto es lo que se siente como "Esto se podría hacer de una mejor manera", algo así como sentirse dentro.
Starx