Bases de datos orientadas a objetos
Unidad No. 7
Visión General
Una base de datos es una colección de datos que puede constituirse de forma que sus contenidos
puedan permitirse el encapsular, tramitarse y renovarse sencillamente,
elementos de datos, sus características, atributos y el código que
opera sobre ellos en elementos complejos llamados objetos.
Las base de datos están constituida por objetos,
que pueden ser de muy diversos tipos, y sobre los cuales se encuentran
definidas unas operaciones donde
interactúan y se integran con las de un lenguaje de programación orientado a objetos,
es decir, que los componentes de la base de datos son objetos de los lenguajes
de programación además que este tipo de base de datos están diseñadas para
trabajar con lenguajes orientados a objetos también manipulan datos complejos
de forma rápida y segura.
¿Con que fin se crearon este tipo de bases de datos?
Las bases de datos orientadas a objetos se crearon para tratar de
satisfacer las necesidades de estas nuevas aplicaciones. La orientación a
objetos ofrece flexibilidad para manejar algunos de estos requisitos y no
esta limitada por los tipos de datos y
los lenguajes de consulta de los sistemas de bases de datos tradicionales
.
Tipos de datos complejos
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.
Objetos de gran tamaño
Muchas aplicaciones actuales de bases de datos necesitan almacenar
atributos grandes tales como la fotografía de una persona, o muy
grandes que incluso pueden llegar a los Gbytes, proporciona por
tanto nuevos tipos de datos para objetos de gran tamaño para datos de
caracteres (clob) y binarios (blob)
Tipos estructurados
Los tipos estructurados permiten la representación directa de
atributos compuestos de los diagramas E-R. Un tipo estructurado puede
tener métodos definidos sobre él. Los métodos se declaran como parte de la
dentición de tipos de un tipo estructurado.
Constructores
Cada tipo estructurado tiene un constructor sin argumentos, que
establece los atributos a sus valores predefinidos. Cualquiera otra función
constructora tiene que crearse explícitamente. Puede haber más de una
constructora para el mismo tipo estructurado
Herencia en SQL
Los esquemas de las bases de datos orientadas a objetos suelen
necesitar gran número de clases. Frecuentemente, sin embargo, varias de las
clases son parecidas entre si. Son parecidas porque definen iguales
atributos y métodos. No son idénticas porque cada clase define, además,
atributos y/o métodos que no comparte con las demás.
Por esa razón es conveniente definir una representación de los
atributos y métodos comunes en un solo lugar. Esto puede hacerse creando una
nueva clase, que contendrá solo las características comunes, y redefiniendo las
clases originales como especializaciones de la nueva clase.
En el ejemplo de código siguiente, “Vehicle” se define como la clase raíz y se han implementado los pasos anteriores para describir la jerarquía para LINQ. En la ilustración siguiente se muestran las relaciones.
Herencia en tablas
La herencia de tablas permite al programador
crear tablas de base de datos que heredan de otras tablas de la misma forma que
las clases pueden heredar de otras clases en los lenguajes orientados a
objetos. La herencia de tablas es una forma sencilla de que dos o más tablas
compartan información en una única tabla padre.
Este diagrama expresa de manera grafica que significa la herencia
en tablas.
Tipos de arreglo multiconjunto en SQL
El tipo
de datos MULTISET es una colección de datos parecido al tipo existente ARRAY
pero sin un orden implícito.
Un
multiconjunto es una colección de elementos del mismo tipo, sin orden y
permitiendo la existencia de elementos repetidos. El tipo de elemento puede ser
cualquier otro tipo de SQL.
Por
ejemplo, INTEGER MULTISET indica el tipo de un valor del multiconjunto cuyo
tipo de elemento es INTEGER.
El tipo
de elemento también podría ser otro tipo de colección, que permitiera
colecciones anidadas. Un multiconjunto es una colección ilimitada, sin
cardinalidad máxima definida. Esto no significa, sin embargo, que el usuario
puede insertar elementos en un multiconjunto sin límite, solamente que el
estándar no indica que debería haber un límite.
Esto es
análogo a las tablas, que no tienen declarado un número máximo de filas. Los
valores de un tipo MULTISET pueden crearse enumerando sus elementos o mediante una
sentencia ; por ejemplo, MULTISET[1, 2, 3, 4] o
MULTISET(SELECT
nivel FROM cursos).
El tipo
MULTISET tiene operaciones para convertir un multiconjunto en un array o en
otro multiconjunto cuyos elementos sean de un tipo compatible, para eliminar
duplicados del multiconjunto, para devolver el número de elementos de un
multiconjunto dado, y para volver el elemento de un multiconjunto que sólo
tiene un elemento.
Además,
también soporta la unión, intersección y diferencia entre multiconjuntos, así
como tres nuevas funciones de agregación para crear un multiconjunto del valor
del argumento en cada fila de un grupo (COLLECT), para crear la unión de
multiconjuntos del valor del multiconjunto de cada fila de un grupo (FUSION) y
para crear la intersección de multiconjuntos del valor del multiconjunto de
cada fila de un grupo
MULTISET UNION
El operador multiset UNION nos devuelve los valores de ambas
tablas anidadas en una única tabla anidada.
select num
multiset union num_tab_typ(1) num from num_tab;
select num
multiset union num a from num_tab;
Se
puede incluir la clausula DISTINCT para que la unión devuelva valores no
repetidos
select num
multiset union distinct num_tab_typ(1) num fromnum_tab;
MULTISET INTERSECT
El operador multiset INTERSECT nos devuelve valores comunes
de dos tablas anidadas.
Usando una tabla anidada con el valor 1 puede devolver el
conjunto vacío si el 1 no existe, y una tabla anidada con el valor si si que
existe.
select num
multiset intersect num_tab_typ(1) num from num_tab;
MULTISET EXCEPT
El operador multiset EXCEPT nos devuelve valores de una
tabla anidada que no existan en otra tabla anidada. Por ejemplo la siguiente
consulta devuelve una tabla anidada con los valores originales excepto el valor
1
select num
multiset except num_tab_typ(1) num from num_tab;
select num_tab_typ(1,1,2,3) MULTISET EXCEPT num_tab_typ(1,2) fromdual;
Identidad de los objetos y tipos de referencia en SQL
Los lenguajes orientados a objetos ofrecen la posibilidad de hacer referencia a objetos. Los atributos de un tipo dado pueden servir de referencia para los objetos de un tipo concreto. Por ejemplo, en SQL se puede definir el tipo Departamento con el campo nombre y el campo director, que es una referencia al tipo Persona, y la tabla departamentos del tipo Departamento, de la manera siguiente:
create type Departamento(
nombre varchar(20),
director ref(Persona) scope personas)
create table departamentos of Departamento
En este caso, la referencia está restringida a las tuplas de la tabla personas. La restricción del ámbito de referencia a las tuplas de una tabla es obligatoria en SQL, y hace que las referencias se comporten como las claves externas
La tabla a la que hace referencia debe tener un atributo que
guarde el identificador para cada tupla. Ese atributo, denominado atributo
autorreferenciable (self-referential attribute), se declara añadiendo una
cláusula ref is a la instrucción create table:
create table personas of Persona
ref is id_persona system generated
En este caso, id_persona es el nombre del atributo, no una palabra clave, y la instrucción system generated especifica que la base de datos genera de manera automática el identificador.
Para inicializar el atributo de referencia hay que obtener el identificador de la tupla a la que se va a hacer referencia. Se puede conseguir el valor del identificador de la tupla mediante una consulta. Por tanto, para crear una tupla con el valor de referencia, primero se puede crear la tupla con una referencia nula y luego definir la referencia de manera independiente:
insert into departamentos
values (‘CS’, null)
update departamentos set director =
(select p.id_persona
from persona as p
where nombre = ‘Martín’)
where nombre = ‘CS’
Implementación de las características O-R
Los sistemas de bases de datos relacionales orientadas a objetos son básicamente extensiones de los sistemas de bases de datos relacionales ya existentes. Las modificaciones resultan claramente necesarias en muchos niveles del sistema de base de datos.
Las interfaces de programas de aplicación como ODBC y JDBC se han extendido para recuperar y almacenar tipos estructurados; por ejemplo, JDBC ofrece el método getObject() que devuelve un objeto Java Struct, a partir del cual se pueden extraer los componentes del tipo estructurado. También es posible asociar clases de Java con tipos estructurados de SQL, y JDCB puede realizar conversiones entre los tipos.

