# Adaptación de impedancias objeto-relacional

La Adaptación de impedancias objeto-relacional (object-relational impedance mismatch en inglés) es una serie de problemas conceptuales y técnicos que se presentan a menudo al trabajar con sistemas gestores de bases de datos relacionales desde servidores de aplicaciones desarrollados en lenguajes orientados a objetos. Los problemas se centran, principalmente, en el mapeo de definiciones de objetos o clases en tablas de una base de datos definida según un esquema relacional.
El término proviene del concepto de ingeniería eléctrica Adaptación de impedancias.

## Problemas

El problema base es que mientras que las instancias de objetos se referencian unas a otras formando un grafo (en el sentido matemático, con bucles y ciclos), los esquemas relacionales son tablas basadas en álgebra relacional que se enlazan con otras tuplas heterogéneas agrupando sus campos en filas con distintos tipos de datos.

### Problemas relacionados con conceptos de la orientación a objetos
#### Encapsulación

Los programas orientados a objeto facilitan un diseño detallado con técnicas que permiten ocultar la representación interna de objetos (lo que se conoce como "encapsulación") En un entorno orientado a objetos los atributos internos de un objeto no se muestran exteriormente a ningún otro elemento, siendo sólo accesibles mediante la interfaz propia que implemente
Sin embargo, el mapeo objeto-relacional tiene que mostrar necesariamente el contenido interno de un objeto para interactuar con otros elementos. De este modo el mapeo suele violar el principio de encapsulación del objeto al hacer públicos de manera automática campos de éste en forma de columnas de la base de datos.

#### Accesibilidad

El control de acceso a los datos de un objeto (privado, público, protegido, ...) está en la naturaleza de su modelo.
Sin embargo, en el modelo relacional el control es mucho más difuso.

#### Interfaces, clases, herencia y polimorfismo

En el paradigma orientado a objetos los objetos definen interfaces que son la única forma de acceder a su elementos internos. Sin embargo, en el modelo relacional esto el acceso se controla mediante vistas (views) que dan distinta perspectiva y restricciones.
Lo mismo sucede con otros conceptos claves en el modelo orientado a objetos como pueden ser las clases de objetos, herencia y polimorfismo, no considerados en sistemas relacionales de bases de datos.

#### Mapeo a conceptos relacionales

Un mapeo adecuado entre conceptos relacional y orientado a objetos requeriría establecer relaciones entre tablas de la base de datos y asociaciones del análisis orientado a objetos.

### Diferencias en tipos de datos

Pueden existir muchas diferencias entre los tipos de datos en un lenguaje orientado a objetos y un modelo relacional de bases de datos. Este segundo prohíbe el uso de atributos que sean referencias (punteros), mientras que en OO es muy común. Otro aspecto es la semática de las operaciones en cada tipo y entre tipos. Además estos problemas se presentan con más profundidad en tipos de datos más complejos.

### Diferencias en estructura e integridad

En los lenguajes OO, los objetos se componen de otros objetos en varias capas, mientras que en el modelo relacional se lo representa con nombres de variables no anidadas.
A veces las restricciones de un lenguaje OO no tienen fácil representación en el modelo relacional, pero es que además a veces se declaran implícitamente con el uso de excepciones en el código que manipula los datos internos.

### Diferencias en la manipulación

La manipulación presenta diferencias semánticas. El modelo relacional define pocos operadores muy rigurosos (matemáticos) para hacer consultas, mientras que los lenguajes OO tienen operadores de consulta más complejos y personalizados en cada lenguaje.

### Diferencias en las transacciones

El manejo de transacciones y concurrencia también suele presentar diferencias entre las dos aproximaciones.

## Alternativas

Existen varias alternativas a los problemas anteriores

### Uso de una arquitectura alternativa

La mayoría de estos problemas derivan del mapeo de elementos del modelo de objetos a tuplas de relaciones de bases de datos, por lo que el uso de otros sistemas de gestión de bases de datos como los NoSQL o XML lo solucionarían

### Minimización de los problemas

Un solución habitual es que un framework modele en tiempo de ejecución aspectos que son estáticos en ambos modelos.
Limitaciones:
* No hay comprobación estática de tipos.
* Coste computacional (temporal y de memoria) de las operaciones.
* No se pueden usar determinados aspectos de la OO como el polimorfismo.

### Compensación

Existen frameworks que automatizan el tratamiento de datos mediante patrones implementados sobre técnicas de reflexión o programación automática
No obstante presentan anomalías, como la mezcla de propiedades del dominio (por ejemplo "número de teléfono") y del framework (por ejemplo "IsModified").