Modélisation Avancée des Bases de Données page 1 Examen réparti du 18 décembre 2009 Les documents sont autorisés Durée : 2h. Répondre aux questions sur la feuille prévue à cet effet dans les cadres appropriés. La taille des cadres suggère celle de la réponse attendue. Utiliser le dos de la feuille précédente si la réponse déborde du cadre. Le barème est donné à titre indicatif. La qualité de la rédaction sera prise en compte. Ecrire à l encre bleue ou noire. Ne pas dégrafer le sujet. Exercice 1 : Questions diverses Question 1. Les instructions SQL3 suivantes sont-elles correctes? Si une instruction n est pas correcte, dites laquelle et expliquez pourquoi. create type A as object (C number) ; create type B under A (D number); create table T of A; insert into T values(b(10,20)); select x.d from T x; Question 2. Complétez les instructions SQL3 suivantes en remplissant les pointillés create type A as object (d number); create type C as table of A; create type B as object( a1 number, a2 C); create type D as object( d1 number, d2 B, d3 C); create table T of D. Question 3. Les requêtes R1 à R4 sont effectuées sur le schéma de la question 2. Pour chacune d elle, indiquez si elle est correcte ou incorrecte. Lorsqu une requête n est pas correcte, justifiez votre réponse. R1 : select x.d3.d from T x; R2 : select y.d from T x, table(x.d3) x2; R3 : select x.d2.a1, max(y.d) from T x, table(x.d3) x2 group by x.d1, x.d2.a1; R4 : select x.d2.a1, max(y.d) from T x, table(x.d3) x2 group by x; Question 4. Dans la suite, tout élément dont la définition n est pas précisée, contient (#PCDATA) 1. Répondez par VRAI ou FAUX aux questions suivantes : «Un élément vide n a jamais d attribut». 2. Tout élément x conforme à la définition <!ELEMENT x (a b)*> est aussi conforme à la définition <!ELEMENT x (a?,b?)*> Question 5. 1. Donner le plus petit élément x conforme à la définition <!ELEMENT x ((a,(a? b)+)*, (c (a,b+)?)+)> 2.Donner l élément x, conforme à la définition, qui contient le plus grand nombre d éléments. <!ELEMENT x ((a,((a,a)? b))?, (c (a,b)?)?)>
Lettres initiales du Prénom et du Nom: page 2 Exercice 2 : XSchema Question 1 : Les affirmations suivantes sont-elles exactes? Justifier. 1a) L élément <simple Type= yes /> est de type simple (i.e. simpletype). 1b) Il est impossible de restreindre un type complexe avec une facette. Cette phrase est-elle exacte? Question 2 : Soit la définition suivante : <xs:simpletype name="u"> <xs:restriction base="xs:string"> <xs:enumeration value="ko"/> <xs:enumeration value="mo"/> <xs:enumeration value="go"/> </xs:restriction> </xs:simpletype> <xs:complextype name="t"> <xs:simplecontent> <xs:extension base="xs:negativeinteger"> <xs:attribute name="m" type="u"/> </xs:extension> </xs:simplecontent> </xs:complextype> <xs:element name="a" type="t"/> Donner un exemple d élément XML nommé A et conforme à cette définition. Question 3 : Dans le schéma de XSchema, le terme attribute est défini comme : a) un type simple b) un attribut c) un élément de type complexe d) un élément de type simple e) un type complexe Question 4 : Dans le schéma de XSchema, quelles sont les valeurs des attributs use et default dans la définition de l attribut maxoccurs d un élément element? Question 5 : On donne la DTD suivante : <!ELEMENT base (restau reduc)*> <!ELEMENT restau (menu)*> <!ATTLIST restau num ID #REQUIRED> <!ATTLIST restau nom CDATA #REQUIRED> <!ATTLIST restau ville CDATA #REQUIRED> <!ELEMENT reduc EMPTY> <!ATTLIST reduc restau IDREF #REQUIRED> <!ATTLIST reduc menu CDATA #REQUIRED> <!ATTLIST reduc remise CDATA #REQUIRED> <!ATTLIST reduc code CDATA #REQUIRED> <!ELEMENT menu EMPTY> <!ATTLIST menu num CDATA #REQUIRED> <!ATTLIST menu nom CDATA #REQUIRED> <!ATTLIST menu prix CDATA #REQUIRED> <!ATTLIST menu tva_baisse (oui non) "non"> 5a) Compléter la définition suivante pour déclarer que la clé d un menu est composée du numéro de menu et du numéro de restau. <xs:element name="base" type="basetype"> <xs:key name="idmenu"> <xs:selector xpath=" "/> </xs:key> </xs:element> 5b) Compléter la définition pour définir la contrainte de référence suivante : les bon de réduction concernent un menu existant dans le document. <xs:element name="base" type="basetype"> <xs:keyref name=" " refer =" "> <xs:selector xpath=" "/> </xs:keyref> </xs:element> 5c) Que faut-il modifier dans les définitions ci-dessus pour exprimer que seuls les menus marqués tva en baisse peuvent bénéficier d une réduction?
Lettres initiales du Prénom et du Nom: page 3
Lettres initiales du Prénom et du Nom: page 4 Exercice 3 : XPath On considère les fichiers facebook.dtd et facebook.xml suivants : Facebook.dtd <?xml version="1.0" encoding="iso-8859-1"?> <!ELEMENT facebook (users)> <!ELEMENT users (user*)> <!ELEMENT user (name, friends?, albums?)> <!ATTLIST user id ID #REQUIRED> <!ELEMENT name (#PCDATA)> <!ELEMENT friends (friend*)> <!ELEMENT friend (details?)> <!ATTLIST friend user IDREF #REQUIRED> <!ELEMENT details (#PCDATA)> <!ELEMENT albums (album*)> <!ELEMENT album (name, location, photos)> <!ATTLIST album id CDATA #REQUIRED> <!ELEMENT location (#PCDATA)> <!ELEMENT photos (photo*)> <!ELEMENT photo (name, tags?)> <!ATTLIST photo id CDATA #REQUIRED> <!ELEMENT tags (tag*)> <!ELEMENT tag EMPTY> <!ATTLIST tag user IDREF #REQUIRED>?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE facebook (View Source for full doctype...)> <facebook> <users> <user id="u1"> <name>bernd Amann</name> <friends> <friend user="u3" /> <friend user="u2" /> <albums> <album id="21"> <name>vacances</name> <location>vienne</location> <photos> <photo id="31"> <name>00001.jpg</name> <tags> <tag user="u3" /> <tag user="u4" /> <photo id="33"> <name>00003.jpg</name> <tags> <tag user="u3" /> </photos> </album> </albums> - <user id="u2"> <name>anne Doucet</name> - <friends> <friend user="u4" /> - <user id="u3"> <name>stéphane Gançarski</name> - <friends> <friend user="u1" /> <friend user="u4" /> - <albums> - <album id="20"> <name>lycée</name> <location>paris</location> - <photos> - <photo id="50"> <name>00201.jpg</name> - <tags> <tag user="u3" /> - <photo id="51"> <name>00202.jpg</name> - <tags> - <photo id="53"> <name>00203.jpg</name> - <tags> </photos> </album> </albums> - <user id="u4"> <name>hubert Naacke</name> - <friends> <friend user="u3" /> <friend user="u1" /> </users> </facebook>
Modélisation Avancée des Bases de Données page 5 Ecrivez en XPath les requêtes suivantes : On précise Que la relation friend n est pas symétrique. On dit que A est ami de B si A figure dans l éléments <friends> de B Les photos sont toutes tagguées par leur propriétaire On rappelle la définition de la fonction id() : Si un élément A (resp. B) possède un attribut @att1 de type IDREF (resp. @att2 de type ID), id(@att1) renvoie l élément A tel que @att1=@att2. 1. Nom des Amis en commun entre Stéphane et Hubert (réponse Bernd) 2. Quel(s) collègue(s) de Bernd n'est pas ami avec Bernd (réponse Hubert) 3. Qui a taggué au moins un ami (réponse Bernd) 4. Qui a été taggue par au moins un ami (réponse : Stéphane et Hubert) 5. Combien de photos ont été prises par les amis de Bernd (réponse : 3) Exercice 4 : XQuery Exprimez en XQuery les requêtes suivantes sur le fichier facebook.xml. 1. Pour chaque personne, donner son nom et le nom de ses amis. Le résultat doit être : <user name="bernd Amann"> <ami><name>stéphane Gançarski</name></ami> <ami><name>anne Doucet</name></ami> <user name="anne Doucet"><ami><name>Hubert Naacke</name></ami> <user name="stéphane Gançarski"> <ami><name>bernd Amann</name></ami> <ami><name>hubert Naacke</name></ami> <user name="hubert Naacke"> <ami><name>stéphane Gançarski</name></ami> <ami><name>bernd Amann</name></ami> 2. Pour chaque photo, lister le nom des personnes tagguées. Le résultat doit être : <photo id="31"> <tag name="stéphane Gançarski"></tag> <tag name="hubert Naacke"></tag> <photo id="33">
Lettres initiales du Prénom et du Nom: page 6 <tag name="stéphane Gançarski"></tag> <tag name="anne Doucet"></tag> <photo id="50"> <tag name="anne Doucet"></tag> <tag name="stéphane Gançarski"></tag> <photo id="51"><tag name="anne Doucet"></tag> <photo id="53"><tag name="anne Doucet"></tag> 3. Liste des photos avec leur id, le nom de leur album et le nom de l'utilisateur qui possède la photo. Le résultat doit être : <photo id="31" album="vacances"> <owner nom="bernd Amann"></owner> <photo id="33" album="vacances"> <owner nom="bernd Amann"></owner> <photo id="50" album="lycée"> <owner nom="stéphane Gançarski"></owner> <photo id="51" album="lycée"> <owner nom="stéphane Gançarski"></owner> <photo id="53" album="lycée"> < owner nom="stéphane Gançarski"></owner> 4. Lister le nom des personnes tagguées sur plus de deux photos. Le résultat soit être : <user nom="anne Doucet"> <user nom="stéphane Gançarski">