Bases de Datos Obxecto-Relacionais Introduccióncoba.dc.fi.udc.es/~bd/noauth/BDOR.pdf · Bases de...

26

Transcript of Bases de Datos Obxecto-Relacionais Introduccióncoba.dc.fi.udc.es/~bd/noauth/BDOR.pdf · Bases de...

Bases de Datos Obxecto-Relacionais

Miguel Rodríguez Penabad

Laboratorio de Bases de Datos

Universidade da Coruña

Introducción

Conocementos previos

I Sobre Programación/Deseño Orientado a ObxectosI Especializacións, Herencia, ...

Obxectivos - Contidos do tema

I Ver os motivos da aparición da Orientación a Obxectos en BDs.I Conocer as extensións de tipos en BDOR

I Tipos complexos, coleccións, referencias a obxectos

I Entender os mecanismos de herencia en BDORI Ver a evolución de SQL (DDL, DML)I Discusión: ventaxas e inconvenientes do modelo obxecto-relacional

Bases de Datos Obxecto-Relacionais 2 / 35

Orientación a Obxectos en BD - MotivaciónSituación actual

I Existen BDs e aplicacións �tradicionais�Ex: Aplicacións xestión (nóminas, etc.)

I Rexistros cortos, simples, de lonxitude �xaI Primeira forma normal

I Aparecen novas necesidades de informaciónMelloras no hardware, novas aplicacións e tipos de información

I CAD/CAM (Deseño/Manufactura)I Ferramentas CASE (Enxeñaría de Software)I OIS (O�ce Information System)I Sistemas MultimediaI GIS (Sistemas de Información Xeográ�ca)

Bases de Datos Obxecto-Relacionais 3 / 35

Orientación a Obxectos en BD - MotivaciónProblemas e solucións

I Orientación a Obxectos no desenvolvemento de softwareI Éxito da Programación OO, Deseño OO, UML, Proceso

Uni�cadoI As aplicacións usan obxectos

Non hai 1FN, hai referencias/punteiros a obxectos e colecciónsI Problema: Desaxuste de impedancias ó tratar de almacenar

obxectos en BD relacionaisNecesidade de tranducción, �aplanar� obxectos, ...

I Problemas en consultasI Formulación

Ex: Imaxes con círculosI Optimización

Ex: calcular polígonos que se solapan cun polígono concreto

Bases de Datos Obxecto-Relacionais 4 / 35

Orientación a Obxectos en BD - Plantexamentos (i)

Linguaxe de programaciónOrientado a Obxectos

PersistenciaBase de Datos

Orientada a Obxectos

Base de Datos RelacionalOrientacióna Obxectos

Base de DatosObxecto-Relacional

Bases de Datos Obxecto-Relacionais 5 / 35

Orientación a Obxectos en BD - Plantexamentos (ii)

BD Orientada a ObxectosLinguaxe de programaciónOrientado a Obxectos

PersistenciaBase de Datos

Orientada a Obxectos

I Proposto por ODMG (Object Data Management Group)

I Son Linguaxes de Programación Persistentes (Estándar en2000)

I ODL (Object De�nition Language)I OML (Object Manipulation Language)I OQL (Object Query Language)

I Evolución: OMG (Object Management Group)I ODMG Java binding evoluciona a JDO (Java Data Objects,

estándar sen �nalizar)

I Máis que unha BD é un conxunto de ferramentas para dotarde persistencia ás clases dunha aplicación

I Impacto relativamente baixo no mercado

Bases de Datos Obxecto-Relacionais 6 / 35

Orientación a Obxectos en BD - Plantexamentos (iii)

BD Obxecto-RelacionalBase de Datos Relacional

Orientacióna Obxectos

Base de DatosObxecto-Relacional

I Conservar un modelo compatible co Modelo RelacionalI Fundamento teórico moi sólidoI Máis de 35 anos de investigación

I Exténdese para incorporar características desexables da OO

I Adoptado por numerosos SXBD

Oracle, IBM DB2, Informix Dynamic Server, PostgreSQLI Extensión do SQL para incorporar as novas características

I Estándar SQL:1999, revisado en SQL:2003I Extensión de tipos, obxectos, herencia, ...I Incorpora outras novidades

I Consultas recursivas, SQL/XML, ...

Bases de Datos Obxecto-Relacionais 7 / 35

Bases de Datos Obxecto-Relacionais

I Evolución do SQL

I Tipos de datosI Prede�nidosI Constructores de tipoI Tipos de�nidos polo usuarioI Referencias

I Herencia

I Táboas de ObxectosI CreaciónI ConsultasI Vistas

Bases de Datos Obxecto-Relacionais 8 / 35

Evolución do SQL

I SEQUEL (Structured English QUEry Language).Desarrollado en IBM para SYSTEM R.

I SQL-86 ou SQL-1. ANSI e ISO en 1986. Revisado en 1989.

I SQL-92 ou SQL-2. 1992.

I SQL:1999 (inicialmente chamado SQL3 ou SQL-99)Introduce tipos de datos complexos, procedementosalmacenados, triggers, ...

I SQL:2003. Revisión do SQL:1999, maioritariamentecorreccións e SQL/XML.

Bases de Datos Obxecto-Relacionais 9 / 35

SQL:2003 - Tipos de datos prede�nidos

I Numéricos exactosSMALLINT, INTEGER, BIGINT, NUMERIC[(p[,s])], DECIMAL[(p[,s])]

I Numéricos aproximadosREAL, DOUBLE PRECISION, FLOAT[(P)]

I Cadeas de caracteresCHAR[ACTER][(n)], CHAR[ACTER] VARYING(n) ou VARCHAR(n),CHARACTER LARGE OBJECT[(tamaño)] ou CLOB[(tamaño)]

Opcionalmente NATIONAL para internazionalizaciónI Binarios

(En SQL:1999 había BIT, BIT VARYING(n), pero foron eliminados en SQL:2003)

BINARY LARGE OBJECT[(tamaño)] ou BLOB[(tamaño)]

I Datas e horasDATE, TIME [WITH TIME ZONE], TIMESTAMP [WITH TIME ZONE]

Tamén inclúe tipos para INTERVALos de tempoI Outros

Lóxicos: BOOLEAN, con valores TRUE, FALSE, UNKNOWNXML

Bases de Datos Obxecto-Relacionais 10 / 35

SQL:2003 - Tipos de datos prede�nidosExemplos

1 CREATE TABLE Libro(

2 id CHAR(5),

3 titulo NATIONAL CHARACTER VARYING(100),

4 resumen NCLOB(25K),

5 imaxe BLOB(2M),

6 prezo NUMERIC(6,2)

7 ...

8 );

9

10 CREATE TABLE ProgramaTV(

11 ...

12 edade_min SMALLINT,

13 hora_ini TIMESTAMP WITH TIME ZONE,

14 telebasura BOOLEAN,

15 ...

16 );

Bases de Datos Obxecto-Relacionais 11 / 35

SQL:2003 - Constructores de Tipos

I Filas (rows)I ColecciónsI Tipos distinctI Tipos complexosI Referencias

CREATE TABLE Empregado(

NSS CHAR(9) NOT NULL PRIMARY KEY,

Nome VARCHAR(59) NOT NULL,

Enderezo ROW( -- Fila

Rua VARCHAR(40),

Numero SMALLINT,

Poboacion VARCHAR(40)

),

Salario EUROS, --Distinct

Telefono VARCHAR(20) ARRAY[2], --Colección

Experiencia ROW(

Posto VARCHAR(30),

Anos SMALLINT

) MULTISET --Colección de filas

);

Bases de Datos Obxecto-Relacionais 12 / 35

SQL:2003 - Constructores de tiposTipos Fila

I Constructor: ROW(<def. campo1>, <def. campo2>, ...)

Enderezo ROW(

Rua VARCHAR(40),

Numero SMALLINT,

Poboacion VARCHAR(40))

I Acceso ó tipo ou ós compoñentes

UPDATE ... SET Enderezo=ROW('Real',3,'Lugo')

SELECT ... WHERE Enderezo.Rua='Real'

I Pode anidarse

e EnderezoEspana ROW(

Provincia VARCHAR(20),

EnderezoProv ROW(

Rua VARCHAR(40),

Numero SMALLINT,

Poboacion VARCHAR(40)

)

)

... e.Provincia='Lugo' and e.EnderezoProv.Poboacion='Viveiro'

Bases de Datos Obxecto-Relacionais 13 / 35

SQL:2003 - Constructores de tiposColeccións (i): Arrays

<tipo> ARRAY[(n)]

I Pérdese a 1a Forma Normal (con calquera tipo de colección)I Coleeción ordenada (referenciada polo índice), admite valores

duplicadosI Aplicable a calquera tipo excepto ARRAYI Constructor: ARRAY[<lista elementos>]

A CHAR(59) ARRAY, Telefonos VARCHAR(20) ARRAY(2)

... set A = ARRAY['papel','pluma']

... set Telefonos[2] = '666 123 456' --Telefonos[1]: NULL

... WHERE Telefonos[1] IS NULL

I OperaciónsI Número de elementos: CARDINALITY(A)I Concatenación:

ARRAY['papel','pluma'] || ARRAY['lápiz']I UNNEST

Bases de Datos Obxecto-Relacionais 14 / 35

SQL:2003 - Constructores de tiposColeccións (ii): Multisets

<tipo> MULTISET (multiconxunto, bolsa)

I Colección sen orden nin índice, admite valores duplicadosI Constructor: MULTISET[<lista valores>] ou

MULTISET(<sentencia select>)

ms1=MULTISET[ROW('secretaria',2), ROW('xefa',4)]

ms2=MULTISET(select campo1 from taboa1)

I OperaciónsI Número de elementos: CARDINALITY(ms1)I Transformación a conxunto: SET(ms2)I Predicados:

a MEMBER OF ms, ms1 SUBMULTISET OF ms2,ms1 IS A SET

I MULTISET UNION, MULTISET INTERSECTION,MULTISET EXCEPT,

I UNNESTI Funcións de agregado: COLLECT, FUSION, INTERSECTION

Bases de Datos Obxecto-Relacionais 15 / 35

SQL:2003 - Constructores de tiposExemplos de operacións sobre coleccións

EMPREnomemp coddep postos

Ana 10 MULTISET[programador, analista, xefe]David 10 MULTISET[analista]Pedro 20 MULTISET[programador, analista]

DEPTOcod nomdep

10 Compras10 Ventas

-- A/desde 1FN

SELECT nomemp, UNNEST postos

FROM Empre;

SELECT nomdep,

MULTISET (SELECT nomemp FROM Empre

WHERE coddep = cod)

FROM Depto;

-- Agregados

SELECT coddep, COLECT(nomemp)

FROM Empre

GROUP BY coddep;

SELECT COLLECT(nomemp),

FUSION(postos) AS TodosPostos,

INTERSECTION(postos) AS PostosComuns

FROM Empre;

Bases de Datos Obxecto-Relacionais 16 / 35

SQL:2003 - Tipos de�nidos polo usuario

I Esquema básico

CREATE TYPE <nome tipo>

AS <definición tipo>

<restriccións de instanciación / subclase>

I <nome tipo> é o identi�cador (único no esquema)I <definición tipo> especi�ca o tipo

I Tipos distinctI Tipos estructurados

I <restriccións de instanciación / subclase>

I [NOT] INSTANTIABLE: Especi�ca se haberá �valores� desetipo (atributos, �las, ...)

I [NOT] FINAL: Especi�ca se podemos especializar o tipo (crearsubtipos)

NOT FINAL obrigatorio para tipos estructurados (permiteespecialización)FINAL obrigatorio para tipos distinct (non a permite)

Bases de Datos Obxecto-Relacionais 17 / 35

SQL:2003 - Tipos DISTINCTI Rede�nen tipos prede�nidos

I Normalmente para evitar inconsistencias semánticasI Podemos realizar conversións (casts)

I Son tipo FINAL (non poden de�nirse outros tipos sobre eles)

1 CREATE TABLE EMPREGADO(

2 NSS char(9),

3 Sal DECIMAL(7,2), --En EUROS

4 Com DECIMAL(7,2), --En DOLARES

5 ....

6 );

¾Que obtemos con esta consulta?

1 SELECT Sal+Com as SalTotal

2 FROM EMPREGADO;

1 CREATE TYPE EUROS AS DECIMAL(7,2) FINAL;

2 CREATE TYPE DOLARES AS DECIMAL(7,2) FINAL;

3 CREATE TABLE EMPREGADO(

4 Sal EUROS,

5 Com DOLARES, .... );

6

7 CREATE FUNCTION dolar_a_euro(d DOLARES)

8 RETURNS EUROS

9 BEGIN

10 RETURN d/1.1925;

11 END;

12

13 CREATE CAST(DOLARES AS EUROS)

14 WITH FUNCTION dolar_a_euro(DOLARES);

15

16 -- Salario total correcto, en euros

17 SELECT Sal+CAST(Com AS EUROS)

18 as SalTotal

19 FROM EMPREGADO;

Bases de Datos Obxecto-Relacionais 18 / 35

SQL:2003 - Tipos estructurados

I Constructor básico: �la (non se usa a palabra ROW)I A partir de tipos prede�nidos e/ou tipos distinctI Usando constructores (�la, colección)I Permiten de�nir métodos

CREATE TYPE Enderezo AS (

Rua VARCHAR(40),

Numero SMALLINT,

Poboacion VARCHAR(40)

) INSTANTIABLE NOT FINAL;

CREATE TYPE Empregado AS (

NSS CHAR(9),

Nome VARCHAR(59),

Dir Enderezo,

Sal EUROS

) INSTANTIABLE NOT FINAL;

CREATE TABLE Departamento(

Cod NUMERIC(3) PRIMARY KEY,

Nome VARCHAR(50),

Director Empregado,

Emps Empregado MULTISET

);

Bases de Datos Obxecto-Relacionais 19 / 35

SQL:2003 - Rutinas

I Estándar ISO/IEC 9075: 2003ISO/IEC 9075-2: SQL/FoundationISO/IEC 9075-4: Persistent Stored Modules (SQL/PSM)

I Permite incluir rutinas na base de datosI Procedementos (procedure)

I Chamada: CALL

I Funcións (function)I Devolven un valorI Chamada en expresións (select, ...)I Métodos en tipos estructurados/obxectos (method)

I Poden ser de�nidas en SQL ou externas

Bases de Datos Obxecto-Relacionais 20 / 35

SQL:2003 - RutinasExemplos

CREATE PROCEDURE inc_salario

(IN porcentaxe NUMERIC(2))

BEGIN

UPDATE Empregado

set Salario = Salario *

(1 + porcentaxe/100.0);

END;

CALL inc_salario(2);

CREATE FUNCTION sal_total(oNSS CHAR(9))

RETURNS EURO;

BEGIN

DECLARE saltotal EURO;

SELECT Salario+Comision INTO saltotal

FROM EMP

WHERE NSS = oNSS;

RETURN saltotal;

END;

CREATE FUNCTION fx (p DOUBLE PRECISION)

RETURNS DOUBLE PRECISON

LANGUAGE C

EXTERNAL NAME '/usr/lib/udf/fx.so'

PARAMETER STYLE GENERAL

DETERMINISTIC

NO SQL;

SELECT NSS, Nome, sal_total(NSS)

FROM Empregado;

Bases de Datos Obxecto-Relacionais 21 / 35

SQL:2003 - Métodos

I Función asociada a un tipo estructuradoI Parámetro (implícito) SELFI Distintos tipos de métodos

I Estáticos (de clase); de instanciaI Constructores, observadores, mutadores, ...

CREATE TYPE Rectangulo(

x1 FLOAT, y1 FLOAT,

x2 FLOAT, y2 FLOAT)

INSTANTIABLE NOT FINAL

INSTANCE METHOD Area()

RETURNS FLOAT;

-- Metodo de instancia

CREATE INSTANCE METHOD Area

RETURNS FLOAT

FOR Rectangulo

BEGIN

RETURN ABS(SELF.x2 - SELF.x1) *

ABS(SELF.y2 - SELF.y1);

END;

CREATE TABLE Rects (

Id INTEGER,

Rect Rectangulo

);

SELECT Id, Rect.Area()

FROM Rects;

Bases de Datos Obxecto-Relacionais 22 / 35

SQL:2003 - Métodos (ii)

Constructores explícitos ouimplícitos

CREATE METHOD Rectangulo

(x1 float, y1 float,

x2 float, y2 float)

RETURNS Rectangulo

FOR Rectangulo

BEGIN

SELF.x1 = x1; SELF.y1 = y1;

SELF.x2 = x2; SELF.y2 = y2;

RETURN SELF;

END;

INSERT INTO Rects(Id, Rect)

VALUES (100,

NEW Rectangulo(1,1,5,9));

Observers e Mutators (de�nidos polo sistema)

UPDATE Rects

SET Rect = Rect.x1(2) -- Mutador:

-- Rect.x1 = 2

WHERE Rect.Id() = 100;-- Observador

-- Combina uso de constructor e mutadores

INSERT INTO Rects(Id, Rect)

VALUES (101,

NEW Rectangulo().x1(1).y1(1).x2(5).y2(9));

Bases de Datos Obxecto-Relacionais 23 / 35

SQL:2003 - Referencias e Obxectos

I Cada tipo de datos estructurado ten asociado un tipo referencia

REF(<tipo>)

I Pode serI REF FROM(<campo>): usa un (ou máis) dos atributos do tipo.I REF IS SYSTEM GENERATED: xenerada polo sistema.I REF USING <tipo de datos>: de�nida polo usuario

I �Punteiro persistente�I Usaranse para integridade referencial ...pero na declaración de tipo

non se indica a táboa referenciada, só o tipo.

CREATE TYPE Empregado(

NSS CHAR(9),

Nome VARCHAR(59), ...,

Depto REF(Departamento)

) NOT FINAL

REF FROM (NSS);

CREATE TYPE Departamento(

Nome VARCHAR(40),

Emps REF(Empregado) MULTISET

) NOT FINAL

REF IS SYSTEM GENERATED;

Bases de Datos Obxecto-Relacionais 24 / 35

SQL:2003 - Uso dos Tipos estructurados

I Como componentes (�campos�) dun tipo máis complexoI Como atributos dunha táboaI Para crear �táboas de obxectos�

I Unha táboa almacena unha colección de obxectosI Uso de OIDs (Object IDenti�ers)

I Importante de�nirI Os OIDs (REFerencias, que serán system generated,

user generated, derived)I O ámbito das referencias (integridade referencial, con opcións)

CREATE TABLE Empregados

OF Empregado

(REF IS NSS USER GENERATED,

-- ref is nss derived?

Depto WITH OPTIONS SCOPE Deptos

REFERENCES ARE CHECKED

ON DELETE RESTRICT);

CREATE TABLE Deptos

OF Depto

(REF IS oid SYSTEM GENERATED,

Emps WITH OPTIONS SCOPE Empregados);

Bases de Datos Obxecto-Relacionais 25 / 35

SQL:2003 - HerenciaHerencia de tipos

I Tipos de herencia admitidaI Herencia simple (... UNDER <superclase>)I Subclases disxuntasI Sobrecarga (rede�nición) de métodos

(selección do método adecuado en tempo de execución)

CREATE TYPE Rectangulo(

x1 FLOAT, y1 FLOAT,

x2 FLOAT, y2 FLOAT) INSTANTIABLE NOT FINAL

INSTANCE METHOD Area() RETURNS FLOAT;

-- Omitimos o codigo de Area()

CREATE TYPE cadrado

UNDER rectangulo (

tamano FLOAT

) INSTANTIABLE NOT FINAL

OVERRIDING METHOD area() RETURNS FLOAT;

CREATE METHOD area() FOR cadrado

BEGIN

RETURN Self.tamano * Self.tamano;

END;

CREATE TYPE dobrecadrado

UNDER rectangulo (

ladocorto FLOAT

) INSTANTIABLE NOT FINAL

OVERRIDING METHOD area() RETURNS FLOAT;

CREATE METHOD area() FOR cadrado

BEGIN

RETURN Self.ladocorto * Self.ladocorto * 2;

END;

Bases de Datos Obxecto-Relacionais 26 / 35

SQL:2003 - HerenciaHerencia en táboas (i)

Exemplo � Modelo conceptual

Bases de Datos Obxecto-Relacionais 27 / 35

SQL:2003 - HerenciaHerencia en táboas (ii)

Exemplo � DatosPersoa

IDPers Nome

111 Diego222 Sara333 Luisa444 Carlos

Alumno

IDPers Ano Curso

222 2002 5444 2006 1

Profesor

IDPers Departamento

111 Computación

Asignatura

Cód Nome Créd Aula

BD2 BD2 9 [3.3,LAB2.2]

Aula

Número Capacidade Asign

3.3 100 [BD2]LAB2.2 30 [BD2]

Clase

IDPers Ano Curso

111 222 BD2111 444 BD2

Bases de Datos Obxecto-Relacionais 28 / 35

SQL:2003 - HerenciaHerencia en táboas (iii)

Exemplo � Creación de tipos

CREATE TYPE Persoa AS(

IDPers CHAR(9),

Nome VARCHAR(50)

) NOT FINAL REF FROM(IDPers);

CREATE TYPE Alumno

UNDER Persoa AS(

Ano NUMERIC(4),

Curso NUMERIC(1),

enClases REF(Clase) MULTISET

)NOT FINAL;

CREATE TYPE Profesor

UNDER Persoa AS(

Departamento VARCHAR(20),

daClase REF(Clase) MULTISET

)NOT FINAL;

CREATE TYPE Asignatura AS(

Codigo CHAR(5),

Nome VARCHAR(30),

Creditos NUMERIC(2),

asAulas REF(Aula) MULTISET,

impartida REF(Clase) MULTISET

)NOT FINAL REF FROM(Codigo);

CREATE TYPE Aula AS(

Numero CHAR(9),

Capacidade SMALLINT,

asAsignaturas REF(Asignatura)

MULTISET

)NOT FINAL REF FROM(Numero);

CREATE TYPE Clase AS(

oProfesor REF(Profesor),

oAlumno REF(Alumno),

aAsignatura REF(Asignatura)

)NOT FINAL REF IS SYSTEM GENERATED;

Bases de Datos Obxecto-Relacionais 29 / 35

SQL:2003 - HerenciaHerencia en táboas (iv)

Exemplo � Creación de táboas

CREATE TABLE Persoas OF Persoa

(REF IS IDPers USER GENERATED);

CREATE TABLE Alumnos

UNDER Persoas

OF Alumno

(enClase WITH OPTIONS SCOPE

Clases);

CREATE TABLE Profesores

UNDER Persoas

OF Profesor

(daClase WITH OPTIONS SCOPE

Clases);

CREATE TABLE Asignaturas OF Asignatura

(REF IS Codigo USER GENERATED,

impartida WITH OPTIONS SCOPE Clases,

asAulas WITH OPTIONS SCOPE Aulas);

CREATE TABLE Aulas OF Aula

(REF IS Numero USER GENERATED,

asAsignaturas WITH OPTIONS SCOPE Asignaturas

);

CREATE TABLE Clases OF Clase

(REF IS oid SYSTEM GENERATED,

oProfesor WITH OPTIONS SCOPE Profesores,

oAlumno WITH OPTIONS SCOPE Alumnos,

aAsignatura WITH OPTIONS SCOPE Asignaturas);

Bases de Datos Obxecto-Relacionais 30 / 35

SQL:2003 - HerenciaHerencia en táboas (v)

Almacenamento e consultas

I Créanse táboas para a clase e as subclasesI Unha persoa (non profesor nin alumno) só ten datos en

Persoas.I Un alumno ten o IDPers e nome na táboa Persoas e os datos

de ano e curso na táboa Alumnos.I Un profesor ten o IDPers e nome na táboa Persoas e o

departamento na táboa Profesores.I Unha persoa non pode ser alumno e profesor á vez

(SQL:2003 ⇒ especialización disxunta)I A selección pode implicar Joins

I Selección en Persoas: só datos de persoasI Selección en Alumnos: Obtén todos os datos (como persoa e

como alumno). Implica facer internamente un join entrePersoas e Alumnos

Bases de Datos Obxecto-Relacionais 31 / 35

SQL:2003 - HerenciaHerencia en táboas (vi)

Modi�cación de datos

Inserción: Inserción en subclase ⇒ Inserción automática ensuperclase.

Borrado: Borrado en superclase ⇒ Borrado en todas assubclases, e viceversa.

Modi�cación: Modi�cación dos atributos �visibles� por cada táboa.Modi�cación como cambio de subclase: non sepermite.

Implicacións

¾Que ocorre se queremos almacenar ...

I que Sara non é alumna (quedaría só como persoa)?I que Luisa é profesora?I que Diego pasa de alumno a profesor?

Bases de Datos Obxecto-Relacionais 32 / 35

Consultas

Modi�cación de datos

I Tipos básicos (e distinct sobre eles): igual en SQL-92.

I Tipos �la: constructor ROW

I Coleccións:I Arrays: con constructor ou elemento a elementoI Multisets: con constructor ou operacións �alxebraicas�

I Referencias: Primeiro obter a referencia do obxecto.

Selección de datosExtracto de transparencias creadas por J. R. Ríos Viqueira (USC).

Bases de Datos Obxecto-Relacionais 33 / 35

Discusión

Ventaxas

I Maior capacidade de modelización

I ExtensibilidadeI Novos tipos de datos e novas operaciónsI Novas consultas

I Reusabilidade

I Integración relacional-obxectos(Eliminar desadaptación de impedancias)

Inconvenientes

I Falta de modelo (teórico) básico universal (para OO)

I Non é un modelo cerrado

I Problemas co tratamendo de referencias

I Xestión de herencia defectuosaBases de Datos Obxecto-Relacionais 34 / 35

Bibliografía

Thomas Connolly and Carolyn Begg.Sistemas de Bases de datos: Un enfoque práctico para diseño,

implementación y gestión.Addison-Wesley, 4a edition, 2005.

C. J. Date.Introducción a los sistemas de bases de datos.Prentice Hall, 7a edition, 2001.

Andrew Eisenberg, Jim Melton, Krishna Kulkarni, Jan-EikeMichels, and Fred Zemke.SQL:2003 has been published.SIGMOD Rec., 33(1):119�126, 2004.

P. Gulutzan and T. Pelzer.SQL-99 complete, really.R&D Books, Kansas, 1999.

J. Melton and A. R. Simon.SQL:1999 - Understanding relational language components.Morgan Kaufmann, 2002.

Bases de Datos Obxecto-Relacionais 35 / 35

1

Curso 2005/2006 1J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

SQL:2003 - Consultas

Fragmento del original:SISTEMAS DE BASES DE DATOS BASADOS EN OBJETOSAsignatura: Sistemas de Información, Tema 2José Ramón Ríos ViqueiraCurso 2005-2006

Curso 2005/2006 2J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

Tipos complejos: ROW, ARRAY, MULTISET

CONSULTAS

CREATE TABLE empleado (id_emp INTEGER PRIMARY KEY,nombre VARCHAR(50),direccion ROW(calle VARHCAR(100), num INTEGER, loc VARCHAR(10),salario DECIMAL(9, 2),hijos VARCHAR(50) ARRAY,cursos ROW(nombre VARCHAR(50), nota DECIMAL(3, 1)) MULTISETdep INTEGER,

FOREING KEY dep REFERENCES departamento(id_dep));

CREATE TABLE departamento (id_dep INTEGER PRIMARY KEY,nombre VARCHAR(50),direccion ROW(calle VARHCAR(100), num INTEGER, loc VARCHAR(10),presupuesto DECIMAL(12, 2),

);

2

Curso 2005/2006 3J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

Tipos complejos: ROW, ARRAY, MULTISETDesanidar tipos colección

CONSULTAS

Obtener una lista con los hijos de cada empleado

SELECT e.nombre, h.hijoFROM empleado AS e, UNNEST (e.hijos) AS h(hijo)

Obtener para cada empleado de Santiago la nota media en los cursos que aprobó

SELECT e.nombre, AVG(c.nota)FROM empleado AS e, UNNEST (e.cursos) AS c(nota)WHERE e.direccion.loc = 'Santiago' and c.nota >= 5 GROUP BY e.nombre

Curso 2005/2006 4J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

Tipos complejos: ROW, ARRAY, MULTISETAnidar tipos colección

CONSULTAS

Obtener un informe en el que para cada departamento cuyo presupuesto sea mayor que la suma de los sueldos de sus empleados se indique:

• Nombre del departamento, • Presupuesto del departamento, • Relación de empleados con el nombre, salario y número de hijos

de cada empleado• Suma del salario de todos sus empleados

SELECT d.nombre, d.presupuesto,MULTISET(SELECT e2.nombre, e2.salario, count(h.hijo) AS Hijos

FROM empleado AS e2, UNNEST (e2.hijos) AS h(hijo)WHERE d.id_dep = e2.depGROUP BY e2.nombre, e2.salario),

SUM(e.salario) AS SalarioTotalFROM departamento AS d, empleado AS e WHERE e.id_dep=e.depGROUP BY d.nombre, d.presupuestoHAVING d.presupuesto > SUM(e.salario)

3

Curso 2005/2006 5J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

Uso de tipos estructurados: métodos y funciones

CONSULTAS

CARRETERAScod_carrt

N-651A-9 F

cp-0804064-001

propietarioEstatalEstatalProvincialMunicipal

EstadoMalo

BuenoRegularBueno

TrazadoL1L2L3L4

CENTROS_SALUDid_cs

12

nombreViñasSan Cide

camas0

10

posicionP1P2

Valores de tipo Linea

Valores de tipo Punto

CREATE TYPE punto UNDER geo (

x FLOAT, y FLOAT)INSTANTIABLE NOT FINAL;

CREATE TYPE linea UNDER geo(coords punto ARRAY)

INSTANTIABLE NOT FINALINSTANCE METHOD longitud() RETURNS FLOAT;

CREATE FUNCTION distancia (g1 geo, g2 geo) RETURNS FLOATBEGIN ... END

Curso 2005/2006 6J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

Longitud total de carreteras municipales en mal estado

CONSULTAS

SELECT sum(trazado.longitud)FROM carreterasWHERE propietario = 'Municipal' and estado = 'Malo'

Número total de camas de los centros de salud que se encuentran a menos de 1 km de un tramo de carretera con longitud mayor de 2 km y estado bueno

SELECT sum(camas)FROM carreteras AS c, centros_salud AS csWHERE c.estado = 'bueno' and c.longitud < 2000

and distancia(c.trazado, cs.posicion) < 1000

Uso de tipos estructurados: métodos y funciones

4

Curso 2005/2006 7J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

CONSULTAS

Uso de tipos estructurados: Herencia

CREATE TABLE rios AS (id_rio INTEGER PRIMARY KEY,nombre VARHCAR(50),geom geo)

SELECT nombre, SUM(TREAT(geom AS linea).longitud)FROM riosWHERE geom IS OF (linea)GROUP BY nombre

Para cada río, devolver la longitud total de las partes que son de tipo línea

2, 'Tambre'

1, 'Tambre'

3, 'Tambre'

Curso 2005/2006 8J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

Referencias

CONSULTAS

CREATE TYPE Empleado AS (nombre VARCHAR (50),salario_base DECIMAL (9, 2),complementos DECIMAL(9, 2),dep REF(Departamento))

NOT FINALREF IS SYSTEM GENERATEDINSTANCE METHOD salario() RETURNS DECIMAL(9, 2);

CREATE TYPE Departamento AS (nombre VARCHAR (50),dir DIRECCION,emps REF(Empleado) MULTISET, director REF(Empleado))

NOT FINALREF IS SYSTEM GENERATED;

CREATE TABLE Empleados OF Empleado (REF IS oid SYSTEM GENERATED,dept WITH OPTIONS SCOPE Departamentos);

CREATE TABLE Departamentos OF Departamento (REF IS oid SYSTEM GENERATED,emps WITH OPTIONS SCOPE Empleados,director WITH OPTIONS SCOPE Empleados);

5

Curso 2005/2006 9J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

ReferenciasDereferenciación de atributos

CONSULTAS

Para cada departamento de santiago, obtén su nombre y el nombre de sus empleados

SELECT e.nombre, e.dept->nombre FROM Empleados eWHERE e.dep->dir.loc = 'Santiago'

SELECT e.nombre, (SELECT d.nombre FROM departamentos d WHERE d.oid = e.dep)FROM Empleados eWHERE (SELECT dir.loc FROM departamentos d WHERE d.oid = e.dep) = 'Santiago'

SELECT e.nombre, d.nombreFROM Empleados e LEFT JOIN Departamentos d ON (e.dep = d.oid)WHERE d.dir = 'Santiago'

SELECT e.nombre, DEREF(e.dept).nombre FROM Empleados eWHERE DEREF(e.dept).dir.loc = 'Santiago'

Curso 2005/2006 10J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

CONSULTAS

Para cada departamento obtener la suma de los salarios de sus empleados

ReferenciasDereferenciación de métodos

SELECT d.nombre, SUM(e.ptr->salario)FROM Departamentos d, UNNEST(d.emps) AS e(ptr)GROUP BY d.nombre

Los métodos no se puede aplicar directamente a las tuplas

SELECT e.nombre, e.salarioFROM Empleados e

Nombre y salario de cada empleado

ERROR: e no es de tipo empleado, ya que tiene un atributo oid

SELECT e.nombre, DEREF(e.oid).salarioFROM Empleados e

CORRECTO

6

Curso 2005/2006 11J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

CONSULTAS

Herencia de tipos

CREATE TYPE rectangulo AS (x1 FLOAT, y1 FLOAT, x2 FLOAT, y2 FLOAT)

NOT FINALINSTANCE METHOD area() RETURNS FLOAT;

CREATE TYPE cuadrado UNDER rectangulo (tamano FLOAT)NOT FINALOVERRIDING METHOD area() RETURNS FLOAT;

CREATE TABLE rectangulos AS (id_rect INTEGER PRIMARY KEY,rec rectangulo)

Obten el área de cada cuadrado de la tabla rectángulos

SELECT r.id_rect, r.rec.areaFROM rectangulosWHERE r.rec IS OF (cuadrado)

Curso 2005/2006 12J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

CONSULTAS

Herencia de tablasUna selección en una supertabla, devuelve los atributos de esa supertabla para todas las tuplas de esa supertabla y de todas sus subtablas.

CREATE TABLE EMPLEADOS OF empleado(REF IS id_emp SYSTEM GENERATED,dep WITH OPTIONS SCOPE DEPARTAMENTOS);

CREATE TABLE ADMINISTRADORES OF administradorUNDER EMPLEADOS;

CREATE TABLE PROGRAMADORES OF programadorUNDER EMPLEADOS(proys WITH OPTIONS SCOPE PROYECTOS);

SELECT *FROM Empleados

Selecciona todos los empleados, de cualquier tipo

Selecciona el nombre y el lenguaje que domina cada programadorSELECT p.nombre, p.lenguajeFROM Programadores

7

Curso 2005/2006 13J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

CONSULTAS

Herencia de tablasSelección de las túplas de un sólo tipo

• ONLY

SELECT *

FROM ONLY (Empleados)

Selecciona todos los empleados, que no son ni programadores ni administradores

SELECT *

FROM Empleados

WHERE DEREF(oid) IS OF (Empleado)

Curso 2005/2006 14J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

CONSULTAS

Definición de vistasPosibilidad de definir vistas con tipoDefinición de jerarquías de vistasLas referencias entre tablas base pueden transformarse en referencias entre vistas

Vistas para el departamento de ventas

CREATE TYPE empVentas AS (nombre VARCHAR(50), salario DECIMAL(6, 2)) NOT FINAL;

CREATE TYPE admVentas UNDER empVentas (sistema VARCHAR(20)) NOT FINAL;

CREATE TYPE progVentasUNDER empVentas (

lenguaje VARCHAR(20),proys REF(proyecto) MULTISET

) NOT FINAL;

CREATE TYPE proyVentas AS (duracion INTEGER,presup DECIMAL(9, 2),

progs REF(programador) MULTISET) NOT FINAL;

Tipos

8

Curso 2005/2006 15J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales

CONSULTAS

Vistas para el departamento de ventas

Vistas

CREATE VIEW vistaEmpVentasOF empVentasREF IS oid SYSTEM GENERATEDAS (SELECT nombre, salario

FROM ONLY (Empleados)WHERE dep->nombre = 'Ventas');

CREATE VIEW vistaAdmVentasOF admVentas UNDER vistaEmpVentasAS (SELECT sistema

FROM ONLY(Administradores)WHERE dep->nombre = 'Ventas');

CREATE VIEW vistaProgVentasOF progVentas UNDER vistaEmpVentas(proys WITH OPTIONS SCOPE vistaProyVentas) AS (SELECT lenguaje, proys

FROM ONLY(Programadores)WHERE dep->nombre = 'Ventas');

CREATE VIEW vistaProyVentas OF proyVentasREF IS oid SYSTEM GENERATED(progs WITH OPTIONS SCOPE vistaProgVentas) AS (SELECT duracion, presup, progs

FROM ProyectosWHERE dep->nombre = 'Ventas');