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