Base de datos objeto-relacional
# Base de datos objeto-relacional

La base de datos objeto-relacional es una extensión de la base de datos relacional tradicional, a la cual se le proporcionan características de la programación orientada a objetos (POO).

Los ejemplos mostrados están en base al estándar SQL99.

## Relaciones anidadas

Nacen como una extensión del modelo relacional, en el que los dominios de dicha base de datos ya no son sólo atómicos, por lo que no se cumple la 1FN, debido a que las tuplas también pueden ser una relación, que llevará a la creación de una relación de relaciones. De este modo, se genera la posibilidad de guardar objetos más complejos en una sola tabla con referencias a otras relaciones, con lo que se acerca más al paradigma de POO.

## Datos complejos

* Tipos: dentro de lo que llamamos tipos de datos complejos podemos definir los siguientes:
* Colecciones: también conocidos como conjuntos, este tipo de datos clasifican los arrays y los conjuntos en que los elementos pueden aparecer varias veces.
* Tipos estructurados: permiten representación directa de los atributos compuestos en los diagramas entidad-relación (DER).
* Objetos de gran tamaño: desde hace varios años que se necesita almacenar datos con atributos muy grandes (varios megabytes), como libros, canciones, etcétera, e incluso aún más grandes; como mapas de alta resolución, video u otros que pueden llegar fácilmente a los gigabytes.

## Herencia

La herencia puede hallarse en el nivel de los tipos o en el nivel de las tablas.

### Herencia de tipos

Los tipos derivados heredan los atributos de superclase; los métodos también se heredan por sus subtipos, al igual que los atributos. Sin embargo, un subtipo puede redefinir el efecto de un método declarándolo de nuevo, y esto será lo que se conoce como sobre-escritura (overriding) del método.

**Ejemplo**


    CREATE TYPE Persona (nombre VARCHAR(20), direccion VARCHAR(20))

Con esto se necesita definir varios tipos de personas:

    CREATE TYPE Estudiante UNDER Persona (curso VARCHAR(20), departamento VARCHAR(20));
    CREATE TYPE Profesor UNDER Persona (sueldo INTEGER, departamento VARCHAR(20)) ;

### Herencia de tablas

Cada tabla almacena la clave primaria, que se puede heredar de una tabla padre; y los atributos definidos localmente. Los atributos heredados, aparte de la clave primaria, no será necesario guardarlos, podrán obtenerse mediante una reunión con la super tabla basada en la clave primaria. Por lo que cada tabla almacena todos los atributos heredados y definidos localmente.

Cuando se inserta una tupla, se almacena sólo en la subtabla en la que se inserta y su presencia se infiere en cada supertabla. El acceso a todos los atributos de una tupla es más rápido, dado que no se requiere una reunión:

**Ejemplo**


    CREATE TABLE estudiantes OF Estudiante UNDER persona;

## Funciones

Dentro de la base de datos se pueden definir métodos y procedimientos, como Java, C++, etc.

Algunos sistemas de base de datos ofrecen sus propios lenguajes, como es el caso de PostgreSQL, que integra el lenguaje PL/PgSQL.

### Ejemplo

Esta función se ocupa del siguiente modo:

    SELECT nombres FROM usuario WHERE contar_hijos (Rut) > 0;

También se permite el polimorfismo, que quiere decir que pueden existir métodos con el mismo nombre, pero con distinta cantidad de argumentos.

