4a-Basi di dati relazionali ad
oggetti
1
Approccio “Object-Relational”(ORDBMS)
• I database orientati agli oggetti non hanno allo
stato avuto adeguato successo perché non hanno
offerto efficienza pari ai collaudati RDBMS.
• L’approccio “Object-Relational” invece si presenta
come “evolutivo” rispetto alle basi dati relazionali,
ponendosi come obiettivo:
– estensioni compatibili con la nozione di tabella.
– la possibilità di esprimere la maggior parte dei concetti
dei DB “ puri” ad oggetti.
2
Modello dei dati di SQL:1999
• E’ compatibile con il modello relazionale ad es:
create table Persona(
Nome varchar(40) not null
Residenza varchar(30)
Codfisc char(16)primary key
);
• L’approccio ORDBMS suggerisce di definire “prima” il
tipo (riga, row) Persona, chiamiamolo “TipoPersona”,
per renderlo riusabile.
• L’uso di tipi strutturati, che estendono la nozione classica
di dominio ( tipo distinto in SQL:1999), consente di
costruire innanzitutto la struttura delle tuple (row) da
inserire in tabella.
3
Tipi strutturati – parte statica
• Definizione della tabella persona :
create type TipoPersona(
Nome varchar (30),
Residenza varchar(30),
CodFisc char(16)
) not final;
create table Persona of
TipoPersona;
not final: il tipo ammette la definizione di sottotipi;
4
Tipi strutturati e riferimenti
• Tecnicamente una relazione - come Persone, dichiarata con
il tipo “riga” - TipoPersona, non è un insieme di triple
bensì una relazione unaria , le cui “tuple” sono oggetti
con tre componenti: (Nome, Residenza, Codfisc).
• Se T è un tipo, allora REF T è il tipo di un riferimento to
T, cioè, un “puntatore” ad un oggetto di tipo T.
• Viene spesso chiamato nei sistemi Object Oriented un “ID
di oggetto, OID”.
• A differenza degli OID, un REF è visibile, anche se
normalmente non ha significato
5
Riferimenti
create type TipoCostr(
Presidente
ref (TipoPersona),
Stabilimento ref (TipoStabilimento)
Nome
varchar (20)
);
• Gli oggetti TipoCostr hanno il seguente aspetto:
FIAT
Ad un
oggetto
TipoPersona
Ad un oggetto
TipoStabilimento
6
Tipi strutturati – approfondimento
• Definizione della tabella persona in SQL:1999
create type TipoPersona
(Nome varchar (30),
Residenza varchar(30),
CodFisc char(16))
not final
ref from CodFisc
create table Persona of
TipoPersona (
ref is CodFisc derived);
ref from CodFisc: Codfisc è l’attributo da utilizzare per
realizzare riferimenti a istanze del tipo.
ref is CodFisc derived: specifica che l’identificatore è derivato
dal valore dell’attributo CodFisc.
7
Tipi strutturati - approfondimento
• Possibile riuso del tipo persona
Create
Ref
Create
Ref
table Presidente of TipoPersona (
is CodFisc derived)
table Pilota of TipoPersona (
is Codfisc derived
• Si noti la corrispondenza:
– (Tupla, oggetto)
– (tabella, classe)
conformemente ai DB ad oggetti.
8
Esempio tipi strutturati
9
Esempio tipi strutturati
• Consideriamo la definizione dei corrispondenti
tipi tupla per la fig. precedente che includono
TipoPersona già visto.
• Si noti l’uso del costrutto:
– varray : il costruttore di insiemi set of non è previsto
in SQL:1999
– ref is system generated: l’attributo da utilizzare per
realizzare riferimenti a istanze del tipo ( OID = REF) è
automaticamente generato dal sistema.
10
Codice esempio tipi strutturati
create type TipoStab(
Nome varchar (25),
Citta varchar (7),
Addetti integer)
not final
create type TipoCostr(
Nome varchar (25),
Presidente ref(TipoPersona),
Stabilimenti VARRAY[10]of TipoStab)
not final
ref is system generated
create type TipoPartiAuto(
Motore char(10),
Ammortizzatore char(5))
not final
create type TipoAuto(
Targa char(7),
Modello varchar (30),
Costruttore ref(TipoCostr),
PartiMeccaniche TipoPartiAuto)
not final
ref is system generated
11
Complessità strutturale
• TipoStab presente nell’ambito di TipoCostr e
TipoPartiAuto presente nell’ambito di TipoAuto,
sono usati senza introdurre il costrutto ref e cioè
senza che vengano introdotti “oggetti” e quindi
tipi indipendenti.
• Questo perché si possono costruire oggetti (tuple)
che comprendono al loro interno sotto-oggetti
(sotto-tuple) garantendo una arbitraria complessità
strutturale.
12
Le tabelle (classi) dell’esempio
Create table Industriale of TipoPersona (
Ref is CodFisc derived)
Create table Pilota of TipoPersona (
Ref is Codfisc derived
Create table Automobile of TipoAuto (
Ref is AutoId system generated
Create table Costruttore of TipoCostr (
Ref is CostrId system generated,
Presidente with options scope
Industriale references are checked)
13
Definizione di identificatori
• Nella definizione di TipoAuto (TipoCostr) non
compare esplicitamente il nome dell’attributo
da utilizzare per realizzare riferimenti a
istanze del tipo.
• Grazie alle definizioni (ref is …) nelle Tabelle
Automobile, Costruttore vengono introdotti
esplicitamente i relativi identificatori AutoId,
CostrId, per utilizzarli nelle relazioni.
14
with options…
• Il costrutto with options consente di fornire
maggiori dettagli o imporre restrizioni su
componenti del tipo quando esso viene
utilizzato nell’ambito di una tabella .
• Qui viene usato per associare la clausola
scope all’attributo Presidente:
Presidente with options scope Industriale
che impone il vincolo che i valori di
Presidente debbano essere dei riferimenti
alle tuple di TipoPersona appartenenti alla
tabella Industriale.
15
Supporto per l’integrità referenziale
•
•
In SQL:1999 occorre, se sul tipo è imposta
l’integrità referenziale, introdurre:
... references are checked
cioè che i riferimenti sono sempre
mantenuti consistenti dal sistema.
In questo caso, qualsiasi modifica al
contenuto della tabella Industriale che può
causare anomalia farà scattare un Trigger
per rifiutare eventualmente la modifica.
16
Gerarchie di tipo
• In SQL:1999 vi sono gerarchie di tipo e di
tabella
• Le Gerarchie di tipo estendono i tipi già
definiti , come nel caso di TipoAuto
dell’esempio seguente:
create type TipoAutoStorica(
AnnoCostr integer)
under TipoAuto
not final
– dove TipoAutoStorica aggiunge l’attributo
AnnoCostr a TipoAuto.
17
Gerarchie sulle tabelle
• Le gerarchie sulle tabelle sono analoghe alle gerarchie
sulle classi:
– Le sotto-tabelle hanno per tipo un sotto-tipo delle tabelle da
cui ereditano.
– Ogni tupla (oggetto) presente in una sotto-tabella appare (è
fisicamente presente) come tupla nelle tabelle di livello
gerarchicamente superiore.
• Definizione di Automobile Storica:
create table AutomobileStorica of
type TipoAutoStorica
under Automobile
• Alternativamente (ma con tipo “non riutilizzabile”):
create table AutomobileStorica(
AnnoCostr integer)
under Automobile
• Anche la gestione dei riferimenti viene ereditata
18
Tipi instanziabili e non
• I tipi definiti dall’utente possono essere:
[not] instantiable
cioè etichettati come instanziabili o meno
• I tipi non instanziabili non possono essere utilizzati
direttamente nella definizione delle tabelle ma possono
essere utilizzati come base nelle definizione dei sottotipi o
come componenti all’interno della definizione di altri tipi o
tabelle.
• Il comportamento è analogo a quello delle classi astratte di
Java o del modello ad oggetti.
19
Metodi — parte dinamica
• Un metodo è una procedura utilizzata per
incapsulare lo stato di un oggetto, ed è caratterizzato
da una interfaccia (o segnatura) e una
implementazione
– l’interfaccia comprende tutte le informazioni che
permettono di invocare un metodo (il tipo dei parametri)
– l’implementazione contiene il codice del metodo
• Il tipo di un oggetto comprende, oltre alle proprietà,
anche le interfacce dei metodi applicabili a oggetti
di quel tipo
• Ipotizziamo che i metodi siano assimilabili a
funzioni, ovvero possono avere più parametri di
ingresso ma un solo parametro di uscita
20
Metodi
• In prima approssimazione, i metodi possono
essere dei seguenti tipi
– costruttori — per costruire oggetti a partire da
parametri di ingresso (restituendo l’OID dell’oggetto
costruito)
– distruttori — per cancellare gli oggetti, ed eventuali
altri oggetti ad essi collegati
– accessori — funzioni che restituiscono informazioni sul
contenuto degli oggetti (proprietà derivate)
– trasformatori — procedure che modificano lo stato
degli oggetti, e di eventuali altri oggetti ad essi collegati
• E’ possibile negare agli utenti i privilegi di accesso
ai metodi, che vengono definiti come privilegi
speciali, ottenendo come effetto l’incapsulamento
dei dati
21
Metodi
• Vediamo un esempio di Definizione del TipoPartiAuto che
comprende i metodi PotUnitaria calcolo della potenza di ciascun
cilindro del motore e MaggiorPotUnitaria (confronto tra l’istanza
su cui viene invocato il metodo e un’altra istanza dello stesso tipo
che viene passata come parametro)
create type TipoPartiAuto (
Motore char(10),
NumCilindri integer,
Potenza integer,
Cilindrata integer )
not instantiable
not final
method PotUnitaria()
returns float,
method DisegnoDisponibile ()
returns boolean
language C
22
Metodi: implementazione
• I metodi definiti possono essere realizzati in SQL:1999
oppure in un linguaggio esterno (vedi nell’esempio C per
DisegnoDisponibile);
• Occorre definire la segnatura con i parametri di ingresso e
quello di uscita e poi l’implementazione:
• Calcolo della potenza di ciascun cilindro del motore
Create instance method PotUnitaria()
returns float
for TipoPartiAuto
return (cast(Self.Potenza as float)/
Self.NumCilindri)
23
Metodi: implementazione
• Confronto tra l’istanza di TipoPartiAuto su cui viene invocato il
metodo con un’altra istanza dello stesso tipo che viene passata
come parametro
Create instance method MaggiorPotUnitaria
(ParteCfr TipoPartiAuto)
returns boolean
for TipoPartiAuto
Return
((Self.PotUnitaria > ParteCfr.PotUnitaria)
or((Self.PotUnitaria > ParteCfr.PotUnitaria)
and(Self.Cilindrata > ParteCfr.Cilindrata)))
24
Metodi: implementazione
• Nelle implementazioni i valori degli attributi sono raggiunti
con una notazione a punto (dot notation) per estrarre
l’attributo referenziato da una variabile.
• E’ da notare che nel metodo MaggiorPotUnitaria venga
utilizzato il metodo PotUnitaria.
• In SQL:1999 si fa riferimento a una implementazione esterna
realizzata in uno specifico linguaggio con:
Create instance method DisegnoDisponibile()
return boolean
external name Mia ProceduraC
25
Interrogazioni in SQL:1999
• Le interrogazioni SQL-2 sono completamente
ammesse in SQL:1999
select Nome
from Persona
where CodFisc = ‘TRESFN56D23S541S’
• La navigazione lungo i riferimenti tra i tipi
richiede l’operatore di “dereferenziamento” ; tale
operatore consente di accedere
“da un oggetto sorgente x ad un attributo A di un
oggetto y referenziato in x con x -> A”
26
Interrogazioni in SQL:1999
• Il seguente esempio mostra l’uso dell’operatore di
dereferenziamento per accedere al valore dell’attributo Nome
dell’oggetto della tabella INDUSTRIALE “puntato”
dall’oggetto della tabella COSTRUTTORE che è puntato a
sua volta dall’automobile che soddisfa il predicato
Targa=‘DB123MS’:
select Costruttore -> Presidente -> Nome
from
Automobile
where Targa = ‘DB123MS’
27
Interrogazioni in SQL:1999
• In SQL:1999 gli attributi di tipo REF possono essere esplicitamente
utilizzati nelle interrogazioni e confrontati con l’operatore = con i
riferimenti a tuple dello stesso tipo:
Select Industriale,Nome
From
Automobile, Costruttore, Industriale
where Automobile.Targa=‘DB123MS’
and Automobile.Costruttore=Costruttore.CostrId
and Costruttore.Presidente=Industriale.CodFisc
• L’interrogazione costruisce un join tra le tabelle AUTOMOBILE,
COSTRUTTORE, INDUSTRIALE, in cui:
– l’attributo Costruttore di AUTOMOBILE viene confrontato con
l’identificatore CostrId di COSTRUTTORE e
– l’attributo Presidente di COSTRUTTORE viene confrontato con
l’identificatore CodFisc di INDUSTRIALE.
28
The Third Generation
Database System Manifesto
(Stonebraker, Rowe, Lindsay, Gray, Carey, Brodie, Bernstein, Beech)
• Un articolo a sostegno dei sistemi object relational nato in risposta al manifesto delle basi di dati ad
oggetti (OODBMS)- la cui intuizione nel tempo si è
dimostrata profetica:
"I DBMS della prossima generazione
dovranno essere ottenuti come risultato
dell'evoluzione dei DBMS esistenti
(relazionali)"
29
I principi del contro-manifesto
• I DBMS di terza generazione dovranno essere una
generalizzazione (compatibile) con DBMS della
seconda generazione
• Oltre a fornire i servizi tradizionali di gestione dei
dati, dovranno permettere la definizione di oggetti
complessi e regole
• Dovranno essere aperti ad altri sottosistemi
30
I CONCETTI DEL MANIFESTO
• Un 3GDBMS deve avere un sistema di tipi ricco, che tra
l’altro possegga costruttori ortogonali per array, sequenze,
record e set.
• Un 3GDBMS deve consentire gerarchie di generalizzazione tra
tipi possibilmente anche con ereditarietà multipla.
• Le funzioni (includendo procedure e metodi) sono caratteristiche utili specie se accompagnate dall’incapsulamento.
• Ha senso che il sistema assegni OID agli oggetti solo se
non è disponibile una chiave primaria tra gli attributi
definiti dall’utente; altrimenti è meglio ricorrere a quelli chiave
per identificare gli oggetti.
• Regole attive (trigger) e passive (vincoli di integrità)
diventeranno una componente essenziale dei 3GDBMS.
• Indipendentemente da quanto questo fattore sia desiderabile,
SQL è il linguaggio di riferimento dei 3GDBMS.
31
Manifesto 3GDBMS: dettagli
[1.1] rich type system
[1.2] inheritance
[1.3] functions and encapsulation
[1.4] OID's only if there are no keys
[1.5] rules and triggers
[2.1] non procedural, high level access languages
[2.2] specification techniques for collections
[2.3] updatable views
[2.4] transparency of physical parameters
[3.1] multiple high level languages
[3.2] persistent x, for many x's
[3.3] SQL is a standard (even if you don't like it)
[3.4] queries and their results are the lowest level of
communication
32
Descargar

Basi di dati a oggetti