6 Mars 2002
Durée : 1h30. Documents autorisés.
Recommandations : choisir des solutions simples et lisibles et des réponses succinctes.
Vreng est une application permettant de concevoir et de naviguer dans des mondes virtuels. A chaque monde virtuel est associé un fichier mémorisant l’état initial du monde : les objets composant ce monde, les caractéristiques de ces objets et leur disposition dans l’espace. La navigation dans ces mondes virtuels se fait à l’aide d’avatars. Un avatar est un objet représentant un utilisateur du système. Certains objets sont mobiles, c’est-à-dire, qu’ils peuvent changer de position dans l’espace : une bouteille, un chaise ou un avatar peuvent changer de position, alors qu’un mur ne peut pas changer de position. Les caractéristiques du mouvement de chaque objet dépendent de sa classe d’appartenance. Chaque objet possède des caractéristiques visuelles (couleur, etc.) une viscosité, une densité et une résistance en cas de collision. Les objets du monde virtuels possèdent des états : une porte peut être ouverte, fermée, verrouillée, etc. Un chaise peut être occupée ou non, une bouteille peut être vide, pleine, bouchée, etc. Les objets peuvent être composés d’autres objets : un ordinateur est composé d’un clavier, un écran, une souris et une unité centrale. Certains objets permettent de passer d’un monde virtuel à un autre. Un objet exposé dans un musée peut servir de porte d’entrée à un mode décrivant le site/musé d’où provient l’objet.
Les concepteurs de Vreng désirent gérer la persistance des mondes virtuels dans une base de données relationnelle. La liste suivante présente des informations relevées (et adaptées à ce contrôle) à partir des fichiers utilisés dans Vreng pour décrire les mondes virtuels :
· id //identifiant d’objet
· given_name //nom d’objet
· world_name //nom du monde d’appartenance d’un objet
· url //URL de chargement de monde virtuel
· class_name //nom de classe d’objets
· resistance //code permettant de déterminer la résistance des objets en cas de collision
· viscuosity //code permettant de déterminer la viscosité des objets
· color //code de couleur d’objet
· density //code de densité d’objet
· lspeed //vitesse linéaire d’objet
· aspeed //vitesse angulaire d’objet
· live //durée de vie d’objet
· timestamp //date de création d’un objet
· x, y et z //coordonnés d’un objet dans un espace 3D
· ax, ay, az //angles d’inclinaison d’un objet par rapport aux différents axes
· state //état d’un objet
On suppose que l’ensemble de dépendances fonctionnelles associé à ces données est le suivant :
·
id à x, y, z, ax, ay, az, world_name,
state, color, timestamp, given_name, class_name
·
world_name
à url
·
url à world_name
·
class_name
à live, resistance, density,
viscuosity, lspeed, aspeed
Travail demandé :
1. Représenter sous forme de graphe la couverture minimale de l’ensemble de dépendances fonctionnelles donné ci-dessus.
2.
Déduire un schéma relationnel en troisième forme normale.
Ce schéma est-il en BCNF ?
3.
Compléter les informations relevées et le graphe de
dépendances fonctionnelles pour tenir compte du lien de composition entre
objets et du fait que certains objets peuvent permettre de passer d’un monde à
un autre. Répercuter les changements sur votre schéma relationnel.
4.
Affiner votre schéma relationnel pour tenir compte du fait
que seuls les objets mobiles peuvent avoir une vitesse de déplacement (lspeed,
aspeed). Donner le schéma obtenu.
Partie II : SQL
En reprenant la base de données vue en TP, schéma suivant :
Vins (nv, cru, mill, degre)
Buveurs (nb, nomb, prenomb,
type)
Achats (nb, nv, dat, lieu,
qte)
Recoltes (np, nv, qte)
Producteurs (np, nomp,
prenomp, region)
Précisez si les requêtes suivantes sont correctes ou non. Décrivez en français le résultat des requêtes correctes :
1 Select distinct np from Producteurs where np in Recoltes ;
2 Select cru from Vins group by cru having count(nv) >1 ;
3 Select distinct v1.cru from Vins v1, Vins v2 where v1.cru=v2.cru and v1.nv!=v2.nv ;
4 Select p1.nomp, p2.nomp from Producteurs p1, Producteurs p2
Where p1.region=p2.region and p1.np > p2.np ;
5 Select nv, count(np), sum(qte) from Recoltes ;
6 Select nv from Vins where not exists (select * from Achats where Achats.nv = Vins.nv) ;
7 Create view achats_tries as select * from Achats order by dat ;
8
Select * from Vins where degre = (select max(degree)
from vins ) ;