XML et bases de données
Bilan Modèle relationnel Modèle simple, puissant avec des fondements théoriques bien connus Modèle figé Importance du schéma de BD Utilisé pour le stockage efficace, la définition et l’optimisation de langage de requêtes, la cohérence, … Tout doit rentrer dans ce moule
Modèle des Fichiers Information pas ou peu structurée Structure est implicite et tolérante Pas de schéma des données Pas de langage de requêtes, pas d’optimisation, de cohérence Beaucoup de souplesse
Modèles de données semi-structurés Intermédiaire entre modèle relationnel (BD) et modèle de fichier Présence d’un schéma mais souple Possibilité de langages de requêtes Différentes propositions Modèle OEM XML
XML et BD relationnelles SQL XSLT, XPATH, XQUERY Modèle relationnel Modèle XPATH JDBC/ODBC/SQL-CLI DOM et SAX API Bases de données relationnelles Document XML
Introduction Modèle de données et langages de requêtes XML Publication XML de données relationnelles Stockage de documents XML
Langages de requêtes XML
Langages de requêtes XML XPATH (1.0 puis 2.0) langage commun de navigation, sélection, extraction Utilisé dans XSLT, XQUERY, XPOINTER, … XSLT 2.0 : XML vers XML, HTML, texte Langage à typage faible, orienté transformation XQUERY 1.0 : XML vers XML Langage fonctionnel à typage fort (entrées et sorties) Orienté accès BD
Langages de requêtes XPATH 2.0 = XPATH 1.0 + Typage XML schema Séquences ordonnées de nœuds typés et de valeurs atomiques For VAR in EXPR return EXPR Expression conditionnelles If EXPR then EXPR else EXPR Expressions quantifiées Some | every VAR in EXPR satisfies EXPR
Langages de requêtes XQUERY 1.0 = XPATH 2.0 + For-let-where-return (FLWR) : SQL like Sort-by Construction de XML Opérateurs sur les types Fonctions définies par le programmeur Typage fort (statique ou dynamique)
BD Guide (1) GuideExotique : <?xml version="1.0" encoding="ISO-8859-1" ?> <Guide region="exotique" version="2.0"> <Restaurant type="indhou" categorie="**"> <Nom>Le passage Brady</Nom> <Adresse> <No>43</No><Rue>Faubourg Saint-Denis</Rue><Ville>Paris 10</Ville> </Adresse> <Telephone>0142112310</Telephone> </Restaurant> <Restaurant type="thibetain" categorie="**"> <Nom>Le Lhassa</Nom> <Adresse> <No>13</No><Rue>Montagne Sainte-Genevieve</Rue><Ville>Paris 5</Ville> <Telephone>0144122112</Telephone><Manager>Dicky</Manager> <Epicerie type="egyptienne"> <Nom>Le Caire</Nom> <Telephone>0146134582</Telephone><Manager>Ali Moussa</Manager> <Specialité>falavel</Specialite> </Epicerie> </Guide>
BD Guide (2) GuideNormand: <?xml version="1.0" encoding="ISO-8859-1" ?> <Guide region="normandie" version="2.0"> <Restaurant type="francais" categorie="***"> <Nom>Le Grand Hotel</Nom> <Adresse> <Rue>Promenade M. Proust</Rue><Ville>Cabourg</Ville> </Adresse> <Prix menu="midi">200</Prix> <Prix menu="soir">300</Prix> </Restaurant> <Restaurant type="francais" categorie="**"> <Nom>L’absinthe</Nom> <Adresse> <No>10</No><Rue>Quai Quarantaine</Rue><Ville>Honfleur</Ville> <Prix menu="midi">150</Prix> <Prix menu="soir">250</Prix> <Telephone>0234142189</Telephone> <Specialité>Fruits de Mer</Specialite> </Guide>
BD Guide (3) BD XML = forêt de documents XML Schéma de BD = Schéma XML si existant Guide de données : Schéma faible généré à partir d’un ensemble de documents par union des arbres de structure décrivant tous les cheminements possibles dans la collection et par typage des données en texte Schéma plus flexible que schéma relationnel
Guide de données de Guide Nom No Restaurant X Adresse X Rue Code Ville Telephone Guide X Prix Nom 0,2 Manager Manager Telephone Epicerie X Specialite
BD Répertoire (1) <?xml version="1.0" encoding="ISO-8859-1" ?> <Repertoire> <Hotel categorie="***"> <Nom>California</Nom> <Adresse><Num>32</Num> <Rue>Rue des Ecoles</Rue><Code>75005</Code><Ville>Paris</Ville> </Adresse> <Commentaire>Charmant hotel pres du centre</Commentaire><Prix>150</Prix> </Hotel> <Hotel categorie="****"> <Nom>Napoleon</Nom> <Adresse><No>40</No> <Rue>Avenue de Friedland</Rue><Code>75008</Code><Ville>Paris</Ville> <Commentaire>Hotel Art Deco</Commentaire><Prix >500</Prix> <Nom>Le Saint Simon</Nom> <Adresse><No>32</No> <Rue>Rue Saint Simon</Rue><Code>75005</Code><Ville>Paris</Ville> <Commentaire>Proche restaurant celebre</Commentaire><Prix >300</Prix> </Repertoire>
Guide de données répertoire Num Nom Rue Repertoire X Hotel X Adresse X Ville Code Commentaire Prix
Fonctionnalités de XQUERY Navigation Support XPATH Sélection Jointure Tri Construction Recherche textuelle Fonction Imbrication agrégat
Expression XPATH Lister les noms des restaurants du guide normand document("http://gnormand.fr")//Restaurant/Nom/text() Lister les noms des restaurants de la forêt Guide collection("Guide")//Restaurant/Nom/text()
Expression FLWR for $var in <forêt> [, $var in <forêt>]... // itération let $var := <sous-arbre> // assignation where <condition> // élagage return <résultat> // construction
Flux de données FLWR For let where return Liste ordonnée De tuples De variables liées Liste élaguée De tuples De variables liées Instances XML
Exemples (1) Q1 : nom des restaurants de Cabourg (liste triée) for $R in collection("Guide")/Restaurant where $R/Adresse/Ville="Cabourg" return $R/Nom sortby Nom descending Q2 : Nom et adresse des restaurants deux étoiles where $R/@categorie="**" return <Restau2E>{$R/Nom} <Adresse>{$R/Adresse//text()}</Adresse> </Restau2E>
Exemples (2) Q3 : Rechercher toutes les valeurs des attributs des restaurants ayant un manager for $R in collection("Guide")/Restaurant where $R/Manager return <RestauAM> {for $A in $R//@* return $A} </RestauAM>
Exemples (3) Q4 : Noms et téléphones des restaurants situés dans la même ville que l’hotel Napoléon for $R in collection("Guide")//Restaurant, $H in collection("Repertoire")/Hotel where $R//Ville=$H//Ville and $H//Nom="Napoleon" return <RestauHRN> <Nom>{$R/Nom/text()} </Nom> <Tel> {$R/Telephone/text()} </Tel> </RestauHRN>
Exemples (4) Q5 : nombre de restaurants dans la collection Guide let $R := collection("Guide")/Restaurant Return <NbRest> {count($R)}</NbRest> Q6 : noms et adresses des restaurants dont la rue contient la chaine « Quai » for $R in collection("Guide")/Restaurant where contains($R//Rue, "Quai") return <Res>$R/Nom <Adr>{$R/Adresse//text()} </Adr> </Res>
Exemples (5) Q7 : Noms des restaurants par ville for $V in distinct-values (collection ("Guide") /Restaurant/Ville) return <Restauparville> <Ville>$V/text()</Ville> <Restaus> { for $R in collection("Guide")/Restaurant where $R//Ville=$V return $R/Nom } </Restaus> </Restauparville>
Exemples (6) Q8 : Adresse et deuxième prix des restaurants parsiens (pour ceux qui en ont deux) for $R in (for $S in collection("Guide")/Restaurant where $S/Prix[2] return $S) where $R/Ville="Paris" return <AdPrix2>{$R/Adresse}{$R/Prix[2]}</Adprix2>
Exemples (7) Q9 : Nom de chaque restaurant avec le prix moyen proposé for $R in collection("Guide")/Restaurant let $A := $R//Prix return <res> {$R/Nom} <MoyPrix>{avg($A)}</MoyPrix> </res>
Exemples (8) Q10 : noms et adresses des restaurants ayant au moins un prix supérieur à 200 for $R in collection("Guide")/Restaurant where some $P in $R/Prix satisfies (number(200)<$P) return <RestC>{$R/Nom}{$R/Adresse}</RestC>
Exemples (9) Q11 : noms et adresses des restaurants ayant tous les prix inférieurs à 100 for $R in collection("Guide")/Restaurant where every $P in $R/Prix satisfies (number(100)>$P) return <RestPC>{$R/Nom}{$R/Adresse}</RestPC>
Algèbre XQUERY une algèbre a été définie pour Xquery Permet le support d’optimisations Assez complexe (sur-ensemble de l’algèbre relationnelle)
XUPDATE Il manque le support des mises à jour dans XQUERY Il existe une proposition mais basée sur XPATH On peut utiliser DOM ou SAX pour faire les mises à jour (mais pas déclaratif)
Publication XML de données relationnelles
Objectifs XPATH, XQUERY XML Vues XML SQL données BD relationnelles
Deux problèmes Exporter une relation dans un format canonique : simple Exporter une base de données (ensemble de relations) dans un format prédéfini Ressemble à du stockage XML dans un SGBDR (sans maj) complexe
Format canonique <row> HOTELS <nom>Napoleon</nom> <categorie>3</categorie> <adresse>Paris</adresse> <prix>600</prix> </row> <nom>Gare</nom> <categorie>2</categorie> <adresse>Evry</adresse> <prix>300</prix> HOTELS Nom Catégorie Adresse prix Napoléon 3 Paris 600 Gare 2 Evry 300
Format canonique (2) Intéressant pour publication de données sur le web ou intégration de données Supporté dans SQLSERVER2000 (SELECT ... FOR XML), DB2 ou ORACLE9i XML SQL Utility
Exporter dans un format prédéfini Spécification du mapping Besoin d’un langage Pas de standard (un par vendeur) À stabiliser Deux grandes approches Relation universelle Schéma annoté
Exemple Acteur(idact, nom, prénom) <1, ‘Depardieu’, ‘gérard’> <2, ‘Clavier’, ‘christian’> Film(idfilm, titre, année) <11, ‘Astérix’, 2001> <12, ‘Vatel’, 2000> Distribution(idfilm, idact) <11,1> <11, 2>, <12, 1> <Acteur> <Nom>Depardieu</Nom> <Prenom>Gérard</Prenom> <Film annee="2001">Astérix</Film> <Film annee="2000">Vatel</Film> </Acteur> <Nom>Clavier</Nom> <Prenom>Christian</Prenom> ...
Relation universelle + template annoté par les A.nom, A.prenom, F.titre, F.année Depardieu, Gérard, Astérix, 2001 Depardieu, Gérard, Vatel, 2000 <SQL_stmt> Select A.nom, A.prenom, F.titre, F.annee From Acteur A, Film F, Distribution D Where A.idact=D.idact and D.idfilm=F.idfilm </SQL_stmt> <Acteur> <Nom>Depardieu</Nom> <Prenom>Gérard</Prenom> <Film annee="2001">Astérix</Film> <Film annee="2000">Vatel</Film> </Acteur> <Nom>Clavier</Nom> <Prenom>Christian</Prenom> ... + template annoté par les colonnes de la relation universelle <element_node Acteur> <element_node Nom> <text_node> <Column name="A.nom"/> </text_node> ...
Relation universelle (2) Support des vendeurs : IBM DB2 XML extender SqlServer2000 Universal XML Peut être complexe selon la nature des transformations souhaitées
Schéma annoté Spécification du schéma de sortie souhaité annoté par la provenance des données <xs:element name="Acteur"> <xs:complexType> <xs:sequence> <xs:element name="nom" type="xs:string"/> <xs:element name="prenom" type="xs:string"/> <xs:element ref="Film"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Film"> <xs:attribute name="annee" type="xs:dateTime"/>
Schéma annoté en SqlServer2000 <xs:element name="Acteur" sql:relation="Acteur"> <xs:complexType><xs:sequence> <xs:element name="nom" type="xs:string" sql:field="nom"/> <xs:element name="prenom" type="xs:string" sql:field="prenom"/> <xs:element ref="Film" sql:relationship="ActDist" sql:relationship="DistFilm"/> </xs:sequence></xs:complexType> </xs:element> <xs:element name="Film" sql:relation="Film" sql:field="titre"> <xs:attribute name="annee" type="xs:dateTime" sql:field="annee"/>
Schéma annoté SqlServer (2) <xs:annotation> <xs:appinfo> <sql:relationship name=ActDist parent=Acteur parent-key=idact child=Distribution child-key=idact </sql:relationship> </xs:appinfo> </xs:annotation> <xs:annotation> <xs:appinfo> <sql:relationship name=DistFilm parent=Distribution parent-key=idfilm child=Film child-key=idfilm </sql:relationship> </xs:appinfo> </xs:annotation>
Bilan Schéma annoté Variations selon les vendeurs SqlServer 2000 et IBM DB2 Plus flexible que la relation universelle Limitations sur les expressions SQL (pas d’unions, ...) Encore à améliorer!
Stockage de données XML
Système XML Niveau logique XPATH XQUERY DOM XML Niveau physique SGBDR LDAP SGF Système natif SGBD OO
Eléments de choix Données : Requêtes : Besoins applicatifs Plat vs structuré; petit ou volumineux; avec ou sans schéma, ... Requêtes : Avec ou sans maj; accès full-text; navigationnel; relationnel (jointures, ...) Besoins applicatifs Transactions, contrôle de concurrence, réplication, ...
Principes de stockage XML Plat : Un document XML est stocké dans un BLOB Simple, mais pas de requêtes possibles et maj difficiles Natif Définir un nouveau SGBD adapté au stockage de documents XML Redéfinir toutes les fonctions classiques d’un SGBD (transactions, concurrence, …) Par conversion ou « mapping » Utiliser un SGBD existant (souvent relationnel) pour stocker des documents XML Nécessite certaines extensions (index spécifiques par exemple)
Systèmes natifs Besoins Représentation concise des documents Support efficace des API XML Possibilité de maj données et structure Correspondance entre structure d’arbre et des pages physiques De nombreuses possibilités
Différents mappings APPLI ENTETE LISTE_FORM TITRE UID FORMULAIRE MonAppli Citcom/citcom@MICA NOM_TABLE MODE NOM_TABLE MODE @NOR @INS producteurs vins ATTRIBUT ATTRIBUT ANNEE CRU
Indexation Un placement physique ne peut être optimal pour toutes les requêtes possibles Besoin de plusieurs index XML a besoin d’index Sur les valeurs Sur la structure (navigation) Full-text (mots-clés)
Quelques systèmes natifs origine API Full-text XPATH XQUERY XYLEME ? O Y NATIX Bas niveau XINDICE XML:DB XML:RPC N eXcelon SGBDOO DOM/XSLT Tamino ADABAS DOM/SAX Partiel GoXML
Systèmes à base de mapping Stockage : convertir modèle de données XML vers graphe, relations, objets Chargement de données : convertir données XML vers arcs, tuples, objets Réécriture de requêtes : transformer requêtes XML vers requêtes cibles Transformation du résultat : système cible vers XML
Stockage de données XML vers relationnel Défini par l’utilisateur Générique (fixe) Dirigé par les données Dirigé par le schéma Basé sur un modèle de coût (adaptation aux besoins réels de l’application)
Mapping défini par l’utilisateur Supporté par la majorité des SGBDR commerciaux Utilisateur spécifie comment transformer éléments en relations Flexible mais Nécessite de connaitre XML et BD Relationnelles Beaucoup de solutions possibles (laquelle choisir ?) Maj des données implique maj du mapping
Stockage générique (arcs) attribut mode nom_table formulaire &0 &1 &2 &3 &4 &5 &6 &7 &8 @valeur &9 &10 Source cible Num fils élément &0 &1 1 formulaire &2 2 &3 nom_table &4 mode &5 @valeur &6 &7 &8 &9 attribut &10 3 VALEURS Noeud valeur &3 producteurs &5 INS &6 vins &8 NOR &9 ANNEE &10 CRU Select V.valeur From Valeurs V, Arcs A1, Arcs A2 Where A1.élément=« formulaire » And A1.cible=A2.source and A2.élément=« nom_table » And A2.cible=V.noeud
Stockage générique (éléments) attribut mode nom_table formulaire &0 &1 &2 &3 &4 &5 &6 &7 &8 @valeur &9 &10 FORMULAIRE Source cible &0 &1 &2 NOM_TABLE Source Cible &1 Producteurs &2 Vins Select N.cible From Formulaire F, Nom_table N Where F.cible=N.source
Bilan stockage générique Ne tient pas compte de régularité dans la structure Schéma relationnel canonique Arcs : stocke tous les arcs dans la même relation Éléments : partitionne horizontalement relation Arcs sur éléments Interrogation : nécessite des jointures MAJ : pas besoin de changer de schéma relationnel si le schéma des documents XML évolue
SGBDR commerciaux SGBD Stockage Chargement Requête Oracle9i CLOB Canonique User-defined SQL Loader Par programme Full-text, XPATH, SQL DB2 User-defined DAD Via DAD SQL+full-text, SQL SQL Server ARCS User-defined++ OpenXML Schéma annoté SQL+full-text, XPATH Pas de support XQUERY, MAJ via DOM
Conclusion Nombreux travaux pour le support XML et SGBD Produits encore en forte évolution Pas de standard Manque encore XQUERY et langage de MAJ
Bibliographie G. Gardarin; XML des bases de données aux services web, 2002, Dunod M. Fernandez, M. Benedikt, J. Freire, A. Sahuguet; XML and Data Management, Tutorial WWW2002 Conference, Hawai D. Chamberlin; Xquery: An XML Query Language, IBM Systems Journal, Vol41, No4, 2002