Download Clase 5 - DCIC
Document related concepts
Transcript
25/04/2014 Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales ¿Cómo se puede resolver el “impedance mismatch” impedance mismatch (desajuste por impedancia) entre modelo de objetos y modelo relacional? Existen distintos tipos de patrones que consideran la problemática de la persistencia de datos: Patrones Arquitectónicos Patrones de Comportamiento Objeto-Relacional Patrones Estructurales Objeto-Relacional Patrones de Mapeo de Metadatos Objeto-Relacional Clase 5 Lic. Ariel Trellini Dominio Acceso a Datos DCIC - UNS Desarrollo de Aplicaciones Empresariales • 101 Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Presentación Dominio Tipo de Patrón Presentación Objetivo Patrones Acceso a Datos Patrones Arquitectónicos ¿Cómo la lógica de dominio se comunica con la base de datos? Table Data Gateway Row Data Gateway Active Record Data Mapper Patrones de Comportamiento Objeto-Relacional ¿Cómo realizar el manejo de los objetos (cargarlos/guardarlos)? Unit Of Work Identity Map Lazy Load Patrones Estructurales Objeto-Relacional ¿Cómo mapear los conceptos de la OO a la base de datos relacional? Identity Field Foreing Key Mapping Association Table Mapping Dependent Mapping Embedded Value Serialized LOB Inheritance Patterns… Inheritance Mapper Patrones de Mapeo de Metadatos Objeto-Relacional ¿Cómo definir declarativamente el mapeo objeto-relacional y encapsularlo, proponiendo una interfaz orientada a objetos? Metadata Mapping Query Object Repository Desarrollo de Aplicaciones Empresariales • 102 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Table Data Gateway Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales PATRONES ARQUITECTONICOS Presentación Dominio Acceso a Datos Table Data Gateway Un objeto que actúa como Gateway a una tabla de base de datos. Una instancia maneja todas las filas en la tabla. Desarrollo de Aplicaciones Empresariales • 103 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Table Data Gateway Presentación ¿Cómo Trabaja? Dominio Presentación ¿Cuándo Utilizarlo? Dominio Acceso a Datos Características: Dado que su implementación es muy sencilla, sería apropiado para Su interfaz consiste de: Acceso a Datos Métodos find para obtener información desde la BD Métodos de actualización: insert, update, delete Cada método ejecuta una sentencia SQL de acuerdo a sus parámetros. Generalmente es stateless, ya que su rol es transferir datos entre el dominio y la BD. En las consultas, siempre retorna un conjunto de datos: Map, RecordSet, DTOs Desarrollo de Aplicaciones Empresariales • 104 Lic. Ariel Trellini • DCIC • UNS aplicaciones muy pequeñas que no cuentan con una lógica de acceso a datos compleja. Si se ha decidido utilizar Table Modules para resolver la lógica de domino. Table Data Gateway es el mejor socio para estos casos, ya que produce los record sets que requiere un Table Module. También es apropiado para Transaction Scripts, siempre y cuando el result set sea conveniente para el Transaction Script. La misma interfaz sirve para utilizar sentencias SQL directas o stored procedures. El resto de los casos. Desarrollo de Aplicaciones Empresariales • 105 Lic. Ariel Trellini • DCIC • UNS 1 25/04/2014 Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Row Data Gateway Row Data Gateway Presentación Presentación Dominio ¿Cómo Trabaja? Dominio Acceso a Datos Acceso a Datos Un objeto que actúa como Gateway a un único registro en una tabla de base de datos. Hay una instancia por fila. Imita exactamente un registro de la base de datos, de manera tal que cada columna de la tabla es un campo del objeto. Realiza todas las conversiones necesarias entre los tipos de datos de la base de datos y los tipos del lenguaje de programación. Trabaja particularmente bien con Transaction Script. Métodos de búsqueda: ¿Cuál es diferencia entre Row Data Gateway y Active Record? La clave está en si existe lógica de dominio en estos objetos. Un Row Data Gateway permite obtener objetos que lucen como los registros de una tabla, pero pueden ser accedidos a través de las facilidades del lenguaje de programación utilizado. De esta manera, se encapsula toda la lógica específica (generalmente SQL) de acceso a datos dentro del gateway. Desarrollo de Aplicaciones Empresariales • 106 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Row Data Gateway Métodos estáticos. Objetos de búsqueda (buscadores). Row Data Gateway Active Record Sin lógica de dominio Con lógica de dominio Si bien es bastante tedioso de escribir, es muy utilizado por los generadores de código basados en Metadata Mapping. Desarrollo de Aplicaciones Empresariales • 107 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Row Data Gateway Presentación ¿Cuándo Utilizarlo? Dominio Acceso a Datos Principalmente, cuando se usa Transaction Script. Así, se factoriza el código de acceso a los datos y se lo reutiliza entre distintos scripts. No sería conveniente utilizarlo en conjunto con Domain Model. Opciones: • Si el mapeo es simple, usar Active Record. • Si el mapeo es más complejo, usar Data Mapper. • Si se utiliza para aislar a los objetos de domino de la estructura de base de datos, se tendrán 3 representaciones de los datos: una en los objetos de dominio, una en los Row Data Gateways y una en la base de datos. Funcionamiento del Row Data gateway Desarrollo de Aplicaciones Empresariales • 108 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Active Record Desarrollo de Aplicaciones Empresariales • 109 Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Active Record Presentación Presentación Dominio ¿Cómo Trabaja? Acceso a Datos Un objeto que wrappea una fila de una tabla de la base de datos, encapsula la lógica de acceso a datos y agrega lógica de dominio sobre aquellos datos. Active Record utiliza la opción más obvia: pone la lógica de acceso a datos en el objeto de dominio. De esta manera, todos los objetos de dominio conocen como guardar y leer sus datos. Lic. Ariel Trellini • DCIC • UNS Dominio Acceso a Datos La esencia de un Active Record es un Domain Model en el cual las clases se corresponden bastante con la estructura de tablas de la base de datos subyacente. Cada Active Record es responsable tanto de guardarse y cargarse en/desde la base de datos, como de cualquier lógica de dominio que actúe sobre los datos. Típicamente tiene métodos para: Desarrollo de Aplicaciones Empresariales • 110 Lic. Ariel Trellini • DCIC • UNS Construir una instancia del Active Record a partir de una fila de un result set SQL. Construir una nueva instancia que luego será insertada en la base de datos. Métodos de búsqueda estáticos para factorizar queries SQL repetitivas y retornar instancias del Active Record. Insertar y actualizar los datos del Active Record en la base de datos. Obtener y asignar valores a los campos del Active Record. Implementar algunas partes de la lógica de negocio. Desarrollo de Aplicaciones Empresariales • 111 Lic. Ariel Trellini • DCIC • UNS 2 25/04/2014 Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Active Record Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Active Record Presentación ¿Cómo Trabaja? (Cont) Dominio Acceso a Datos Los métodos get y set pueden realizar otras funciones como, por ejemplo, convertir tipos orientados a SQL a tipos propios del lenguaje de programación. Se diferencia de Row Data Gateway en que Active Record contiene lógica de negocio. Puede utilizar métodos de búsqueda estáticos o puede utilizar objetos de búsqueda (finders). Presentación ¿Cuándo Utilizarlo? Es una buena elección para la lógica de dominio que no sea demasido Desarrollo de Aplicaciones Empresariales • 112 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Dominio Acceso a Datos compleja, tales como operaciones CRUD. Validaciones basadas en los datos de un único registro también funcionan bien. Tiene la ventaja de la simplicidad comparado con Data Mapper. Funcionan bien solamente si los objetos Active Record se corresponden directamente con las tablas de la base de datos. Es un buen patrón a considerar si se está usando Transaction Script y se comienzan a sufrir sus desventajas (duplicación de código, mantenimiento, etc). Si la lógica de dominio es más compleja, se querrán usar relaciones directas a objetos, colecciones, herencia, etc; cosas que no son fáciles de resolver con Active Record. Acopla el diseño de objetos al diseño de base de datos. Desarrollo de Aplicaciones Empresariales • 113 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper Data Mapper Presentación Presentación Dominio ¿Cómo Trabaja? Dominio Acceso a Datos Acceso a Datos Una capa de Mappers que mueven datos entre los objetos y la base de datos manteniéndolos independientes unos de otros y del mapper en sí mismo. Hay muchas formas de construir una capa de Data Mappers. Sin embargo, veremos ejemplos sencillos para entender la idea. Los Data Mappers separan los objetos en memoria de la base de datos. Son responsables de transferir los datos entre ambos y de mantenerlos aislados uno de otro. Recuperar datos de una base de datos. Desarrollo de Aplicaciones Empresariales • 114 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper Desarrollo de Aplicaciones Empresariales • 115 Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper Presentación Presentación Dominio Acceso a Datos Dominio Identidad de los objetos Cantidad de Mappers Hardcoded: Uno por cada clase de dominio o raíz de un agregado. Metadata Mapping: Unico mapper para todas las clases. Finders agrupados por clase de dominio. Desarrollo de Aplicaciones Empresariales • 116 Lic. Ariel Trellini • DCIC • UNS Registry de Identity Maps Cada clase finder mantenga su propio Identity Map, asegurando que habrá solamente una clase finder por cada entidad de negocio. Manejo de Finders Actualizando datos Acceso a Datos Es necesario que exista en todo momento una única representación en memoria de un objeto de domino, identificada por su identidad. Hay dos opciones: Lic. Ariel Trellini • DCIC • UNS Varias veces una clase de dominio necesita acceder a un finder de otra clase de dominio Nunca agregar una dependencia desde un objeto de dominio al Data Mapper. Utilizar Separated Interface, creando una interfaz con todos los métodos finders requeridos por la clase de domino y ubicándola en el paquete de dominio. Desarrollo de Aplicaciones Empresariales • 117 Lic. Ariel Trellini • DCIC • UNS 3 25/04/2014 Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper Presentación Presentación Dominio Mapear Datos a Propiedades del Dominio Dominio Mapeos Basados en Metadatos Los mappers necesitan acceder a las variables de instancia de los objetos de dominio. Esto sería un problema ya que debiéramos exponer miembros públicos para los mappers, aun si no queremos que formen parte de la lógica de domino. Algunas soluciones Poner los mappers cerca de los objetos de dominio para sacar provecho de alguna regla de visibilidad del lenguaje de programación. Usar Reflection. Utilizar métodos especiales, nombrados con alguna convención que permita identificarlos. Acceso a Datos Mostrar ejemplos de mapeos: DAO c/SP, Entity Fwk, NHibernate XML, Anotaciones JPA, Fluent NH Permite crear una instancia bien formada. Permite propiedades inmutables reales. Cuidado con las referencias cíclicas. Crea una instancia vacía que luego será completada con datos. Permite resolver las referencias cíclicas con ayuda del Identity Map Desarrollo de Aplicaciones Empresariales • 118 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper Desarrollo de Aplicaciones Empresariales • 119 Dominio Acceso a Datos Cuando queremos que el esquema de base de datos y el modelo de PATRONES DE COMPORTAMIENTO OBJETO-RELACIONAL cuando las cosas se ponen más complejas, Data Mapper toma ventaja. Si se tiene un modelo de negocio simple. Si no se quiere pagar el costo de una capa extra. Si hay que construirlo desde cero. Un data mapper es un monstruo complicado de construir. Hay productos que ya resuelven la problemática, están testeados e implementan muchos de los patrones vistos. ¿Cómo trabaja? Cuando se comienza a trabajar con la BD, se crea un UoW UoW mantiene registro de todos los objetos creados / modificados / eliminados durante la transacción de negocio. Al finalizar la transacción de negocio, el UoW decide qué hacer: Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones de Comport. Objeto-Relacional Presentación Dominio Identity Map Manejo de transacciones distribuidas (múltiples BDs) Logging Realizar acciones luego del cierre de la transacción de BD. ¿Cómo trabaja? Desarrollo de Aplicaciones Empresariales • 122 Dominio Asegura que cada objeto sea cargado solamente una vez, manteniendo cada objeto cargado en un map. Busca objetos a través del map cuando se los referencia. Para evitar tener referencias al ORM en la capa de negocios/aplicación Para extenderlo con el fin de agregarle features Presentación Acceso a Datos Hibernate Session Entity Framework Context etc. Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones de Comport. Objeto-Relacional Acceso a Datos Construirlo desde cero es factible, aunque requeriría bastante esfuerzo. Muchas veces se encapsula (wrappea) el UoW provisto por el ORM Abrir una transacción de BD Realizar chequeos de concurrencia (optimista) Escribir cambios a la BD en el orden apropiado Cerrar la transacción de BD Desarrollo de Aplicaciones Empresariales • 121 Ya viene implementado en muchos ORMs: Dominio Mantiene una lista de objetos afectados por una transacción de negocio y coordina la escritura de los cambios y la resolución de problemas de concurrencia. ¿Cómo utilizarlo? Presentación Acceso a Datos Unit Of Work dominio evolucionen independientemente Cuando utilizamos Domain Model. Si bien se podría utilizar Active Record, Desarrollo de Aplicaciones Empresariales • 120 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones de Comport. Objeto-Relacional Presentación ¿Cuándo Utilizarlo? Mantiene la metadata de mapeo como datos, ya sea en la misma clase de dominio o en una clase separada. Existen distintas variantes para metadatas: XML, atributos/anotaciones, fluent interfaces, modelos graficos. Constructor Vacío: Implica tener un mapper por cada objeto de negocio. El mapeo se realiza a través de asignaciones y sentencias SQL que mantiene internamente Metadata Mapping Constructor Rico Código explícito Constructores Acceso a Datos Lic. Ariel Trellini • DCIC • UNS Mantiene registro de todos los objetos que han sido leídos desde la BD en una única transacción de negocio. Cuando se quiere obtener un objeto, primero se busca en el map por si ya está. Si no está, se busca en la BD y se lo incorpora al map. Si se utiliza el concepto de Unit Of Work, entonces el UoW es el mejor lugar para el Identity Map. También sirve como caché de los objetos obtenidos en una transacción de negocio. Desarrollo de Aplicaciones Empresariales • 123 Lic. Ariel Trellini • DCIC • UNS 4 25/04/2014 Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones de Comport. Objeto-Relacional Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional Lazy Load PATRONES ESTRUCTURALES OBJETO-RELACIONAL Presentación Dominio Acceso a Datos Un objeto que no contiene todos los datos que necesitas, pero sabe cómo obtenerlos. Identity Field Lazy Load interrumpe el proceso de carga de objetos relacionados al objeto que se quiere recuperar, dejando una marca en la estructura de objetos tal que si el dato es necesario, pueda ser cargado solamente cuando sea usado. Alternativas de implementación: Lazy initialization, Virtual proxy, Value holder, Ghost ¿Cómo trabaja? Elegir la clave Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional ¿Cómo trabaja? Elegir la clave (cont.) Dominio Clave simple: Solamente usa un campo de la base de datos. Clave compuesta: Usa más de un campo de la base de datos. Alcance de unicidad de las claves Únicas por tabla Únicas por base de datos Desarrollo de Aplicaciones Empresariales • 125 Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional Foreign Key Mapping Presentación Dominio Acceso a Datos Acceso a Datos Mapea una asociación entre objetos a una foreing key entre tablas Las operaciones más frecuentes son: igualdad y siguiente clave Pueden tener efecto en la performance e índices de las BDs. Generalmente se utilizan: long, GUID e int. ¿Cómo trabaja? Representar el Identity Field en un objeto Presentación Meaningful key: Por ejemplo, el número de documento de una persona Meaningless key: Número aleatorio que no sería utilizado por humanos. Claves simples o compuestas Tipo y tamaño Actualmente lo proveen por defecto muchos ORMs. Balancear la información que se recupera en un acceso versus la cantidad de accesos que se requerirán para recuperar la información necesaria. Principalmente se utiliza para colecciones de objetos relacionados. Cuidado con el problema del N+1 ! Desarrollo de Aplicaciones Empresariales • 124 Claves con o sin sentido ¿Cuándo utilizarlo? Dominio Guarda el campo ID de la base de datos en el objeto para mantener la identidad entre un objeto en memoria y la fila de la base de datos ¿Cómo trabaja? Presentación Acceso a Datos La forma más simple de Identity Field es un campo que concuerde con el tipo de la clave en la BD Para las claves compuestas, generalmente se utiliza una clase que las representa. Muchas veces se factoriza la definición de la clave (junto con la operación de igualdad) en una clase de entidad base y ese comportamiento es heredado por todas las entidades del sistema. Obtener una nueva clave Delegar en la BD y que la auto-genere Usar un GUID Generar propias (max function, tabla de claves separada) Desarrollo de Aplicaciones Empresariales • 126 Mapeando una referencia Lic. Ariel Trellini • DCIC • UNS Desarrollo de Aplicaciones Empresariales • 127 Mapeando una colección Lic. Ariel Trellini • DCIC • UNS Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional Association Table Mapping Dependent Mapping Presentación Dominio Acceso a Datos Guarda una asociación con una tabla con foreign keys a las tablas que están linkedas por la asociación. ¿Cómo trabaja? Dominio Una clase tiene que realizar el mapeo de BD para una clase hija ¿Cómo trabaja? El objeto dependiente: Desarrollo de Aplicaciones Empresariales • 128 Presentación Acceso a Datos Lic. Ariel Trellini • DCIC • UNS Sólo tiene un owner No puede haber referencias a él desde otro objeto que no sea su owner No tiene un Identity Field No es almacedo en el Identity Map No puede ser buscado directamente. Sólo es accedido desde su owner Generalmente es un Value Object Desarrollo de Aplicaciones Empresariales • 129 Lic. Ariel Trellini • DCIC • UNS 5 25/04/2014 Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional Embedded Value Serialized LOB Presentación Dominio Acceso a Datos Mapea un objeto en varios campos de la tabla de otro objeto ¿Cómo trabaja? Dominio Guarda un grafo de objetos serializándolos en un único objeto grande (LOB), el cual se almacena en un campo de la BD. ¿Cómo trabaja? Tipos de serialización: Desarrollo de Aplicaciones Empresariales • 130 Presentación Acceso a Datos Lic. Ariel Trellini • DCIC • UNS BLOB: Binary LOB CLOB: Textual characters LOB Se diferencia con Embedded Value en que está orientado estructuras de objetos más complejas. Desarrollo de Aplicaciones Empresariales • 131 Lic. Ariel Trellini • DCIC • UNS 6