Está en la página 1de 17

MMaappeeoo

OObbjjeettooss//RReellaa
cciioonnaall

Tcnicas Avanzadas de Programacin Mapeo Objetos Relacional

Mapeo Objetos Relacional


Si tenemos un modelo de objetos como el siguiente

por SSeeppttiieemmbbrree
Fernando
Dodino
VVeerrssiinn
2

22000077
11..00

Tcnicas Avanzadas de Programacin Mapeo Objetos Relacional

Originalmente podemos establecer una equivalencia entre el concepto de


Tabla/Clase, y Registro/instancias de esa clase. Pero ms adelante
empezaremos a tener ciertas dificultades para que este mapping sea tan
lineal.

Objetos
Datos
Comportamiento

RDBMS

Los objetos tienen comportamiento, las tablas slo permiten habilitar


ciertos controles de integridad (constraints) o pequeas validaciones antes
o despus de una actualizacin (triggers). Los stored procedures no estn
asociados a una tabla, lo que genera el mismo problema que en la
programacin estructurada: toco un campo y necesito al menos recompilar
todos los stored procedures asociados. Cada actualizacin impacta en los
datos por un lado y en los programas que actualizan los datos
Qu tipo de(Find/Replace
estructura siguen
los objetos en memoria?
masivo).
Los objetos encapsulan informacin,
Un grafo dirigido
no para protegerse (siempre puedo
hackearlo), sino para favorecer la abstraccin del observador. Una tabla no
tiene esa habilidad: si tengo una entidad con un atributo ACTIVO que es
VARCHAR2(1), tengo que entrar al constraint
check o bien tirar un SELECT
Pedido
para saber si el ACTIVO es 1 0, S N, e inferir en el mejor de los
casos qu significan los valores de tems
ese campo. Puedo documentarlo en un
diccionario de datos, algo que est ajeno a la base que estoy tocando y que
Item
necesita una sincronizacin propia de gente pulcra y obsesiva.
Prod.Conserv
En objetos puedo generar interfaces, que permiten establecer un contrato
producto

entre dos partes, quien publica un determinado servicio y quien usa ese
cantidad
servicio. En el lgebra relacional la interfaz no se convierte en ninguna
3
entidad, con lo cual hay que contar con ciertos trucos para generar objetos
que slo encapsulan comportamiento (como los strategies stateless):
Item
Prod.Fabr.
producto
cantidad

3 pregunta
Estos
memoria
La
permita
- oobjetos

La
agrupar
objeto
las
tengo
puedo
es
recuperarlos
herencia
limitada
cuales
es:
supertipos
utilizar
viven
recibo
comportamiento
este
-Mmm...
heredo.
esen
yPuedo
grafo
el
la
una
necesito
una
elda
ydefinicin
claramente
relacin
ambiente
conservar
subtipos,
En
base
que
deel
ypoder
acabamos
maana
de
Entonces
estructura
Anotamos
atributos
modelo
esttica
datos
ypropia
la
son
pero
todos
almacenar
(concepto
misma
informacin.
lgico
de
distintas
relacional
en
tengo
en
en
de
basada
somos
dibujar
que
el
la
estructura
comn.
la
de
pizarrn
distintas
los
implementacin
se
que
clase
felices.
un
en
formas
da
objetos
encaja
como
llamaremos
Diagrama
Cuando
el
entre
y similitudes
lgebra
en
de
repositorio
opciones:
de
Eluna
en
justo
yo
todas
clases,
relacionar
tema
Entidad/Relacin
un
instancio
fsica
base
persistencia).
relacional?
medio
en
las
esque
yde
una
de
que
superclases
las
diferencias
objetos,
que
entidades.
favorece
un
la
tablas
me yono
de

Tcnicas Avanzadas de Programacin Mapeo Objetos Relacional

tienen el concepto de herencia. Entonces tengo que hacer las adaptaciones


correspondientes (como veremos ms adelante).
Al no existir el comportamiento en las tablas y no estar presente el
concepto de interfaz no hay polimorfismo en el lgebra relacional: yo
puedo recibir un objeto sin saber exactamente de qu clase es, y a m no
me interesa averiguarlo, slo me concentro en lo que le puedo pedir y en
su contrato. Al tirar un query sobre una tabla, necesito saber de qu tabla
se trata (claro, al menos en los queries tradicionales, que no acceden a los
metadatos).
Esto es lo que se conoce como Impedance mismatch las dificultades de
traslacin de los dos mundos.

De todas maneras, estamos usando la base de datos relacional slo 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
Algunas otras cosas a tener en cuenta:
Cmo manipulo los datos en una base relacional? A travs de un lenguaje
declarativo, el SQL donde digo qu quiero. Y muchas veces nos vamos a
encontrar en la disyuntiva de algo muy fcil de hacer con un query/stored
procedure vs. tener que armar una regla de negocio en objetos que
implique muchas ms lneas de cdigo.
El tema es que muchas veces no puedo zafar de tener:

4
Sinpierdo
contarcontrol
los stored
cuando
procedures
hay un
Esocambio:

que
tiene
estoy
encapsulamiento
podra
muchas
esmezclando
difcil
desarrollar
contras:
as
tecnologas
conservar
desde
Mundo
Reglas
Desde
SQL
la
manuales
objetos
el
base
de negocio
detiro
datos.
etc.
RDBMS
queries
Presentacin

Tcnicas Avanzadas de Programacin Mapeo Objetos Relacional

Bueno, hace 10 aos tenamos que manejar nosotros ese mapeo objetosrelacional. Era una tarea bastante tediosa:
Cada vez que quera persistir un objeto haba que armar un query de INSERT de
cada uno de los campos, o de UPDATE de todos los campos
Lo mismo cuando queramos recuperar los clientes que comenzaran con Q,
hacamos un SELECT de la tabla de clientes, y a partir de ah por cada registro
tenamos que hacer un
registrosRecuperadosDeLaBase do: [ :registro |
cliente := Cliente new.
Cliente nombre: (lo que estuviera en el campo nombre del registro actual)

clientes add: cliente.


]
El tiempo fue pasando y hoy tenemos varios frameworks que manejan el mapeo
Objetos-Relacional (OR/M Object Relational Mapping): Hibernate, OJB, JDO, se
transformaron en estndares de facto.
La existencia de estos frameworks facilitaron la aceptacin por parte del mercado
de lo que tenemos hoy en da: reglas de negocio implementadas en una tecnologa
orientada a objetos + un framework de persistencia OO contra una base de datos
relacional. No obstante, vale la aclaracin de muchas otras configuraciones
posibles, que van desde adaptar el modelo de objetos a una base jerrquica, o la
de mantener la homogeneidad del modelo teniendo una base de objetos que sea
la encargada de persistir los objetos en un medio fsico en forma transparente
para el desarrollador.
Pero eso en todo caso es harina de otro costal, vamos a volver sobre el ejemplo
de los pedidos, y generaremos el modelo fsico relacional asociado al diagrama de
clases de la pgina 1.
Supongamos que Pedido tiene una fecha de pedido.
Creamos la entidad Pedido:
Modelo relacional: Tabla
ModeloPedido
de objetos: Clase Pedido
PEDIDO
PEDIDO_ID
FECHA_PEDIDO

5hagamos
Fjense
(en
Qu
que
identificador.
mensaje
Un
una
detalle
la
tabla
es
pasa
cajita
l
qu
a un
en
se
el
ypara
diferencia
ningn
query
objetos?
PEDIDO:
Estamos
de
objeto,
Cuando
comentar:
abajo),
quede
otro
PEDIDO_ID,
hablando
Manejamos
yo
no
tenemos
objeto,
ms
necesitamos
referencio
necesito
fjense
referencia
explcita
del
vs.
cada
Hablamos
FECHA_PEDIDO.
el
entonces
que
identificarlo
mismo
la
concepto
aregistro
una
clase
aparece
un
alal.
del
registro
clave
objeto,
no
informacin
de
Pedido.
Si
es
mismo
de
varias
Esto
identidad:
que
no
necesario
porque
la
se
si
lo
objeto
permite
identifique
tabla
Adems
que
tienen
veces
conozco
que
alguien
letrabajar
estamos
si
Pedido.
cada
que
del
al
estoy
el
objeto1
no
definir
mismo
objeto
cuando
comportamiento
unvocamente
me
le
enviando
recuperando:
pas
con
puedo
==
PEDIDO_ID.
sabe
columnas
un
la
objeto2.
pedir
una de
cosas.

Tcnicas Avanzadas de Programacin Mapeo Objetos Relacional

SELECT p.FECHA_PEDIDO
FROM PEDIDO p
WHERE
En cambio, en un objeto Pedido, no repetimos en el atributo el nombre de la clase,
porque est claro dnde estamos: en la clase Cliente tenemos un atributo nombre,
y no nombreCliente1.
Claro, faltan algunas otras cosas al modelo, tenemos que manejar la relacin
Pedidos-Items-Productos. Fjense las diferencias:
Modelo relacional:
PEDIDO
ITEM
PEDIDO_ID
FECHA_PEDIDO

PEDIDO_ID (FK)
ITEM_ID
CANTIDAD

Fjense que como el Pedido es la tabla madre y los tems son hijos, la clave
principal de ITEM se compone del Identificador del Pedido y el del Item.
Esto implica que si tengo el Pedido 1 con 2 tems y el Pedido 2 con 2 tems, la
tabla Item tendra la siguiente informacin:
Pedido_Id Item_Id Cantidad
1 1
1 2
2 1
2 2
La otra opcin es definir al tem como autoincremental (la relacin es nonidentifying):
PEDIDO
PEDIDO_ID
FECHA_PEDIDO

ITEM
ITEM_ID
PEDIDO_ID (FK)
CANTIDAD

El mismo ejemplo de antes tendra los siguientes datos:


Item_Id Pedido_Id Cantidad
1 1
Estas son nomenclaturas
estndares de trabajo en cada
Es6de
dependan
Qu
Muchas
ms
asegurndome
molesto
asegurar
pedido
cmodo
veces
de
definir
cuando
soy?
una
que
en
por
secuencia
la
Objetos
El
un
la
tengo
Base
2,
campo
misma
ah,
de
ms
semanejada
donde
entonces
Base
Datos
prefiere
de1
Pedido:
el
tecnologa
una
que
tenga
Pedido
sepor
Virtual
tengo
no
encargue
trabajar
que
la
se
2. base
que
repiten
generar
Machine/Ambiente
432 de
con
21averiguar
de

generar
claves
datos.
(cosa
IDs incrementales
mi
ITEM_IDs
mucho
autoincrementales,
Por
ltimo
dando
qu?
mspor
Item_Id
compleja
vueltas).
Porque
segn
tabla,
es
para
elque

Tcnicas Avanzadas de Programacin Mapeo Objetos Relacional

Cmo juega el ID dentro del objeto Pedido e Item? Bueno, quizs s tenga un
atributo Id en Pedido e Item pero si yo trabajo en objetos no quiero que el que
use a ese objeto est preguntando por el Id. Depende del contexto, el id puede
ser un atributo privado que no tenga getter hacia fuera.
Modelo de objetos:

Ahora nos detenemos un poco para armar la entidad Producto.


Armemos primero el modelo lgico equivalente a la clase Producto con sus
subclases:
PRODUCTO

ITEM

PEDIDO

ITEM_ID

PEDIDO_ID
FECHA_PEDIDO

PRODUCTO_ID

NOMBRE
PEDIDO_ID (FK)
VALOR
CANTIDAD
PESO
PRODUCTO_ID (FK)
TIPO_PRODUCTO
TIPO_PRODUCTO

CONSERVADO
PRODUCTO_ID (FK)
DIAS_CONSERVACION
PRECIO_COMPRA

COMPRADO

FABRICADO
PRODUCTO_ID (FK)
PRODUCTO_ID (FK)
PRECIO_COMPRA
CANTIDAD_HORAS_HOMBRE

Qu pasa con las variables de clase?


7 diferencia.
Bueno,
mucha
Puedo
armar
entre una
el modelo
tabla
Ahorade
lgico
bien,
parmetros
relacional
alImplementar
hardcodearlos
elegir
implementar
con3 valores
yopciones:
eluna
fsicamente
modelo
entabla
para
la aplicacin.
de
no
por
objetos
tener
este
cada modelo
que
clase:
parecepodemos
no haber

Tcnicas Avanzadas de Programacin Mapeo Objetos Relacional

PRODUCTO

ITEM

PEDIDO

ITEM_ID

PEDIDO_ID

PRODUCTO_ID

NOMBRE
PEDIDO_ID (FK)
VALOR
CANTIDAD
PESO
PRODUCTO_ID (FK)
TIPO_PRODUCTO

FECHA_PEDIDO

CONSERVADO

COMPRADO

PRODUCTO_ID (FK)
DIAS_CONSERVACION
PRECIO_COMPRA

FABRICADO
PRODUCTO_ID (FK)
PRODUCTO_ID (FK)
PRECIO_COMPRA
CANTIDAD_HORAS_HOMBRE

Implementar una tabla por subclase:


ITEM
PEDIDO
PEDIDO_ID
FECHA_PEDIDO

CONSERVADO

ITEM_ID

CONSERVADO_ID

PEDIDO_ID (FK) DIAS_CONSERVACION


CANTIDAD
PRECIO_COMPRA
CONSERVADO_ID (FK)
NOMBRE
COMPRADO_ID (FK)
VALOR
FABRICADO_ID (FK)
PESO

COMPRADO

FABRICADO

FABRICADO_ID
COMPRADO_ID
CANTIDAD_HORAS_HOMBRE
PRECIO_COMPRA
NOMBRE
NOMBRE
VALOR
VALOR
PESO
PESO

O implementar una nica tabla:


PEDIDO

ITEM
ITEM_ID

PRODUCTO
PRODUCTO_ID

PEDIDO_ID
Cundo
Supongamos
Querys
conviene
que
polimrficos:
Opcional:
PRECIO_COMPRA
cada
tenemos
opcin:
Conservado
podemos
este
qu
comn
modelo
dejar
significa
y el
para
relacional:
Comprado
el
el
atributo
esto? NOMBRE
FECHA_PEDIDO
PEDIDO_ID
PRODUCTO_ID
CANTIDAD
CANTIDAD_HORAS_HOMBRE
PRECIO_COMPRA__529
DIAS_CONSERVACION
(FK)
(FK)
TIPO_PRODUCTO
PRECIO_COMPRA
VALOR
PESO

También podría gustarte