Basi di Dati Distribuite
a.a. 2004/2005
XML e Sistemi per la
Gestione
di Basi di Dati
Relazionali
Luca Noce - [email protected]
Elisa Marino - [email protected]
Obiettivi
Necessità di conciliare dati
relazionali(e SQL)con XML
●
Estrazione di XML da tabelle
relazionali
●
Memorizzazione di XML in
tabelle relazionali
●
DBMS per XML
I DBMS relazionali già esistenti sono
stati estesi per supportare XML. Il
formato di memorizzazione restano le
tabelle, in cui possono essere
memorizzati dati in formato XML e da
cui possono essere estratti dati
formattati ancora in XML
●
La diversità di fondo tra dati
relazionali e dati XML ha portato anche
alla produzione di sistemi cosiddetti
nativi XML, che gestiscono i dati XML
direttamente senza tradurli in tabelle
●
DBMS per XML
Al momento, la giovane età dei DBMS
nativi fa sì che si tenda a preferire
l’utilizzo di DBMS relazionali, di più
sicura affidabilità provata nel tempo
●
Vediamo brevemente le motivazioni che
hanno portato all'introduzione del
formato XML nel contesto delle basi di
dati
●
Formato dei Dati
Memorizzazione dei dati
Utilizzo dei dati
Formato dei Dati
Memorizzazione dei dati
Oggi gran parte dei dati di
utilizzo comune vengono
memorizzati in DBMS relazionali
Utilizzo dei dati
Formato dei Dati
Memorizzazione dei dati
Sempre più applicazioni
utilizzano XML come formato di
scambio e manipolazione di
informazioni
Utilizzo dei dati
Formato dei Dati
Memorizzazione dei dati
Ciò crea un problema di
compatibilità tra memorizzazione
ed utilizzo di dati
Utilizzo dei dati
Formato dei Dati
Memorizzazione dei dati
Fino a che non verranno
migliorate le implementazioni
dei DBMS nativi, sarà necessario
interfacciare DBMS ed XML
Utilizzo dei dati
Operazioni
Le operazioni che analizzaremo saranno
le seguenti:
Estrazione di documenti nel formato
XML da una o più tabelle relazionali
estrarre informazioni in formato XML a
partire da una tabella è un'operazione
semplice, poichè qualsiasi dato
rappresentato in una tabella è anche
rappresentabile in XML
Memorizzazione di documenti in
formato XML in una o più tabelle
relazionali
Estrazione di XML
1. Tramite mappatura delle tabelle
in XML e interrogazione tramite
XQuery
2. Tramite SQL, con operatori che
producono output in XML
3. Tramite viste predefinite
(soluzione ad hoc poco flessibile)
Estrazione di XML
1. Tramite mappatura delle tabelle
in XML e interrogazione tramite
XQuery
2. Tramite SQL, con operatori che
producono output in XML
XML-Related Specifications
(SQL/XML)
Estensioni di SQL
XML-Related Specifications (SQL/XML)
●
SQL/XML fa parte dello standard SQL
Principalmente, questo standard
definisce:
●
●
Una mappatura (vista) in XML su dati
relazionali
●
Un nuovo tipo di dato (XML),
utilizzabile come dominio in una tabella
relazionale
●
Alcuni operatori per la pubblicazione di
XML a partire da dati relazionali
Estrazione di XML tramite mapping
L'operazione di mapping produce
due documenti XML:
●
A)Contiene i dati di una o più
tabelle mappate del DBMS
B)Contiene un XML-Schema che
descrive il primo documento
A)Mappatura delle tabelle in XML
La mappatura di relazioni in XML può
essere utilizzata per poi interrogare
direttamente i dati in formato XML (ad
esempio tramite XQuery)
●
●
Vediamo un esempio:
A)Mappatura delle tabelle in XML
Vediamo qui rappresentata la tabella
IMPIEGATO della nostra base di dati che
intendiamo mappare in formato XML
Algoritmo di Mappatura
1.Il nome della tabella diventa il
nome del tag XML radice (<IMPIEGATO>)
2.Ogni riga della tabella deve
essere contenuta all'interno di un
tag XML denominato <row>
Algoritmo di Mappatura
1.
2.
3.Ogni tag XML <row> contiene una
sequenza di tag XML colonna, ognuno
dei quali avente il nome della
colonna della tabella di partenza
4.I valori dei dati vengono
prodotti usando il mapping da SQL
data values ad XML
Mappatura di output
corrispondente:
Risultato della Mappatura
Null Values
L'utente ha la possibilità di specificare
come i valori nulli debbano essere mappati.
I due comportamenti che sono stati previsti
prendono il nome di nil e absent
Se volessimo utilizzare nil, utilizzeremmo
l'attributo xsi:nil="true" per marcare
elementi colonna rappresentanti valori nulli:
●
Null Values
Se volessimo invece utilizzare absent,
allora le colonne con valori nulli (come
Birthdate nell'esempio) saranno rappresentate
dall'assenza del corrispondente elemento
colonna:
B)Generazione di un XML-Schema
Deve essere generato un unico file XML-Schema
contenente tutti i tipi di dato richiesti per
descrivere la(e) tabella(e) che si intende
mappare
E' necessario generare un XML-Schema type per
ogni colonna della tabella relazionale
I nomi utilizzati per gli XML-Schema Data Types
corrispondenti agli SQL Data Types sono semplici
ed immediati, come per esempio:
B)Generazione di un XML-Schema
Il file XML-Schema relativo al nostro esempio
sarà il seguente:
<xsd:schema>
<xsd:simpleType name=”CHAR_7”>
<xsd:restriction base=”xsd:string”>
<xsd:length value=”7”/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name=”Integer”>
<xsd:restriction base=”xsd:integer”/>
</xsd:simpleType>
B)Generazione di un XML-Schema
<xsd:complexType
name="RowType.IMPIEGATI">
<xsd:sequence>
<xsd:element
name="id" type="CHAR_7"/>
<xsd:element
name="nome" type="CHAR_7"/>
<xsd:element
name="cognome" type="CHAR_7"/>
<xsd:element
name="salario" type="Integer"/>
</xsd:sequence>
</xsd:complexType>
B)Generazione di un XML-Schema
<xsd:complexType
name="TableType.IMPIEGATI">
<xsd:sequence>
<xsd:element name="row"
type="RowType.IMPIEGATI"
minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="IMPIEGATI"
type="TableType.IMPIEGATI"/>
</xsd:schema>
XQuery
È un linguaggio di interrogazione completo che
utilizza path expression di XPath
E' possibile comporre le interrogazioni
utilizzando le seguenti istruzioni:
Clausola for
Dichiara variabili con cui si può iterare sugli elementi di un
documento
Clausola let
Per dichiarare nuove variabili
Clausola where
Per selezionare gli elementi che formano il risultato della
query
Clausola return
Per definire la struttura e il contenuto del risultato
Esempio di interrogazione con XQuery
In questo caso siamo interessati a conoscere
nome e cognome degli impiegati che riscuotono
un salario superiore a 18000:
<IMPIEGATISUPERPAGATI>
{ for $e in table("IMPIEGATI")/IMPIEGATI/row
where $e/salario > 18000
return
<IMPIEGATO>
{$e/cognome, $e/nome}
</IMPIEGATO>
Funzione NON Standard di
}
XQuery, ma presente in “XML
</IMPIEGATISUPERPAGATI>
for tables” per DB2
Esempio di interrogazione con XQuery
Risultato della XQuery:
<IMPIEGATISUPERPAGATI>
<IMPIEGATO>
<NOME>Mario</NOME>
<COGNOME>Rossi</COGNOME>
</IMPIEGATO>
</IMPIEGATISUPERPAGATI>
2)Estrazione di XML tramite SQL
XML data type in SQL/XML
Senza utilizzare la mappatura
precedentemente descritta, è possibile
estrarre dati XML utilizzando query
SQL, grazie all’aggiunta di operatori
SQL/XML
Oltre ad essere parte dello standard
SQL/XML, gli operatori che verranno
tra poco presentati sono implementati
da IBM per DB2
SQL/XML non è l’unica estensione
esistente di SQL per l'ottenimendo di
dati in XML, ma è la più adottata
2)Estrazione di XML tramite SQL
SQL/XML definisce i seguenti operatori:
XMLELEMENT
XMLFOREST
XMLCONCAT
XMLAGG
XMLGEN
2)Estrazione di XML tramite SQL
Struttura di una query SQL/XML:
SELECT Attr1, Attr2, ..., Costruttore XML
FROM... WHERE...
Tabella utilizzata negli esempi:
2)Estrazione di XML tramite SQL
XMLELEMENT
Permette di creare un elemento XML
Richiede i seguenti argomenti:
Il nome dell'elemento(tag XML)
Un'eventuale lista di attributi
(relativi sempre al tag XML)
Il contenuto dell'elemento
2)Estrazione di XML tramite SQL
XMLELEMENT
Esempio:
SELECT i.id, XMLELEMENT(
NAME "imp",
i.nome )
AS risultato
FROM IMPIEGATI i
2)Estrazione di XML tramite SQL
XMLELEMENT
Esempio:
SELECT i.id, XMLELEMENT(
NAME "imp",
i.nome )
AS risultato
FROM IMPIEGATI i
nome dell'elemento
contenuto
2)Estrazione di XML tramite SQL
XMLELEMENT
Esempio:
SELECT i.id, XMLELEMENT(
NAME "imp",
i.nome )
AS risultato
FROM IMPIEGATI i
nome dell'elemento
contenuto
2)Estrazione di XML tramite SQL
XMLELEMENT
Il contenuto di un elemento può
essere ottenuto anche concatenando
più valori SQL
L'operatore di concatenazione
previsto da XMLELEMENT è ||
2)Estrazione di XML tramite SQL
XMLELEMENT
Esempio:
SELECT i.id, XMLELEMENT(
NAME "imp",
i.nome ||''|| i.cognome)
AS risultato
FROM IMPIEGATI i
2)Estrazione di XML tramite SQL
XMLELEMENT
All'interno di un XMLELEMENT è
possibile specificare più oggetti,
siano essi altri tag che stringhe
di caratteri
Mostriamo ora un esempio in cui
un elemento XMLELEMENT contiene
altri due elementi assieme ad una
stringa di testo
2)Estrazione di XML tramite SQL
XMLELEMENT
Il primo
parametro
specifica
il nome
dell'elemen
to
risultante
SELECT i.id,
XMLELEMENT(
NAME "imp",
XMLELEMENT(
NAME "co",i.cognome),
'del dipartimento',
XMLELEMENT(
NAME "dip",i.dipartimento))
AS risultato
FROM IMPIEGATI i
2)Estrazione di XML tramite SQL
XMLELEMENT
Risultato della query:
2)Estrazione di XML tramite SQL
XMLATTRIBUTES
Permette di dichiarare una lista di
attributi relativi ad un tag XML
estratto tramite XMLELEMENT
Ogni attributo inserito tramite
XMLATTRIBUTES, se non seguito dal
comando “as”, prende il nome della
colonna della tabella relazionale
dalla quale viene estratto il valore
2)Estrazione di XML tramite SQL
XMLELEMENT ed XMLATTRIBUTES
SELECT i.id, XMLELEMENT(
NAME "imp",
XMLATTRIBUTES(i.salario as "sal"),
i.nome ||''|| i.cognome)
AS risultato
FROM IMPIEGATI i
2)Estrazione di XML tramite SQL
XMLFOREST
E' un modo rapido per produrre una lista di
elementi semplici:
In mancanza
SELECT i.id,
XMLELEMENT
( NAME "imp",
XMLFOREST(
i.nome,
i.cognome AS "co",
i.dipartimento AS "dip")
)
AS risultato
FROM IMPIEGATI i
del comando AS
viene ripreso
il nome della
colonna
corrispondente
al valore
scelto
2)Estrazione di XML tramite SQL
XMLFOREST
Risultato della query:
2)Estrazione di XML tramite SQL
XMLCONCAT
●
Produce una foresta di elementi
concatenando più XMLELEMENT
SELECT i.id,
XMLCONCAT
(
XMLELEMENT(NAME "co",i.cognome),
XMLELEMENT(NAME "dip",i.dipartimento)
)
AS risultato
FROM IMPIEGATI i
2)Estrazione di XML tramite SQL
XMLCONCAT
Risultato della query:
2)Estrazione di XML tramite SQL
XMLAGG
E' una funzione di aggregazione che
produce una foresta di elementi a
partire da una collezione di elementi
●
2)Estrazione di XML tramite SQL
XMLAGG
La query sarà del tipo:
SELECT XMLELEMENT(
NAME "dipartimento",
XMLATTRIBUTES(i.dipartimento AS "nome"),
XMLAGG(
XMLELEMENT(NAME "imp",i.cognome)
))
AS risultato
FROM IMPIEGATI i
GROUP BY dipartimento
2)Estrazione di XML tramite SQL
XMLAGG
Risultato della query:
2)Estrazione di XML tramite SQL
XMLGEN
●
E' possibile specificare esplicitamente il
codice XML, inserendovi dati tramite
variabili, indicate tra parentesi graffe
Le variabili possono essere utilizzate
anche per indicare i nomi degli elementi(tag
XML), cosa non attuabile tramite XMLELEMENT,
il quale prevede che i nomi degli elementi
vengano forniti in maniera esplicita
●
2)Estrazione di XML tramite SQL
XMLGEN
La query sarà del tipo:
SELECT XMLGEN(
'<impiegato>
<nome>{$nome}</nome>
<salario>{$sal}</salario>
</impiegato>',
i.nome,
i.salario AS "sal"
)
AS risultato
FROM IMPIEGATI i
WHERE salario > 15000
2)Estrazione di XML tramite SQL
XMLGEN
Risultato della query:
Memorizzazione di documenti in formato
XML in una o più tabelle relazionali
Questa risulta essere un' operazione
più complessa rispetto all'estrazione
●
●
Due possibili modalità di operare:
1.Inserire interi documento XML in
un’unica colonna, uno per tupla,
utilizzando un nuovo tipo di dato
(XML, XML data type in SQL/XML)
2.Spezzettare il documento in più
colonne e relazioni, secondo una
mappatura ad hoc
1) Inserimento di documenti XML
Un documento XML può essere
considerato come un tipo di dato di
SQL(XML, XML data type in SQL/XML)
●
In questo caso, un intero documento
viene memorizzato in un attributo
(colonna) di una tabella
●
2) Inserimento di documenti XML
Nel momento in cui la struttura di un
documento XML è abbastanza regolare, è
possibile spezzettarlo in più frammenti
e memorizzarne le varie parti:
●
2) Inserimento di documenti XML
Un piccolo esempio:
<impiegato>
<ID>imp0001</ID>
<COGNOME>Rossi</COGNOME>
<SALARIO>20000</SALARIO>
</impiegato>
<impiegato>
<ID>imp0002</ID>
<COGNOME>Bianchi</COGNOME>
<SALARIO>18000</SALARIO>
</impiegato>
Memorizzazione di documenti in formato
XML in una o più tabelle relazionali
SQL/XML descrive una mappatura standard da
tabelle ad XML, ma non viceversa
●
Questo è comprensibile, poichè XML è più
espressivo del modello relazionale, e quindi
la mappatura potrebbe essere difficoltosa
●
In mancanza di uno standard, vari DBMS
commerciali utilizzano tecniche ad hoc
●
Senza analizzare i dettagli, citiamo le
tecnologie utilizzate dai principali DBMS
●
Memorizzazione di documenti in formato
XML in una o più tabelle relazionali
ORACLE
Oracle utilizza XSU(XML/SQL Utility), una
interfaccia per java e PL/SQL (linguaggio di
●
programmazione proprietario di Oracle)
Tramite XSU, documenti XML con struttura
regolare possono essere inseriti in una o
più tabelle
●
La tecnologia object/relational di Oracle,
in cui una tabella può contenere altre
tabelle innestate, permette la mappatura
diretta delle annidazioni tra tag presenti
in documenti XML
●
Memorizzazione di documenti in formato
XML in una o più tabelle relazionali
DB2
DB2 utilizza un file XML (Data Access
Definition (DAD) file) in cui viene
specificata la mappatura dei documenti
passati in input
●
Quando un file XML deve essere inserito in
una o più tabelle, viene utilizzata la
funzione dxxShredXML() che prende come
parametro anche un file DAD
●
Il DAD descrive, per ogni elemento XML, la
colonna di destinazione
●
Memorizzazione di documenti in formato
XML in una o più tabelle relazionali
SQL Server
In SQL Server 2000 è possibile associare un
file XML ad una tabella tramite la funzione
OPENXML
●
OPENXML prende come parametro un documento
XML precedentemente aperto, e una specifica
della mappatura tra elementi XML e colonne
relazionali attraverso lo statement WITH
●
Bibliografia
[1]
XML Data Management
A.B.Chaudhri, A.Rashid, R.Zicari
Addison-Wesley
[2]
http://www.alphaworks.ibm.com/tech/xtable
[3]
http://www.acm.org/sigmod/record/issues/0206/standard.pdf
[4]
http://www.research.ibm.com/journal/sj/414/reinwald.pdf
Scarica

2)Estrazione di XML tramite SQL - Dipartimento di Ingegneria dell