Chapitre 5 : BD relationnelles et XML 1. Introduction Ouvrir les BD au Web Mettre les données des BD sur le Web (passerelles d’accès aux BD) – exportation de données (vers HTML) – BD comme repository d’un intranet Couplage HTML-bases de données • Serveur HTTP dynamique – Basé sur CGI – Serveur Web dédié aux BD : Oracle WebDB, VersantWeb, etc. • Serveur de pages dynamiques – Les langages de haut niveau permettant de définir des actions à faire exécuter sur le serveur • ASP (MS Active Server Page) • JSP (Java Server Page) • PHP (Hypertext Preprocessor) Accès base de données Limitations du couplage HTML-BD • Solutions propriétaires – Excepté JSP • Pas de protocole pour publier les données – SQL n’est pas conçu pour le Web • Pas de format d’échange de données standard : HTML est un format de présentation – Mélange présentation et contenu – Pas de structure, pas de sémantique, pas de contrainte d’intégrité – Perd la structure (schéma) provenant de la BD Le contenu doit être abstrait et indépendant du stockage et de la présentation – Permet l’intégration uniforme de données hétérogènes • Provenant de différentes sources de données – Permet des applications dynamiques • La présentation peut être différente selon le médium, le temps, la requête ou le profil de l’utilisateur 67 Chapitre 5 : BD relationnelles et XML XML est une bonne solution pour l’échange de données – Standard du W3C – Décrit le contenu, pas la présentation • Structure, type, schéma, requêtes, etc. – Fournit l’indépendance des données au stockage et à la présentation 2. Passage BDR/XML Exemple : gestion des commandes des clients. Client (Nclient, nom, prenom, adresse) Commande (Ncmde, Nclient, date) Produit (Nproduit, Catégorie, prix) détails-commande (Ncmde, Nproduit, Quantité) => Un schéma avec clés primaires et clés étrangères Nclient 01234 01235 nom razak soltane Nproduit 500 501 502 prenom ali hamza Table : client Catégorie ZZZT YYYB AAAB Ncmde 012 013 014 Ncmde 012 012 013 014 adresse Constantine Annaba prix 200,00 100,00 400,00 Table : Produit Nclient date 01234 20-02-2010 01234 15-12-2010 01235 10-01-2011 Table : commande Nproduit 500 501 502 503 Table : détails-commande Réprésentation XML: avec éléments Trois niveaux d’éléments dans l’arbre : table, lignes, attributs <?xml version=’1.0’ encoding=’ISO-8859-1?> <Clients> <Client> <Nclient>01234</Nclient> <nom>razak</nom> <prenom>Ali</prenom> <adresse>Constantine</adresse> 68 Quantité 300 200 400 100 Chapitre 5 : BD relationnelles et XML </Client> </Clients> Tous représentés par des éléments Réprésentation XML: avec attributs Deux niveaux d’éléments tables et lignes : <?xml version=’1.0’ encoding=’ISO-8859-1?> <Clients> <Client Nclient=’01234’ nom=’razak’ lieu=’Ali’ Adresse=’Constantine’ /> </Clients> Attributs relationnels attributs XML La représentation avec attributs est plus proche du relationnel car : Absence d’ordre sur les attributs en XML comme en relationnel. On ne peut pas avoir deux fois un attribut avec le même nom. On peut, avec une DTD, donner la liste des valeurs acceptées pour un attribut. De plus, moins volumineux Représentation des associations 1 à plusieurs L’équivalent du relationnel en XML <?xml version=’1.0’ encoding=’ISO-8859-1?> <Clients> <Client Nclient=’01234’ nom=’razak’ prenom=’Ali’ Adresse=’Constantine’/> <Commande Ncmde=’012’ Nclient=’01234’ date=’ 20-02-2010’ /> <Commande Ncmde=’013’ Nclient=’01234’ date=’15-12-2010’ /> </Clients> Relationnel vs XML En relationnel : On associe les lignes par le système clé primaire/clé étrangère On fait le rapprochement par un calcul (la jointure) assez coûteux Intérêt : simple, raisonnablement efficace, évite les redondances En XML Le modèle est plus puissant Même représentation possible Toujours aussi coûteux On peut exploiter une représentation imbriquée Représentation imbriquée On exploite le fait qu’une activité est relative à une seule station 69 Chapitre 5 : BD relationnelles et XML <?xml version=’1.0’ encoding=’ISO-8859-1?> <Clients> <Client Nclient=’01234’ nom=’razak’ prenom=’Ali’ Adresse=’Constantine’> <Commande Ncmde=’012’ date=’ 20-02-2010’ /> <Commande Ncmde=’013’ date=’15-12-2010’ /> <Client> </Clients> Associations plusieurs à plusieurs Beaucoup moins évident à gérer. Exemple avec l’association Commande/Produit Une commande peut contenir plusieurs produits Un produit peut passer dans plusieurs commandes En relationnel, on crée une table intermédiaire (détails-commande) détails-commande (Ncmde, Nproduit, Quantité) Exemple <?xml version=’1.0’ encoding=’ISO-8859-1?> <Commande Ncmde=’012’ Nclient=’01234’ date=’20-02-2010’> <detailscommande Nproduit=’500’ Quantité=’300’/> <detailscommande Nproduit=’501’ Quantité=’200’/> </Commande> <Commande Ncmde=’013’ Nclient=’01234’ date=’ 15-12-2010’> <detailscommande Nproduit=’502’ Quantité=’400’/> </Commande> <Produit Nproduit=’500’ Catégorie=’ZZZT’ Prix=’ 200,00’/> Solution ultime On choisit une racine (par exemple les Clients) et on imbrique tout Les commandes sont des éléments dans le Client Les détailscommandes sont des éléments dans les commandes On introduit une certaine redondance : les produits apparaissent plusieurs fois Exemple <?xml version=’1.0’ encoding=’ISO-8859-1?> <Clients> <Client Nclient=’01234’ nom=’razak’ prenom=’Ali’ Adresse= ‘Constantine’> <Commande Ncmde=’012’ date=’20-02-2010’> <detailscommande Nproduit=’500’ Quantité=’300’/> </Commande> <Commande Ncmde=’013’ date=’ 15-12-2010’> <detailscommande Nproduit=’502’ Quantité=’400’/> </Commande> </Client> <Client Nclient=’01235’ 70 Chapitre 5 : BD relationnelles et XML nom=’soltane’ prenom=’hamza’ Adresse= ‘Annaba’> <Commande Ncmde=’014’ date=’10-01-2011’> <detailscommande Nproduit=’503’ Quantité=’100’/> </Commande> </Client> <Praoduit Nproduit= ‘500’ catégorie=’ZZZT’ prix=’200,00’ /> <Praoduit Nproduit= ‘501’ catégorie=’YYYB’ prix=’100,00’ /> ………………………………………………. </Clients) Déclaration de la DTD En général on exporte une base de données pour fournir une « vue » XML à d’autres utilisateurs. Il faut donc fournir une description de la structure XML. On suppose que : Les colonnes sont représentées par des attributs XML; Le chemin d’accès principal est le Client ; Pour chaque client on trouve, imbriqués, les commandes d’un client, et dans chaque commande les détails des produits commandés; Les produits on sont représentées par des éléments indépendants, avec un lien de navigation. Exemple général : <!ELEMENT Clients (Client*, Produit*)> <!ELEMENT Client (commande*)> <!ELEMENT commande (détailscommande*)> <!ELEMENT détailscommande EMPTY> <!ELEMENT Produit EMPTY> <!ATTLIST Client Nclient ID #REQUIRED nom #REQUIRED prenom CDATA #REQUIRED Adresse CDATA #REQUIRED > <!ATTLIST commande Ncdme ID #REQUIRED date CDATA #REQUIRED > <!ATTLIST Produit Nproduit ID #REQUIRED Catégorie CDATA #REQUIRED prix CDATA #REQUIRED> On déclare une référence depuis details-commande vers produit. <!ATTLIST detailscommande Nproduit IDREF #REQUIRED Quantité CDATA #REQUIRED> 3. L’utilitaire XSQL d’ORACLE Oracle propose un XML Development Kit avec : DOM, SAX, processeur XSLT et nombreux utilitaires (en java). XSQL est un SQL mis à la sauce XML. Il permet : De se connecter à la base 71 Chapitre 5 : BD relationnelles et XML D’effectuer une requête De mettre en forme XML le résultat, selon certains paramètres D’enchaîner avec une transformation XSLT C’est un document XML Les instructions XSQL sont identifiées par l’espace de nom xsql: Le résultat c’est encore un document XML, avec la représentation en éléments du résultat de la requête. <GestionVente NO="1"> <Description> Cette semaine nous proposons une promotion exceptionnelle sur …….. </Description> <xsql:query connection="connexionBase" xmlns:xsql="urn:oracle-xsql"> SELECT * FROM Client WHERE Nclient=’01234’ </xsql:query> </ GestionVente > Par défaut le format de sortie est le suivant : <?xml version="1.0" encoding="ISO-8859-1"?> <ROWSET> <ROW num="1"> <NCLIENT>Passac</NCLIENT > <NOM>Razak</NOM> <PRENOM>Ali</PRENOM> <Adresse>Constantine</Adresse> </ROW> </ROWSET> Pour effectuer une transformation On ajoute une instruction indiquant le programme de transformation à appliquer. <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="pres.xsl"?> <xsql:query connection="connexionBase" xmlns:xsql="urn:oracle-xsql"> SELECT …………………………………………………………….. </xsql:query> NB: la requête est effectuée avant la transformation. Contrôle du résultat XML On peut remplacer ROWSET et ROW par des noms explicites. <?xml version="1.0" encoding="ISO-8859-1"?> <xsql:query connection="maConnexion" xmlns:xsql="urn:oracle-xsql" rowset-element=’CLIENTS’ row-element=’CLIENT’> SELECT * FROM Client WHERE Nclient=’01234’ </xsql:query> Le résultat <?xml version="1.0" encoding="ISO-8859-1"?> <CLIENTS> 72 Chapitre 5 : BD relationnelles et XML <CLIENT num="1"> <NCLIENT>Passac</NCLIENT > <NOM>Razak</NOM> <PRENOM>Ali</PRENOM> <Adresse>Constantine</Adresse> </CLIENT> </CLIENTS> Ce qu’on peut faire avec XSQL On fait les choses simples simplement, et on peut faire des choses compliquées. Utiliser des paramètres dans la requête Placer plusieurs requêtes dans une page Contrôler le format XML de sortie Produire plusieurs formats de sortie avec XSLT Exemple de paramètres Des paramètres (HTTP, Cookies, autre) peuvent être exploités dans la requête. <?xml version="1.0"?> <xsql:query connection="maConnexion" xmlns:xsql="urn:oracle-xsql"> SELECT * FROM Client WHERE NClient=’{@num}’ </xsql:query> 73