Transformaciones entre el modelo Relacional y el modelo de Clases

Gestión de la Información Transformaciones entre el modelo Relacional y el modelo de Clases. José Luis Pastrana Brincones ([email protected]) ◦ S...
37 downloads 0 Views 1MB Size
Gestión de la Información

Transformaciones entre el modelo Relacional y el modelo de Clases. José Luis Pastrana Brincones ([email protected])

◦ Supongamos que tenemos un modelo de objetos como el siguiente:

2

◦ ¿Qué tipo de estructura siguen los objetos en memoria? ¿Cómo están almacenados?

3

◦ La memoria es limitada y necesito poder almacenar los objetos en un medio que me permita recuperarlos (persistencia). ◦ La persistencia de la información es la parte más crítica en una aplicación de software. ◦ Opciones:  Puedo conservar la misma estructura en una base de objetos  Puedo utilizar una base de datos relacional como repositorio de información. 4

◦ Si la aplicación está diseñada con orientación a objetos, la persistencia se logra mediante:  serialización del objeto (por ejemplo en XML)  o almacenando en una base de datos. ◦ El modelo de objetos difiere en muchos aspectos del modelo relacional. ◦ La interface que une esos dos modelos se llama marco de Mapeo objeto-relacional (ORM en inglés).

5



Para persistir un objeto, normalmente: ◦ ◦ ◦ ◦



 

6

se crea una conexión a la base de datos se crea una sentencia SQL Se asignan los parámetros se ejecuta la transacción.

Imaginemos que tenemos un objeto con varias propiedades, además de varias relaciones, ¿como las asociamos relacionalmente? ¿Cómo las almacenamos? ¿Automáticamente, manualmente? ¿Qué pasa con las claves?





7

Inicialmente podemos establecer una equivalencia entre el concepto de Tabla/Clase, y Registro/instancias de esa clase.

Pero más adelante empezaremos a tener ciertas dificultades para que este mapping sea tan lineal.

Tablas

Objetos 





8

Tienen comportamiento.

Los objetos encapsulan información para favorecer la abstracción del observador. Puedo generar interfaces.







controles de integridad o pequeñas validaciones (constraints o triggers). Una tabla no tiene esa habilidad. En el álgebra relacional la interfaz no se convierte en ningunaentidad





9

Los Procedimientos Almacenados no están asociados a una tabla, por lo que si toco un campo y necesito al menos recompilar todos los Procedimientos Almacenados asociados. La herencia es una relación estática que se da entre clases, que favorece agrupar comportamiento y atributos en común, pero en la implementación física las tablas no tienen el concepto de herencia.

 







10

En el álgebra relacional no hay polimorfismo ni vinculación dinámica. Al realizar una consulta sobre una tabla, necesito saber de qué tabla se trata. A todo esto es lo que se conoce como “Impedance mismatch” : las dificultades de traducción entre los dos mundos. Estamos usando la base de datos relacional sólo como repositorio para almacenar los datos de los objetos. El comportamiento sigue estando en los objetos cuando se instancian. Por ese motivo tenemos la posibilidad de adaptar el modelo relacional al de objetos

  





11

Hace algunos años teníamos que hacer manualmente ese mapeo objetos-relacional. Para persistir un objeto había que hacer un INSERT o un UPDATE Cuando queríamos recuperar un objeto había que hacer un SELECT de la tabla de clientes, y a partir de ahí por cada registro teníamos que construir el objeto. Hoy tenemos varios frameworks que manejan el mapeo Objetos-Relacional (OR/M Object Relational Mapping): Hibernate, OJB, JDO, LINQ, etc, que se han transformado en estándares de facto. La existencia de estos frameworks facilitaron la aceptación por parte del mercado de lo que tenemos hoy en día: reglas de negocio implementadas en una tecnología orientada a objetos + un framework de persistencia OO contra una base de datos relacional.







12

Supongamos que un Pedido tiene una fecha de pedido. Creamos la entidad Pedido:

En el modelo relacional necesitamos una clave que identifique unívocamente a cada registro de la tabla Pedido. Estamos hablando del mismo registro si tienen el mismo PEDIDO_ID. En POO manejamos el concepto de identidad: Cuando yo referencio a un objeto no necesito identificarlo Hablamos del mismo objeto si objeto1 == objeto2.





13

Tenemos que manejar la relación Pedidos-ItemsProductos.

Como hay una relación de 1 a muchos la clave principal de ITEM se compone del Identificador del Pedido (FK) y el del Identificador del Item.



14

Otra opción es definir al ítem como autoincremental

 

15

Vamos a ver la entidad Producto. El modelo lógico equivalente a la clase Producto con sus subclases sería:



1.

16

Al implementar físicamente este modelo podemos elegir 3 opciones: Implementar una tabla por cada clase:

2.

17

Implementar una tabla por subclase:

3.

18

Implementar una única tabla:

Solución 1 tabla

 

1 tabla por cada clase (n + 1)



 

1 tabla por subclase (n)





19

A favor Facilidad/Performance Evito generar muchas tablas

 

Es el modelo “ideal” según  las reglas de normalización  No necesito saber en qué tabla está la información. Permite establecer campos no nulos para cada subclase Permite establecer  campos no nulos para cada subclase No requiere tener un campo discriminador (TIPO_PEDIDO)

En contra Campos no utilizados Tentación de “reutilizar” atributos para cosas distintas Es la opción que más entidades requiere crear Requieren hacer LEFT JOIN contra todas las tablas que representan las subclases

Cada subclase repite atributos “heredados” de la superclase

Solución 1 tabla

  

1 tabla por cada clase (n + 1) 1 tabla por  subclase (n)  

20

Cuándo conviene Cuando las subclases comparten muchos atributos en común. Cuando se necesita simplificar las consultas. Cuando hay muchos atributos comunes entre las subclases pero también muchos atributos propios en cada subclase. Es la técnica utilizada para las entidades independientes. Cuando las subclases comparten muy pocos atributos entre sí Cuando no me interesa trabajar con consultas polimórficas (trabajo en forma independiente cada subclase)

Relaciones muchos a muchos 



21

Ejemplo 1: “Un proveedor vende muchos productos y un producto es vendido por muchos proveedores”. ¿Cómo lo modelo en objetos? Son colecciones desde los objetos raíces (proveedor y producto respectivamente).









22

El grafo de objetos puede navegarse en cualquier sentido porque todos los objetos están en memoria.

Tengo un cliente, le pido el total y el cliente tiene acceso a sus pedidos. Para conocer el importe total, cada pedido tiene acceso a sus ítems, y cada ítem conoce su cantidad y tiene una referencia al producto. Si el Pedido tiene Items y cada Item tiene Producto, por un lado es cómodo traer toda la estructura del objeto Pedido para poder navegarlo libremente. Por otro lado, quizás arme toda una estructura sólo para averiguar la fecha de un pedido.

1. Obtengo sólo el pedido. Queremos conocer todos los pedidos de un cliente:

SELECT * FROM PEDIDO WHERE CLIENTE_ID = 122 Esto se transforma en un objeto Pedido:

23

2. Obtengo el pedido y todas las relaciones asociadas: Ahora tenemos que recuperar los pedidos del cliente:

SELECT * FROM PEDIDO WHERE CLIENTE_ID = 122 Pero también tenemos que generar los ítems y los productos. Por cada ID_PEDIDO obtenido en la consulta anterior hacemos: SELECT * FROM ITEM i INNER JOIN PRODUCTO p ON p.ID_PRODUCTO = i.ID_PRODUCTO WHERE i.ID_PEDIDO = ?

24

Con esto generamos:

25







26

¿Me conviene (1) o (2)?

En general los frameworks que hacen mapeo O/R ofrecen la posibilidad de definir hasta dónde voy a convertir. Lazy association: una asociación lazy, es aquella donde voy a traer la información bajo demanda (“sólo cuando lo necesite”).



Una vez adoptada la decisión de trabajar con bases relacionales, la pregunta es qué hacer primero:

a) Generamos el modelo relacional y luego adaptamos el modelo de objetos en base a las tablas generadas b) b) Generamos el modelo de objetos y en base a éste se crean las tablas.  La opción a) supone que es más importante la forma en que guardo los datos que las reglas de negocio que modifican esos datos.  En la opción b) el desarrollo con objetos no se ve ensuciado por restricciones propias de otra tecnología. a)

27