500 likes | 650 Views
6b –Basi di dati Relazionali ad oggetti : approfondimenti. Tipi definiti dall’utente ID di Oggetti Tabelle innestate. Fondere i modelli relazionale ed a oggetti. I modelli orientati agli oggetti supportano tipi di dati interessanti – non solo file “piatti” Mappe, multimedia, etc.
E N D
6b –Basi di dati Relazionali ad oggetti : approfondimenti Tipi definiti dall’utente ID di Oggetti Tabelle innestate J. Ullman -ORDBMS
Fondere i modelli relazionale ed a oggetti • I modelli orientati agli oggetti supportano tipi di dati interessanti – non solo file “piatti” • Mappe, multimedia, etc. • Il modello relazionale supporta query di alto livello • I database object-relational sono un tentativo di ottenere il meglio dei due modelli J. Ullman -ORDBMS
Evoluzione dei DBMS • I database orientati agli oggetti non hanno avuto successo perché non hanno offerto l’efficienza dei collaudati DBMS relazionali • Le estensioni object-relational ai DBMS relazionali catturano molti dei vantaggi dell’ “Object Orientation” mantenendo la relazione come astrazione fondamentale J. Ullman -ORDBMS
Caratteristiche di SQL:1999 e Oracle • SQL:1999 include molte delle caratteristiche object-relational che verranno descritte • Però, essendo molto recente, diversi DBMS usano approcci ancora differenti • Verranno mostrate a volte le caratteristiche e la sintassi di Oracle J. Ullman -ORDBMS
Tipi definiti dall’utente (UDT) • Un tipo definito dall’utente, or UDT, è essenzialmente una definizione di classe, con una struttura e dei metodi. • Due usi: • Come un tipo riga, cioè, il tipo di una relazione. • Come il tipo di un attributo di una relazione. J. Ullman -ORDBMS
Definizione di UDT CREATE TYPE <nometipo> AS ( <lista of elementi, come in CREATE TABLE> ); • Sintassi di Oracle : • Aggiungere “OBJECT” come in CREATE … AS OBJECT. • Aggiungere / affinché il tipo sia memorizzato. J. Ullman -ORDBMS
Esempio: definizione di UDT CREATE TYPE BarType AS ( name CHAR(20), addr CHAR(20) ); CREATE TYPE BeerType AS ( name CHAR(20), manf CHAR(20) ); J. Ullman -ORDBMS
Riferimenti • SeT è 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 J. Ullman -ORDBMS
Esempio: REF CREATE TYPE MenuType AS ( bar REF BarType, beer REF BeerType, price FLOAT ); • Gli oggetti MenuType hanno il seguente aspetto: 3.00 Ad un oggetto BarType Ad un oggetto BeerType J. Ullman -ORDBMS
UDT come tipi riga • Una tabella può essere definita con uno schema che è un tipo riga, invece di elencare i suoi elementi • Sintassi: CREATE TABLE <nome tabella> OF <nome tipo>; J. Ullman -ORDBMS
Esempio: Creare una relazione CREATE TABLE Bars OF BarType; CREATE TABLE Beers OF BeerType; CREATE TABLE Sells OF MenuType; J. Ullman -ORDBMS
Valori di relazioni di tipo riga • Tecnicamente, una relazione come Bars, dichiarata con il tipo riga BarType, non è un insieme di coppie - è una relazione unaria , le cui tuple sono oggetti con due componenti: name and addr. • Ogni UDT ha un costruttore di tipo con lo stesso nome, che racchiude oggetti di quel tipo. J. Ullman -ORDBMS
Esempio: Costruttore di tipo • La query SELECT * FROM Bars; • Produce “tuples” come: BarType(’Joe’’s Bar’, ’Maple St.’) J. Ullman -ORDBMS
Accedere ai valori di un tipo riga • In Oracle, il punto funziona come di consueto. • Ma è necessario, quando vengono impiegate caratteristiche Object Relational, usare un alias per ogni relazione. • Esempio: SELECT bb.name, bb.addr FROM Bars bb; J. Ullman -ORDBMS
Accedere ai valori: approccio SQL:1999 • In SQL:1999, ogni attributo di un UDT ha un metodo accessore - generator (per ottenere il valore) e un metodo trasformatore – mutator (per cambiare il valore) con lo stesso nome dell’attributo. • L’accessore per A non ha argomenti, come A(). • Il trasformatore per A prende il nuovo valore come argomento, come in A(v). J. Ullman -ORDBMS
Esempio: accesso ai valori in SQL:1999 • La stessa query in SQL:1999 è SELECT bb.name(), bb.addr() FROM Bars bb; J. Ullman -ORDBMS
Metodi costruttori in SQL:1999 • Ogni UDT ha almeno un metodo costruttore, ovvero un metodo che ha lo stesso nome del UDT e ritorna un oggetto dello stesso tipo • Esempio BarType() J. Ullman -ORDBMS
Inserire valori di tipo riga • In Oracle, possiamo usare il comando standard INSERT, ricordando che una relazione di tipo riga è in realtà unaria e richiede quel costruttore di tipo. • Esempio: INSERT INTO Bars VALUES( BarType(’Joe’’s Bar’, ’Maple St.’) ); J. Ullman -ORDBMS
Inserire valori: stile di SQL:1999 • Creare una nuova variabile X del tipo richiesto, usando il costruttore per quel tipo • Usare i metodi trasformatori per gli attributi per impostare i valori dei campi di X. • Inserire X nella relazione. J. Ullman -ORDBMS
I metodi modifi- catori cambiano i componenti name and addr di newBar Esempio: INSERT IN SQL:1999 • Il codice seguente deve essere parte di una procedura , ad esempio PSM, nel quale abbiamo una variabile newBar. SET newBar = BarType(); newBar.name(’Joe’’s Bar’); newBar.addr(’Maple St.’); INSERT INTO Bars VALUES(newBar); J. Ullman -ORDBMS
UDT come tipi colonna • Un UDT può essere il tipo di un attributo. • In un’altra definizione di UDT, o in un comando CREATE TABLE, usa il nome dell’ UDT come tipo dell’ attributo. J. Ullman -ORDBMS
I valori dei componenti addr e favBeer sono oggetti con 3 e 2 campi, rispettivamente. Esempio: tipo colonna CREATE TYPE AddrType AS ( street CHAR(30), city CHAR(20), zip INT ); CREATE TABLE Drinkers ( name CHAR(30), addr AddrType, favBeer BeerType ); J. Ullman -ORDBMS
Problema Oracle con l’accesso ai campi • Si può accedere ad un campo C di un oggetto che è il valore di un attributo A by A.C. • Però, si deve usare un alias, diciamo rr, per la relazione R con attributo A, come rr.A.C. J. Ullman -ORDBMS
Esempio: accesso ai campi in Oracle • Sbagliato: SELECT favBeer.name FROM Drinkers; • Sbagliato: SELECT Drinkers.favBeer.name FROM Drinkers; • Corretto: SELECT dd.favBeer.name FROM Drinkers dd; J. Ullman -ORDBMS
Seguire i REF • A -> B ha senso se: • A è di tipo REF T. • B è un attributo (componente) di oggetti di tipo T. • Denota il valore del componente B dell’oggetto puntato da A. J. Ullman -ORDBMS
Poi usa la freccia Per ottenere il nome del bar e della birra referenziati Prima, usa i metodi generatori per accedere alle componenti bar and beer Esempio: Seguire i REF • Ricorda: Sells è una relazione con riga MenuType(bar, beer, price), dove bar and beer sono REF a oggetti di tipo BarType and BeerType. • Trova le birre servite da Joe: SELECT ss.beer()->name FROM Sells ss WHERE ss.bar()->name = ’Joe’’s Bar’; J. Ullman -ORDBMS
Seguire i REF: Stile Oracle • Seguire i REF è implicito nel punto. • Basta far seguire un REF da un punto e un campo dell’oggetto riferito. • Esempio: SELECT ss.beer.name FROM Sells ss WHERE ss.bar.name = ’Joe’’s Bar’; J. Ullman -ORDBMS
Operatore DEREF di Oracle - Motivazione • Se vogliamo l’insieme degli oggetti birra per le birre vendute da Joe, possiamo provare: SELECT ss.beer FROM Sells ss WHERE ss.bar.name = ‘Joe’’s Bar’; • Legale, ma ss.beer è un REF, quindi senza significato. J. Ullman -ORDBMS
Uso di DEREF in Oracle • Per vedere gli oggetti BeerType, si usi: SELECT DEREF(ss.beer) FROM Sells ss WHERE ss.bar.name = ’Joe’’s Bar’; • che produce valori tipo: BeerType(’Bud’, ’Anheuser-Busch’) J. Ullman -ORDBMS
Metodi --- Sintassi Oracle • Le classi non hanno solo la struttura; possono avere anche metodi. • Studieremo la sintassi di Oracle. Si dichiarano in CREATE TYPE, e si definiscono con il comando CREATE TYPE BODY. • Useremo la sintassi PL/SQL per i metodi. • La variabile SELF si riferisce all’ oggetto al quale il metodo è applicato. J. Ullman -ORDBMS
Il nome dei Metodi in Oracle. “Write no database state.” Cioè, qualunque cosa priceInYen faccia non modificherà il database. Esempio: dichiarazione di metodo • Si aggiunga il metodo priceInYen a MenuType. CREATE TYPE MenuType AS OBJECT ( bar REF BarType, beer REF BeerType, price FLOAT, MEMBER FUNCTION priceInYen(rate IN FLOAT) RETURN FLOAT, PRAGMA RESTRICT_REFERENCES(priceInYen, WNDS) ); / J. Ullman -ORDBMS
Definizione di Metodi –Stile di Oracle • Forma del comando create-body : CREATE TYPE BODY <type name> AS <definizione dei metodi = definizioni di procedure in PL/SQL , usando “MEMBER FUNCTION” al posto di “PROCEDURE”> END; / J. Ullman -ORDBMS
Non c’è il modo (IN) nel body, solo nella dichiarazione Usa le parentesi solo quando c’è almeno un argomento. Esempio: Definizione di Metodi CREATE TYPE BODY MenuType AS MEMBER FUNCTION priceInYen(rate FLOAT) RETURN FLOAT IS BEGIN RETURN rate * SELF.price; END; END; / J. Ullman -ORDBMS
Uso di un metodo • Far seguire il nome di un oggetto da un punto e il nome del metodo,con gli argomenti , se ce ne sono. • Esempio: SELECT ss.beer.name, ss.priceInYen(120.0) FROM Sells ss WHERE ss.bar.name = ’Joe’’s Bar’; J. Ullman -ORDBMS
Metodi di ordinamento : SQL:1999 • Ogni UDT T può definire due metodi chiamati EQUAL and LESSTHAN. • Ognuno prende un argomento di tipo T ed è applicato ad un altro oggetto di tipo T. • Ritorna TRUE se e solo se l’oggetto target è = (risp. <) all’oggetto argomento. • Consente di comparare oggetti di tipo T mediante =, <, etc. nelle clausole WHERE e per l’ordinamento (ORDER BY). J. Ullman -ORDBMS
Metodi di ordinamento : Oracle • Ogni metodo per un UDT può essere dichiarato come un metodo di ordinamento • Il metodo di ordinamento restituisce un valore <0, =0, o >0, a seconda che il valore dell’ oggetto SELF is <, =, o > dell’oggetto argomento. J. Ullman -ORDBMS
Read/write no database state/package state. Un “package” è una collezione of procedure and variabili Che possono comunicarsi valori tra di loro. Esempio: dichiarazione di un metodo di ordinamento. • Ordina gli oggetti BarType per nome: CREATE TYPE BarType AS OBJECT ( name CHAR(20), addr CHAR(20), ORDER MEMBER FUNCTION before( bar2 IN BarType) RETURN INT, PRAGMA RESTRICT_REFERENCES(before, WNDS, RNDS, WNPS, RNPS) ); / J. Ullman -ORDBMS
Esempio: definizione di un metodo di ordinamento CREATE TYPE BODY BarType AS ORDER MEMBER FUNCTION before(bar2 BarType) RETURN INT IS BEGIN IF SELF.name < bar2.name THEN RETURN –1; ELSIF SELF.name = bar2.name THEN RETURN 0; ELSE RETURN 1; END IF; END; END; / J. Ullman -ORDBMS
Tabelle innestate in ORACLE • Il valore di un componente di una tupla può essere un’intera relazione. • SeT is a UDT, possiamo creare un tipo S i cui valori sono relazioni con tipo riga T, per mezzo di: CREATE TYPE S AS TABLE OF T ; J. Ullman -ORDBMS
Esempio: tipo tabella innestata CREATE TYPE BeerType AS OBJECT ( name CHAR(20), kind CHAR(10), color CHAR(10) ); / CREATE TYPE BeerTableType AS TABLE OF BeerType; / J. Ullman -ORDBMS
Esempio --- Continua • Usa BeerTableType in una relazione Manfs che memorizza l’insieme delle birre prodotte da ciascun produttore in una tupla per quel produttore. CREATE TABLE Manfs ( name CHAR(30), addr CHAR(50), beers beerTableType ); J. Ullman -ORDBMS
Memorizzare relazioni innestate • Oracle non memorizza ciascuna relazione innestata come una relazione separata --- fa solo apparire di farlo. • Piuttosto, c’è una relazione R in cui tutte le tuple delle tabelle innestate per un attributo A sono memorizzate. • Dichiarata nella CREATE TABLE con: NESTED TABLE A STORE AS R J. Ullman -ORDBMS
Si noti dove il punto e virgola va e dove non va. Esempio: memorizzazione di tabelle innestate CREATE TABLE Manfs ( name CHAR(30), addr CHAR(50), beers beerTableType ) NESTED TABLE beers STORE AS BeerTable; J. Ullman -ORDBMS
Interrogare una tabella innestata • Possiamo stampare il valore di una tabella innestata come ogni altro valore. • Ma questi valori hanno due costruttori di tipo : • Per la tabella. • Per il tipo delle tuple nella tabella. J. Ullman -ORDBMS
Esempio: interrogare una tabella innestata • Trova le birre prodotte da Anheuser-Busch: SELECT beers FROM Manfs WHERE name = ’Anheuser-Busch’; • Produce un valore come: BeerTableType( BeerType(’Bud’, ’lager’, ’yellow’), Beertype(’Lite’, ’malt’, ’pale’),… ) J. Ullman -ORDBMS
Interrogazioni con una tabella innestata • Una tabella innestata può essere convertita in una relazione ordinaria applicando THE(…). • Questa relazione può essere usata nelle clausole FROM come ogni altra relazione. J. Ullman -ORDBMS
The one nested table for the Anheuser-Busch beers Un alias per la tabella in- nestata, che non ha nome Esempio: Uso di THE • Trova le ale prodotte da Anheuser-Busch: SELECT bb.name FROM THE( SELECT beers FROM Manfs WHERE name = ’Anheuser-Busch’ ) bb WHERE bb.kind = ’ale’; J. Ullman -ORDBMS
Trasformare relazioni in tabelle innestate • Ogni relazione con il giusto numero e tipo di attributi può diventare il valore di una tabella innestata. • Usa CAST(MULTISET(…) AS <tipo> ) nella relazione per trasformarla nel valore con il giusto tipo per una tabella innestata. J. Ullman -ORDBMS
Esempio: CAST --- 1 • Si supponga di avere una relazione Beers(beer, manf), dove beer è un oggetto BeerType e manf una stringa --- il produttore della birra. • Vogliamo inserire in Manfs una nuova tupla, con Pete’s Brewing Co. come nome and l’insieme di birre che sono quelle in Beers per Pete’s. J. Ullman -ORDBMS
L’insieme di oggetti BeerType per Pete’s Trasforma l’insieme di oggetti In una relazione innestata Esempio: CAST --- 2 INSERT INTO Manfs VALUES ( ’Pete’’s’, ’Palo Alto’, CAST( MULTISET( SELECT bb.beer FROM Beers bb WHERE bb.manf = ’Pete’’s’ ) AS BeerTableType ) ); J. Ullman -ORDBMS