Exam Maitrise CMO partie BDO O2 janvier 2002
Transcription
Exam Maitrise CMO partie BDO O2 janvier 2002
Modélisation Avancée des Bases de Données
page 1
Examen réparti du 18 décembre 2009
Version CORRIGEE
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
5 pts
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;
Incorrect, on n’a pas accès à l’attribut D car x est de type A
Il faudrait écrire select treat(value(x) as B).D
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………….
create table T of D nested table d3 store as x nested table d2.a2 store as y;
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;
Incorrecte, expression de chemin invalide
R2 :
select y.d from T x, table(x.d3) x2;
incorrecte
R3 :
select x.d2.a1, max(y.d) from T x, table(x.d3) x2 group by x.d1, x.d2.a1;
incorrecte
R4 :
select x.d2.a1, max(y.d) from T x, table(x.d3) x2 group by x;
Incorrecte, impossible de regrouper selon 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 ».
faux
Lettres initiales du Prénom et du Nom:
page 2
2. Tout élément x conforme à la définition <!ELEMENT x (a|b)*> est aussi conforme à la
définition <!ELEMENT x (a?,b?)*>
oui
Question 5.
1. Donner le plus petit élément x conforme à la définition
<!ELEMENT x ((a,(a?|b)+)*, (c|(a,b+)?)+)>
Réponse: <x></x>
Réponse erronéee : <x><c/></x>
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)?)?)>
<x><a/><a/><a/><a/><b/></x>
Exercice 2 : XSchema
5 pts
Question 1 : Les affirmations suivantes sont-elles exactes ? Justifier.
1a) L’élément <simple Type=‘yes’ /> est de type simple (i.e. simpleType).
Faux c’est un type complexe car il y a un attribut
1b) Il est impossible de restreindre un type complexe avec une facette. Cette phrase est-elle exacte ?
Vrai, les facettes servent à restreindre seulement des types simples
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.
<A m=’GO’> - 123</H>
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
Réponse c)
Attribut est un élément de type complexe car il possède des attributs
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 ?
<xs:attribute name="maxOccurs" use="optional" default="1">
Question 5 : On donne la DTD suivante :
<!ELEMENT
<!ELEMENT
<!ATTLIST
<!ATTLIST
base (restau|reduc)*>
restau (menu)*>
restau num ID #REQUIRED>
restau nom CDATA #REQUIRED>
<!ELEMENT
<!ATTLIST
<!ATTLIST
<!ATTLIST
reduc
reduc
reduc
reduc
EMPTY>
restau IDREF #REQUIRED>
menu CDATA #REQUIRED>
remise CDATA #REQUIRED>
Lettres initiales du Prénom et du Nom:
<!ATTLIST restau ville CDATA #REQUIRED>
<!ELEMENT
<!ATTLIST
<!ATTLIST
<!ATTLIST
<!ATTLIST
menu
menu
menu
menu
menu
page 3
<!ATTLIST reduc code CDATA #REQUIRED>
EMPTY>
num CDATA #REQUIRED>
nom CDATA #REQUIRED>
prix CDATA #REQUIRED>
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:field xpath="…"/>
<xs:field xpath="…"/>
</xs:key>
</xs:element>
<xs:element name="base" type="baseType">
<xs:key name="idmenu">
<xs:selector xpath="restau/menu"/>
<xs:field xpath="@num"/>
<xs:field xpath="../@num"/>
</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:field xpath="…"/>
<xs:field xpath="…"/>
</xs:keyref>
</xs:element>
<xs:element name="base" type="baseType">
<xs:keyref name="refmenu" refer ="idmenu">
<xs:selector xpath="reduc"/>
<xs:field xpath="@restau"/>
<xs:field xpath="@menu"/>
</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 ?
Il faut modifier la clé (ou ajouter un autre element key)
<xs:element name="base" type="baseType">
<xs:key name="idmenu">
<xs:selector xpath="restau/menu[@tva_baisse=oui]"/>
<xs:field xpath="@num"/>
<xs:field xpath="../@num"/>
</xs:key>
</xs:element>
Lettres initiales du Prénom et du Nom:
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?)>
page 4
5 pts
Lettres initiales du Prénom et du Nom:
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ATTLIST
page 5
user id ID #REQUIRED>
name (#PCDATA)>
friends (friend*)>
friend (details?)>
friend user IDREF #REQUIRED>
details (#PCDATA)>
albums (album*)>
album (name, location, photos)>
album id CDATA #REQUIRED>
location (#PCDATA)>
photos (photo*)>
photo (name, tags?)>
photo id CDATA #REQUIRED>
tags (tag*)>
tag EMPTY>
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" />
</friends>
<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" />
</tags>
</photo>
<photo id="33">
<name>00003.jpg</name>
<tags>
<tag user="u3" />
<tag user="u2" />
</tags>
</photo>
</photos>
</album>
</albums>
</user>
- <user id="u2">
<name>Anne Doucet</name>
- <friends>
<friend user="u4" />
</friends>
</user>
- <user id="u3">
<name>Stéphane
Gançarski</name>
- <friends>
<friend user="u1" />
<friend user="u4" />
</friends>
- <albums>
- <album id="20">
<name>Lycée</name>
<location>Paris</location>
- <photos>
- <photo id="50">
<name>00201.jpg</name>
- <tags>
<tag user="u2" />
<tag user="u3" />
</tags>
</photo>
- <photo id="51">
<name>00202.jpg</name>
- <tags>
<tag user="u2" />
</tags>
</photo>
- <photo id="53">
<name>00203.jpg</name>
- <tags>
<tag user="u2" />
</tags>
</photo>
</photos>
</album>
</albums>
</user>
- <user id="u4">
<name>Hubert Naacke</name>
- <friends>
<friend user="u3" />
<friend user="u1" />
</friends>
</user>
</users>
</facebook>
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() :
Lettres initiales du Prénom et du Nom:
page 6
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)
//user[@id = //user[name="Stéphane Gançarski"]//friend/@user and @id =
//user[name="Hubert Naacke"]//friend/@user]/name
reponse: Bernd
2. Quel(s) collègue(s) de Bernd n'est pas ami avec Bernd (réponse Hubert)
//user[not(@id = //user[name="Bernd Amann"]//friend/@user) and not(name="Bernd
Amann")]/name
3. Qui a taggué au moins un ami (réponse Bernd)
//user[.//tag/@user = .//friend/@user]/name
Qui a taggue uniquement des gens qui ne sont pas des amis(Stephane)
//user[.//tag and not(.//tag/@user = .//friend/@user)]/name/text()
4. Qui a été taggue par au moins un ami (réponse : Stéphane et Hubert)
//user[@id=id(friends/friend/@user)//tag/@user]
5. Combien de photos ont été prises par les amis de Bernd (réponse : 3)
count(id(//user[name='Bernd Amann']/friends/friend/@user)//photo)
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 :
<result>
<user name="Bernd Amann">
<ami><name>Stéphane Gançarski</name></ami>
<ami><name>Anne Doucet</name></ami>
</user>
<user name="Anne Doucet"><ami><name>Hubert Naacke</name></ami></user>
<user name="Stéphane Gançarski">
<ami><name>Bernd Amann</name></ami>
<ami><name>Hubert Naacke</name></ami>
</user>
<user name="Hubert Naacke">
<ami><name>Stéphane Gançarski</name></ami>
<ami><name>Bernd Amann</name></ami>
</user>
</result>
Réponse :
<result>
{for $u in document('facebook.xml')//user
return
<user name='{$u/name/text()}'>
{for $f in $u//friend
let $a:= document('facebook.xml')//user[@id=$f/@user]
return <ami>{$a/name}</ami>}
</user>
5 pts
Lettres initiales du Prénom et du Nom:
page 7
}
</result>
2. Pour chaque photo, lister le nom des personnes tagguées.
Le résultat doit être :
<result>
<photo id="31">
<tag name="Stéphane Gançarski"></tag>
<tag name="Hubert Naacke"></tag>
</photo>
<photo id="33">
<tag name="Stéphane Gançarski"></tag>
<tag name="Anne Doucet"></tag>
</photo>
<photo id="50">
<tag name="Anne Doucet"></tag>
<tag name="Stéphane Gançarski"></tag>
</photo>
<photo id="51"><tag name="Anne Doucet"></tag></photo>
<photo id="53"><tag name="Anne Doucet"></tag></photo>
</result>
Réponse :
<result>
{
for $p in document('facebook.xml')//photo
return
<photo id='{$p/@id}' >
{for $t in $p//tag
let $n:=document('facebook.xml')//user[@id=$t/@user]/name
return
<tag name='{$n}'/>
}
</photo>
}
</result>
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 :
<result>
<photo id="31" album="Vacances">
<owner nom="Bernd Amann"></owner>
</photo>
<photo id="33" album="Vacances">
<owner nom="Bernd Amann"></owner>
</photo>
<photo id="50" album="Lycée">
<owner nom="Stéphane Gançarski"></owner>
</photo>
<photo id="51" album="Lycée">
<owner nom="Stéphane Gançarski"></owner>
Lettres initiales du Prénom et du Nom:
</photo>
<photo id="53" album="Lycée">
< owner nom="Stéphane Gançarski"></owner>
</photo>
</result>
Réponse :
<result>
{for $p in document('facebook.xml')//photo
let $a:=$p/../../name
let $u:=$p/../../../../name
return
<photo id='{$p/@id}' album='{$a}'>
<owner nom='{$u}'/>
</photo>
}
</result>
4. Lister le nom des personnes tagguées sur plus de deux photos.
Le résultat soit être :
<result>
<user nom="Anne Doucet"></user>
<user nom="Stéphane Gançarski"></user>
</result>
Réponse :
<result>
{let $p:= document('facebook.xml')//photo
for $u in document('facebook.xml')//user
where count($p//tag[@user=$u/@id])>2
return
<user nom='{$u/name}'/>
}
</result>
page 8