1 / 50

6b –Basi di dati Relazionali ad oggetti : approfondimenti

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.

tex
Download Presentation

6b –Basi di dati Relazionali ad oggetti : approfondimenti

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 6b –Basi di dati Relazionali ad oggetti : approfondimenti Tipi definiti dall’utente ID di Oggetti Tabelle innestate J. Ullman -ORDBMS

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. Esempio: Creare una relazione CREATE TABLE Bars OF BarType; CREATE TABLE Beers OF BeerType; CREATE TABLE Sells OF MenuType; J. Ullman -ORDBMS

  12. 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

  13. Esempio: Costruttore di tipo • La query SELECT * FROM Bars; • Produce “tuples” come: BarType(’Joe’’s Bar’, ’Maple St.’) J. Ullman -ORDBMS

  14. 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

  15. 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

  16. Esempio: accesso ai valori in SQL:1999 • La stessa query in SQL:1999 è SELECT bb.name(), bb.addr() FROM Bars bb; J. Ullman -ORDBMS

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

  28. 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

  29. 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

  30. 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

  31. 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

  32. 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

  33. 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

  34. 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

  35. 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

  36. 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

  37. 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

  38. 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

  39. 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

  40. 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

  41. 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

  42. 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

  43. 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

  44. 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

  45. 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

  46. 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

  47. 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

  48. 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

  49. 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

  50. 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

More Related