Dati relazionali e XML - Plone sitemontesi/CBD/03SQLXML.pdf · 2013-10-11 · SQL/XML 6...

Post on 26-Jul-2020

7 views 0 download

Transcript of Dati relazionali e XML - Plone sitemontesi/CBD/03SQLXML.pdf · 2013-10-11 · SQL/XML 6...

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.