Post on 26-Jul-2020
Dati relazionali e XML
SQL/XML
2
Introduzione (1)
DBMS relazionale
Applicazione
Applicazione
Applicazione
Memorizzazione dei dati Utilizzo dei dati
XML
XML
SQL/XML
3
Introduzione (2)
DBMS relazionale
Applicazione
Applicazione
Applicazione
Utilizzo dei dati
XML
XML
Oggi gran parte dei dati viene memorizzata in database relazionali.
Memorizzazione dei dati
SQL/XML
4
Introduzione (3)
DBMS relazionale
Applicazione
Applicazione
Applicazione
Utilizzo dei dati
XML
XML
Numerose applicazioni utilizzano XML come formato di scambio e manipolazione dei dati.
Memorizzazione dei dati
SQL/XML
5
Introduzione (4)
! XML viene utilizzato principalmente per due tipi di attività di data management: ! Scambio di dati tra applicazioni. ! Rappresentazione di dati semi-strutturati.
! Quando i dati scambiati tra diverse applicazioni sono localmente memorizzati in database relazionali, è necessario un “ponte” tra questi due formati.
! SQL/XML, che è un’estensione standard di SQL, fornisce un linguaggio comune per convertire dati relazionali in XML.
SQL/XML
6
Funzionalità: SQL->XML e XML->SQL
! Per utilizzare congiuntamente dati relazionali e XML occorrono due funzionalità principali: ! Estrazione di XML da una o piu' tabelle relazionali. ! Memorizzazione di XML in una (o più) tabelle relazionali.
! La prima funzionalità è concettualmente più semplice, in quanto XML nasce allo scopo di rappresentare dati sia semi-strutturati che strutturati.
! La seconda è in generale più complessa, per lo stesso motivo.
Dati Strutturati Dati semi-strutturati SQL
XML Dato rappresentabile sia in relazionale che in XML
Dato difficilmente rappresentabile in relazionale
SQL/XML
7
Estrarre XML da una tabella
! Estrarre dati XML a partire da una tabella e' semplice, perche' qualsiasi dato rappresentabile in una tabella e' anche rappresentabile in XML.
! Vediamo due modi alternativi per realizzare questa funzionalità.
XML
SQL/XML
8
1: Estrarre XML da una tabella (XML + XQuery)
! Rappresentare la tabella in XML (mappatura). ! Estrarre dati utilizzando tecnologie XML (XQuery).
XML XML mappatura XQuery
SQL/XML
9
IMPIEGATIID NOME COGNOME SALARIO
imp0001 Mario Rossi 20000imp0002 Giorgio Bianchi 18000
XML XML mappatura XQuery
Partiamo da una tabella relazionale.
SQL/XML
10
XML XML mappatura XQuery
! La mappatura avviene nel seguente modo: ! Il nome della tabella diventa il nome del documento. ! Ogni riga viene inclusa in un elemento <row>. ! Ogni valore (colonna) viene incluso in un elemento con il nome
dell'attributo. ! Valori nulli vengono rappresentati tramite l'attributo xsi:nil="true".
SQL/XML
11
<IMPIEGATI> <row> <ID>imp0001</ID> <NOME>Mario</NOME> <COGNOME>Rossi</COGNOME> <SALARIO>20000</SALARIO> </row> <row> <ID>imp0002</ID> <NOME>Giorgio</NOME> <COGNOME>Bianchi</COGNOME> <SALARIO>18000</SALARIO> </row> </IMPIEGATI>
XML XML mappatura XQuery
Questa è la mappatura definita da SQL/XML.
SQL/XML
12
<xsd:simpleType name="CHAR_6"> <xsd:restriction base="xsd:string"> <xsd:length value="6" /> </xsd:restriction> </xsd:simpleType>
XML XML mappatura XQuery
! Lo standard definisce inoltre uno schema XML contenente le definizioni per ogni tipo di dato SQL e ogni elemento XML.
! Ad esempio, CHARACTER(6) produce:
Frammento di XML Schema, fornito solo a titolo di esempio (non è necessario ricordarne i dettagli)
SQL/XML
13
<salariAlti> { for $e in table("IMPIEGATI")/IMPIEGATI/row where $e/salario > 18000 return <impiegato> {$e/cognome, $e/nome} </impiegato> } </salariAlti>
Funzione NON standard XQuery.
XML XML mappatura XQuery
Interrogazione XQuery, fornita solo a titolo di esempio (XQuery non viene approfondito in questi lucidi)
SQL/XML
14
XML XML mappatura XQuery
! Il risultato è il seguente:
<salariAlti> <impiegato> <nome>Mario</nome> <cognome>Rossi</cognome> </impiegato> </salariAlti>
SQL/XML
15
2: Estrarre XML da una tabella (SQL/XML)
! Estrarre dati dalla tabella (SQL). ! Trasformare questi dati in XML (SQL/XML).
XML Query SQL SQL/XML
SQL/XML
16
XML Query SQL SQL/XML
IMPIEGATIID NOME COGNOME SALARIO
imp0001 Mario Rossi 20000imp0002 Giorgio Bianchi 18000
Partiamo dalla stessa tabella dell’esempio precedente.
SQL/XML
17
XML Query SQL SQL/XML
SELECT i.nome AS nomeImpiegato FROM IMPIEGATI i WHERE salario > 18000
Scriviamo un’interrogazione SQL che ritorni i dati di interesse.
SQL/XML
18
XML Query SQL SQL/XML
SELECT i.nome AS nomeImpiegato FROM IMPIEGATI i WHERE salario > 18000
nomeImpiegato
Mario
Giorgio
SQL/XML
19
XML Query SQL SQL/XML
SELECT XMLELEMENT( NAME "imp", i.nome ) AS nomeImpiegato FROM IMPIEGATI i WHERE salario > 18000
Aggiungiamo i costruttori XML.
SQL/XML
20
XML Query SQL SQL/XML
SELECT XMLELEMENT( NAME "imp", i.nome ) AS nomeImpiegato FROM IMPIEGATI i WHERE salario > 18000
nomeImpiegato
<imp>Mario</imp>
<imp>Giorgio</imp>
Più propriamente, in questo modo non si estrae direttamente dell’XML, bensì tabelle contenenti XML, che può poi essere recuperato ed utilizzato come tale.
SQL/XML
21
Inserimento di XML in DB Relazionali
! Per garantire questa funzionalità, sistemi differenti utilizzano tecniche ad hoc.
! Queste si possono ricondurre a due modalità principali: ! Utilizzo di colonne Object-Relational per memorizzare interi
frammenti XML in un unico campo. ! Shredding (“spezzettamento”) dei documenti, per cui elementi
differenti vengono memorizzati in campi differenti.
SQL/XML
22
Inserire XML (1)
! Un documento XML puo' essere considerato come un tipo di dato di SQL.
! In questo caso, un intero documento viene memorizzato in un attributo (colonna) di una tabella.
XML
XML
XML
XML
SQL/XML
23
Inserire XML (2)
! Con qualche limitazione, un documento XML puo' essere spezzato in frammenti e memorizzato a pezzi.
<impiegato> <ID>imp0001</ID> <COGNOME>Rossi</COGNOME> <SALARIO>20000</SALARIO> </impiegato> <impiegato> <ID>imp0002</ID> <COGNOME>Bianchi</COGNOME> <SALARIO>18000</SALARIO> </impiegato>
ID COGNOME SALARIOimp0001 Rossi 20000imp0002 Bianchi 18000
FILE DI DEFINIZIONE DEL MAPPING
Il linguaggio SQL/XML
SQL/XML
25
Estrarre XML tramite SQL/XML (1)
! SQL/XML definisce i seguenti operatori. ! XMLELEMENT ! XMLFOREST ! XMLCONCAT ! XMLAGG ! XMLGEN
XML Query SQL SQL/XML
SQL/XML
26
Estrarre XML tramite SQL/XML (2)
! Una query SQL/XML ha la seguente struttura: SELECT Attr1, Attr2, ..., Costruttore XML FROM... WHERE...
! Per calcolarne il risultato, ! PRIMA si considera solo SQL, e si calcola una
tabella come se fosse SELECT *. ! POI si costruisce il risultato, selezionando gli
attributi richiesti (Attr1, Attr2...) e costruendo il codice XML PER OGNI TUPLA.
SQL/XML
27
Tabella utilizzata negli esempi
id nome cognome dipartimento licenziato salario
imp0001 Mario Rossi Vendite null 20000
imp0002 Giorgio Bianchi Vendite null 18000
imp0003 Luca Verdi Contabilità null 15000
imp0004 Gianni Neri Contabilità 01/01/03 15000
IMPIEGATO
SQL/XML
28
XMLELEMENT
! XMLELEMENT permette di creare un elemento XML. ! Come argomenti prende:
! Il nome dell'elemento. ! Una eventuale lista di attributi. ! Il contenuto dell'elemento.
SQL/XML
29
XMLELEMENT – esempio
SELECT i.id, XMLELEMENT( NAME "imp", i.nome ) AS risultato FROM IMPIEGATI i
SQL/XML
30
XMLELEMENT – esempio
SELECT i.id, XMLELEMENT( NAME "imp", i.nome ) AS risultato FROM IMPIEGATI i
nome dell'elemento
contenuto
SQL/XML
31
XMLELEMENT – risultato
SELECT i.id, XMLELEMENT( NAME "imp", i.nome ) AS risultato FROM IMPIEGATI i
nome dell'elemento
contenuto
id risultato
imp0001 <imp>Mario</imp>
imp0002 <imp>Giorgio</imp> imp0003 <imp>Luca</imp> imp0004 <imp>Gianni</imp>
SQL/XML
32
XMLELEMENT
! Il contenuto di un elemento puo' essere formato concatenando piu' valori SQL.
! L'operatore di concatenazione e' ||.
SQL/XML
33
XMLELEMENT
SELECT i.id, XMLELEMENT( NAME "imp", i.nome || ' ' || i.cognome ) AS risultato FROM IMPIEGATI i
id risultato
imp0001 <imp>Mario Rossi</imp>
imp0002 <imp>GiorgioBianchi</imp> imp0003 <imp>Luca Verdi</imp> imp0004 <imp>Gianni Neri</imp>
SQL/XML
34
XMLATTRIBUTES
! Per dichiarare una lista di attributi si utilizza l'operatore XMLATTRIBUTES.
! Ogni parametro di XMLATTRIBUTES viene inserito in un attributo che, se non dichiarato esplicitamente, prende il nome della colonna relazionale dalla quale e' stato selezionato.
SQL/XML
35
XMLELEMENT ed XMLATTRIBUTES
SELECT i.id, XMLELEMENT( NAME "imp", XMLATTRIBUTES(i.salario as "sal"), i.nome || ' ' || i.cognome ) AS risultato FROM IMPIEGATI i
id risultato
imp0001 <imp sal="20000">Mario Rossi</imp>
imp0002 <imp sal="18000">Giorgio Bianchi</imp> imp0003 <imp sal="15000">Luca Verdi</imp> imp0004 <imp sal="15000">Gianni Neri</imp>
SQL/XML
36
XMLELEMENT
! Nel contenuto di un elemento si possono specificare piu' oggetti, sia elementi sia stringhe di caratteri.
! Proviamo a creare un elemento che contenga altri due elementi e del testo.
SQL/XML
37
XMLELEMENT – esempio SELECT i.id, XMLELEMENT( NAME "imp", XMLELEMENT( NAME "co", i.cognome), ' del dipartimento ', XMLELEMENT( NAME "dip", i.dipartimento) ) AS risultato FROM IMPIEGATI i
Come detto, il primo parametro specifica
il nome dell’elemento risultante.
SQL/XML
38
XMLELEMENT – esempio SELECT i.id, XMLELEMENT( NAME "imp", XMLELEMENT( NAME "co", i.cognome), ' del dipartimento ', XMLELEMENT( NAME "dip", i.dipartimento) ) AS risultato FROM IMPIEGATI AS i
Di seguito sono elencati i contenuti. In ordine,
specifichiamo un elemento <co>,
un contenuto testuale, un elemento <dip>.
SQL/XML
39
XMLELEMENT – risultato
id risultato imp0001 <imp><co>Rossi</co> del dipartimento
<dip>Vendite</dip></imp>
imp0002 <imp><co>Bianchi</co> del dipartimento <dip>Vendite</dip></imp>
imp0003 <imp><co>Verdi</co> del dipartimento <dip>Contabilità</dip></imp>
imp0004 <imp><co>Neri</co> del dipartimento <dip>Contabilità</dip></imp>
SQL/XML
40
XMLFOREST
! XMLFOREST e' un modo rapido per produrre una lista di elementi semplici.
! Il comportamento dei suoi parametri e' lo stesso di XMLATTRIBUTES.
SQL/XML
41
XMLFOREST – esempio
SELECT i.id, XMLELEMENT( NAME "imp", XMLFOREST( i.nome, i.cognome AS "co", i.dipartimento AS "dip") ) AS risultato FROM IMPIEGATI i
In mancanza di un nome esplicito, viene utilizzato il nome della colonna corrispondente.
SQL/XML
42
XMLFOREST – risultato
id risultato
imp0001 <imp><nome>Mario</nome> <co>Rossi</co><dip>Vendite</dip></imp>
imp0002 <imp><nome>Giorgio</nome> <co>Bianchi</co><dip>Vendite</dip></imp>
imp0003 <imp><nome>Luca</nome><co>Verdi</co> <dip>Contabilità</dip></imp>
imp0004 <imp><nome>Gianni</nome><co>Neri</co> <dip>Contabilità</dip></imp>
SQL/XML
43
XMLCONCAT
! XMLCONCAT concatena i suoi argomenti, producendo una foresta di elementi.
! XMLCONCAT puo' concatenare anche elementi costruiti tramite XMLELEMENT.
SQL/XML
44
XMLCONCAT – esempio
SELECT i.id, XMLCONCAT( XMLELEMENT( NAME "co", i.cognome), XMLELEMENT( NAME "dip", i.dipartimento) ) AS risultato FROM IMPIEGATI i
SQL/XML
45
XMLCONCAT – risultato
id risultato imp0001 <co>Rossi</co>
<dip>Vendite</dip> imp0002 <co>Bianchi</co>
<dip>Vendite</dip> imp0003 <co>Verdi</co>
<dip>Contabilità</dip> imp0004 <co>Neri</co>
<dip>Contabilità</dip>
SQL/XML
46
XMLAGG
! Nel caso sia necessario aggregare piu' tuple sulla base di uno o piu' attributi, SQL utilizza il costrutto GROUP BY.
! XMLAGG permette di recuperare le tuple aggregate dal GROUP BY.
SQL/XML
47
XMLAGG
<dip nome="Contabilità"> <imp></imp> <imp></imp> </dip>
id nome cognome dipartimento licenziato salario
imp0001 Mario Rossi Vendite null 20000
imp0002 Giorgio Bianchi Vendite null 18000
imp0003 Luca Verdi Contabilità null 15000
imp0004 Gianni Neri Contabilità 01/01/03 15000
<dip nome="Vendite"> <imp></imp> <imp></imp> </dip>
SQL/XML
48
XMLAGG
SELECT XMLELEMENT( NAME "dipartimento", XMLATTRIBUTES(i.dipartimento AS "nome"), XMLAGG( XMLELEMENT( NAME "imp", i.cognome) ) ) AS risultato FROM IMPIEGATI i GROUP BY dipartimento
SQL/XML
49
XMLAGG
risultato <dipartimento nome="Vendite"> <imp>Rossi</imp> <imp>Bianchi</imp> </dipartimento> <dipartimento nome="Contabilità"> <imp>Verdi</imp> <imp>Neri</imp> </dipartimento>
SQL/XML
50
XMLGEN
! Un'altra possibilita' per creare XML e' XMLGEN. ! E' possibile specificare esplicitamente il codice XML,
inserendovi dati tramite variabili, indicate tra parentesi graffe.
! Le variabili possono essere utilizzate anche per i nomi degli elementi, cosa non possibile tramite XMLELEMENT, che prevede che i nomi degli elementi vengano forniti esplicitamente tramite una costante.
SQL/XML
51
XMLGEN
SELECT XMLGEN( '<impiegato> <nome>{$nome}</nome> <salario>{$sal}</salario> </impiegato>', i.nome, i.salario AS "sal" ) AS risultato FROM IMPIEGATI i WHERE salario > 15000
Riferimento per nome
SQL/XML
52
XMLGEN
risultato
<impiegato> <nome>Rossi</nome> <salario>20000</salario> </impiegato>
<impiegato> <nome>Bianchi</nome> <salario>18000</salario> </impiegato>
SQL/XML
53
Le specifiche di SQL/XML
! ISO/IEC 9074-14:2003 ! Corrispondente a quanto trattato nei presenti lucidi.
! ISO/IEC 9075-14:2006 ! Aggiunge la possibilità di eseguire interrogazioni in XQuery,
di cui viene adottato il modello dei dati, e di validare documenti XML.
! ISO/IEC 9075-14:2008 ! La più recente, non ancora diffusa e adottata.
SQL/XML
54
Riferimenti
! Alcuni articoli su SQL/XML: ! Una descrizione dello standard descritto in questi lucidi:
www.acm.org/sigmod/record/issues/0206/standard.pdf ! Un approfondimento sulle nuove funzionalità:
www.sigmod.org/sigmod/record/issues/0409/11.JimMelton.pdf ! Alcuni sistemi che supportano SQL/XML:
! Oracle database server. ! DB2.