25/04/2014
1
DCIC - UNSLic. Ariel Trellini
Clase 5
Desarrollo de Aplicaciones Empresariales • 101 Lic. Ariel Trellini • DCIC • UNS
Mapeando a Bases de Datos Relacionales
Patrones de Diseño Empresariales
Presentación
Dominio
Acceso a Datos
¿Cómo se puede resolver el “impedancemismatch” 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
Desarrollo de Aplicaciones Empresariales • 102 Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales
Tipo de Patrón Objetivo Patrones
Patrones Arquitectónicos
¿Cómo la lógica de dominio se comunica con la base de datos?
Table Data GatewayRow Data GatewayActive RecordData Mapper
Patrones de Comportamiento Objeto-Relacional
¿Cómo realizar el manejo de los objetos (cargarlos/guardarlos)?
Unit Of WorkIdentity MapLazy Load
Patrones Estructurales Objeto-Relacional
¿Cómo mapear los conceptos de la OO a la base de datos relacional?
Identity FieldForeing Key MappingAssociation Table MappingDependent MappingEmbedded ValueSerialized LOBInheritance 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 MappingQuery ObjectRepository
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 103 Lic. Ariel Trellini • DCIC • UNS
PATRONES ARQUITECTONICOS
Table Data Gateway
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales
Un objeto que actúa como Gateway a una tabla de base de datos.
Una instancia maneja todas las filas en la tabla.
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 104 Lic. Ariel Trellini • DCIC • UNS
¿Cómo Trabaja?
Características: Su interfaz consiste de:
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
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Table Data Gateway
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 105 Lic. Ariel Trellini • DCIC • UNS
¿Cuándo Utilizarlo?
Dado que su implementación es muy sencilla, sería apropiado para 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 resultset sea conveniente para el Transaction Script.
La misma interfaz sirve para utilizar sentencias SQL directas o storedprocedures.
El resto de los casos.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Table Data Gateway
Presentación
Dominio
Acceso a Datos
25/04/2014
2
Desarrollo de Aplicaciones Empresariales • 106 Lic. Ariel Trellini • DCIC • UNS
Row Data Gateway
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales
Un objeto que actúa como Gateway a un único registro en una
tabla de base de datos. Hay una instancia por fila.
Presentación
Dominio
Acceso a Datos
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 • 107 Lic. Ariel Trellini • DCIC • UNS
¿Cómo Trabaja?
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:
Métodos estáticos.
Objetos de búsqueda (buscadores).
¿Cuál es diferencia entre Row Data Gateway y Active Record? La clave está en si existe lógica de dominio en estos objetos.
Row Data Gateway Sin lógica de dominio
Active Record 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.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Row Data Gateway
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 108 Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Row Data Gateway
Funcionamiento del Row Data gateway
Desarrollo de Aplicaciones Empresariales • 109 Lic. Ariel Trellini • DCIC • UNS
¿Cuándo Utilizarlo?
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.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Row Data Gateway
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 110 Lic. Ariel Trellini • DCIC • UNS
Active Record
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales
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.
Presentación
Dominio
Acceso a 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.
Desarrollo de Aplicaciones Empresariales • 111 Lic. Ariel Trellini • DCIC • UNS
¿Cómo Trabaja?
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:
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.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Active Record
Presentación
Dominio
Acceso a Datos
25/04/2014
3
Desarrollo de Aplicaciones Empresariales • 112 Lic. Ariel Trellini • DCIC • UNS
¿Cómo Trabaja? (Cont)
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).
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Active Record
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 113 Lic. Ariel Trellini • DCIC • UNS
¿Cuándo Utilizarlo?
Es una buena elección para la lógica de dominio que no sea demasidocompleja, 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.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Active Record
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 114 Lic. Ariel Trellini • DCIC • UNS
Data Mapper
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales
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.
Presentación
Dominio
Acceso a Datos
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.
Desarrollo de Aplicaciones Empresariales • 115 Lic. Ariel Trellini • DCIC • UNS
¿Cómo Trabaja?
Hay muchas formas de construir una capa de Data Mappers. Sin embargo, veremos ejemplos sencillos para entender la idea.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper
Presentación
Dominio
Acceso a Datos
Recuperar datos de una base de datos.
Desarrollo de Aplicaciones Empresariales • 116 Lic. Ariel Trellini • DCIC • UNS
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.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper
Presentación
Dominio
Acceso a Datos
Actualizando datos
Desarrollo de Aplicaciones Empresariales • 117 Lic. Ariel Trellini • DCIC • UNS
Identidad de los objetos
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:
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
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 findersrequeridos por la clase de domino y ubicándola en el paquete de dominio.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper
Presentación
Dominio
Acceso a Datos
25/04/2014
4
Desarrollo de Aplicaciones Empresariales • 118 Lic. Ariel Trellini • DCIC • UNS
Mapear Datos a Propiedades del Dominio
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.
Constructores
Constructor Rico
Permite crear una instancia bien formada.
Permite propiedades inmutables reales.
Cuidado con las referencias cíclicas.
Constructor Vacío:
Crea una instancia vacía que luego será completada con datos.
Permite resolver las referencias cíclicas con ayuda del Identity Map
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 119 Lic. Ariel Trellini • DCIC • UNS
Mapeos Basados en Metadatos
Código explícito
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
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, fluentinterfaces, modelos graficos.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper
Presentación
Dominio
Acceso a Datos
Mostrar ejemplos de mapeos: DAO c/SP, Entity Fwk, NHibernateXML, Anotaciones JPA, Fluent NH
Desarrollo de Aplicaciones Empresariales • 120 Lic. Ariel Trellini • DCIC • UNS
¿Cuándo Utilizarlo?
Cuando queremos que el esquema de base de datos y el modelo de dominio evolucionen independientemente
Cuando utilizamos Domain Model. Si bien se podría utilizar Active Record, 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.
Patrones de Diseño Empresariales Mapeando a Bases de Datos Relacionales Data Mapper
Presentación
Dominio
Acceso a Datos
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.
Desarrollo de Aplicaciones Empresariales • 121 Lic. Ariel Trellini • DCIC • UNS
¿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:
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
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones de Comport. Objeto-Relacional
PATRONES DE COMPORTAMIENTO OBJETO-RELACIONAL
Unit Of Work
Presentación
Dominio
Acceso a Datos
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.
Desarrollo de Aplicaciones Empresariales • 122 Lic. Ariel Trellini • DCIC • UNS
¿Cómo utilizarlo? Ya viene implementado en muchos ORMs:
Hibernate Session
Entity Framework Context
etc.
Construirlo desde cero es factible, aunque requeriría bastante esfuerzo.
Muchas veces se encapsula (wrappea) el UoW provisto por el ORM
Para evitar tener referencias al ORM en la capa de negocios/aplicación
Para extenderlo con el fin de agregarle features
Manejo de transacciones distribuidas (múltiples BDs)
Logging
Realizar acciones luego del cierre de la transacción de BD.
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones de Comport. Objeto-Relacional
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 123 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja? 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.
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones de Comport. Objeto-Relacional
Identity Map Presentación
Dominio
Acceso a Datos
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.
25/04/2014
5
Desarrollo de Aplicaciones Empresariales • 124 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja? 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, Valueholder, Ghost
¿Cuándo utilizarlo? 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 !
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones de Comport. Objeto-Relacional
Lazy Load Presentación
Dominio
Acceso a Datos
Un objeto que no contiene todos los datos que necesitas, pero
sabe cómo obtenerlos.
Desarrollo de Aplicaciones Empresariales • 125 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja? Elegir la clave
Claves con o sin sentido
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
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
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional
PATRONES ESTRUCTURALES OBJETO-RELACIONAL
Identity Field
Presentación
Dominio
Acceso a Datos
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
Desarrollo de Aplicaciones Empresariales • 126 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja? Elegir la clave (cont.)
Tipo y tamaño
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.
Representar el Identity Field en un objeto
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)
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional
Presentación
Dominio
Acceso a Datos
Desarrollo de Aplicaciones Empresariales • 127 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja?
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional
Foreign Key Mapping Presentación
Dominio
Acceso a Datos
Mapea una asociación entre objetos a una foreing key entre tablas
Mapeando una referencia Mapeando una colección
Desarrollo de Aplicaciones Empresariales • 128 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja?
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional
Association Table 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.
Desarrollo de Aplicaciones Empresariales • 129 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja? El objeto dependiente:
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 IdentityMap
No puede ser buscado directamente.
Sólo es accedido desde su owner
Generalmente es un Value Object
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional
Dependent Mapping Presentación
Dominio
Acceso a Datos
Una clase tiene que realizar el mapeo de BD para una clase hija
25/04/2014
6
Desarrollo de Aplicaciones Empresariales • 130 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja?
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional
Embedded Value Presentación
Dominio
Acceso a Datos
Mapea un objeto en varios campos de la tabla de otro objeto
Desarrollo de Aplicaciones Empresariales • 131 Lic. Ariel Trellini • DCIC • UNS
¿Cómo trabaja? Tipos de serialización:
BLOB: Binary LOB
CLOB: Textual characters LOB
Se diferencia con EmbeddedValue en que está orientado estructuras de objetos más complejas.
Patrones de Diseño Empresariales Mapeando a BD Relacionales Patrones Estructurales Objeto-Relacional
Serialized LOB Presentación
Dominio
Acceso a Datos
Guarda un grafo de objetos serializándolos en un único objeto
grande (LOB), el cual se almacena en un campo de la BD.