Vous êtes sur la page 1sur 3

Cours : BDD avancées Département d’Informatique

Promo : RSD-GL (2018/2019) Enseignante : a.HALFAOUI

Corrigé : Examen final (Durée 1h30, Documents interdits)


Remarques : - Le temps prévisionnel de chaque exercice est donné à titre indicatif.
- Les réponses aux questions des exercices sont indépendantes les unes des autres. Le barème
prévisionnel des exercices est détaillé par question
Exercice 1 : Temps estimé (50 à 55 mn). Barème de points (12,5 pts)
On considère les deux collections : ‘Salles’ et ‘Guide_Sportifs’ qui permettent de répertorier les bonnes
adresses d’établissements sportifs de la wilaya d’Alger.
Partie1 : Donner les requêtes suivantes (6 pts)
1. Rajouter l’activité ‘Aérobic’ à la salle ‘Club Nour’ si elle n’existe pas.
db.Guide_Sportif.update({"Salle":" Club Nour"},{$addToSet:{"activité":"Aérobic"}}) (0,5 pt) $Push
n’est pas accepté
2. Donner les Salles de sport qui restent ouvert après-minuit.
db.Salles.find({"horaires.1":{$gt:00, $lt:11}}) (1 pt)
3. Donner le nom des salles de musculation qui ont au moins une activité inférieure à 600 da.
db.Guide_Sportif.find({"Catégorie":"Musculation", "Programme.prix":{$lte:600}}, {nom :1,_id :-1}) (1 pt)
4. Afficher le nombre de salles situées à El Biar qui ont plus de 4 coachs sportifs
db.Salles.find({"Adresse":{$regex:"El Biar", $options:"i"}, "Nombres Coach":{$gte:4}}).count() (1 pt)
5. Donnez pour chaque catégorie la liste des salles, sauvegarder le résultat obtenu dans la collection
Catégorie_Salles.
db.Guide_Sportif.aggregate([{$group : {_id : "$Catégorie",Liste_Salles:{$push:"$Salle"}}},{$out:
"Catégorie_Salles"}]); (1 pt)
6. On voudrait rajouter au document Guide_Sportif, les informations de chaque salle dans le champ
‘information_Salle’. Donnez la requête adéquate (1,5 pt)
db.Guide_Sportif.aggregate([ { $lookup:
{ from: "Salles",
localField: "Salle",
foreignField: "Nom_salle",
as: "information_Etablissement"
} } ])
Partie2 : (6,5 pts)
1. Le premier document de la collection Salles contient deux identifiants : "_id" et "_Id_salle ", quelle est la
différence entre les deux. ? (0,5 pt)
2. Donner la sémantique des requêtes suivantes : (3 pts)
a- db.salles.find({"jours ouvertures":{"$size":7}}) salles ouvertes tous les jours (0,75) (s’il n’Y a pas de
duplication (0,25))
b- db.Salles.update({},{$set:{"jours ouvertures":"Vendredi"}}) attention remplacement (0,5 pt)du tableau
jours ouverture pour le premier doc(0,5 pt)
c- db.Guide_Sportif.find({}).forEach(function(doc){
db.Salles.update({Nom_salle:doc.Salle},{$set:{"Programmes":doc.Programme}});}) jointure entre les
deux collection pour rajouter le programme à chaque salle (1 pt)
3. Citer les alternatives de modélisation pour concevoir une base MongoDb. Laquelle est utilisée pour
concevoir la base de l’exercice. Cette solution est-elle optimale. Justifier (1,5pt)
- Deux alternatives : les références, l’imbrication (0,25*2) Par contre trois utilisations (solutions) : pour
représenter une relation : référence, imbrication et hybride (voir cours et td)
- Notre modèle utilise l’imbrication et la référence (0,25*2)
Explication : Pour pouvoir définir la modélisation utilisée nous devons, dans un premier temps,
s’intéresser à la nature des relations exprimées par le modèle dans chaque collection et entres les
collections. Dans la collection guide sportif, l’imbrication est utilisée, par exemple, pour représenter
le programme des activités de chaque salle. Guide sportif ne fait que compléter les informations des
salles d’Alger qui se trouvent dans la collection Salles (relation(1-1), il n’a pas ses propres champs
comme ça devrait être (nom guide, wilaya ou région, année du guide) pour le représenter comme une
vraie collection (entité). Donc, chaque document (salle) du guide sportif doit utiliser une référence
vers le document salle, pour pouvoir compléter les informations des salles. Donc le modèle utilise
l’imbrication et référence. La solution hybride n’est pas utilisée ici ; car la solution hybride veut dire
que pour représenter la relation j’utilise dans le même objet un champ de référence plus qq
champs (voir cours)

- La solution proposée n’est pas optimale car elle est mal modélisée.
Explication : Vu qu’on a qu’un seul guide sportif qui est celui d’alger avec une relation 1-1, La
solution n’est pas optimale car les deux collections devraient être fusionnées dans une seule
collection avec imbrication. La solution avec hybridation ou référence sera adaptée si nous rajoutons
les propres champs de la collection Guide_Sportif et, dans ce cas, avoir une relation (1,*) qui pourra
être représentée par un tableau de références pour les salles pour chaque guide. 0,5 pt
Transformer le schéma de la base en modèle relationnel (1,5pt)

Sol1 :
Les entités salles et guide sportif avec une relation 1-1 (0,75pt), dans ce cas, l’entité jours ouverture sera
reliée avec salles(0,25) et les entités activité (0,25) et programmes (0,25) seront reliées avec Guide Sportif
Sol2 :
Ne représenter qu’une des deux entités (Salles ou bien Guide_Sportif) qui contient les champs des deux
entités. Elle sera reliée avec toutes les autres entités

Exercice 2 : Temps estimé (10 à 15 mn). Barème de points (3,5 pts)


Soit la base de données pour la gestion d’évènements sportifs DZ_Zumba_days. Cet évènement est
organisé le 15 octobre de chaque année dans un lieu différent, en deux sessions : session matin et
après-midi
Evenement (NumEven, LieuEven, adresse, capacité) capacité : nombre de participants que peut accueillir le lieu où
est organisé l’évènement : par exemple l’évènement DZ-Zumba_days2019 sera organisé dans le stade Frère Zerga
tlemcen. La capacité est de 100 participants ; deux sessions seront organisées : matin et après-midi.
Participation (NumPart, numPersonne*, NumEven*, Session) session peut prendre deux valeurs : matin , après-
midi.
Personne (numPersonne, nom, âge, téléphone)
1- Définir un déclencheur qui permet d’interdire une participation si l’évènement affiche complet (la
capacité est atteinte). (3 pts)

CREATE OR REPLACE TRIGGER Evn


BEFORE INSERT ON Participation 0.5 (0.25*2)
for each row 0,25 PT
DECLARE
NombreParticip INTEGER;
NbCapacité INTEGER;
BEGIN
NombreParticip:= 0 ;
Select count(*) into NombreParticip from Participation where 1 PT (0,25*4)
NumEven = :new. NumEven and Session = :new. Session;
select capacité into NbCapacité from Evenement where NumEven = :new. NumEven 0,75PT
(0,25*3)
if NombreParticip + 1 > capacité then 0.5 PT
RAISE_APPLICATION_ERROR(-20006, 'l’évènement est au complet');
End if;
END;

2- Aucun, situation d’interblocage (0,5pt)


Questions cours : Temps estimé (10 à 15 mn). Barème de points (4 pts)
1. A quel évènement doit être déclenché un Trigger qui ne manipule que des anciennes valeurs. (0,5 pt)
Delete (0,25) et Update (0,25). Si la question était quelles sont les valeurs que peut manipuler un
déclencheur delete : la réponse aurait était que les anciennes valeurs ; car un déclencheur update peut
aussi selon les cas ne manipuler que les ancienne valeurs, que les nouvelles valeurs ou bien généralement
les deux.
2. Donnez les étapes de mise en place d’un entrepôt de données (1 pt) 0,25*4
- Conception du modèle (Etoile ou flocon : définir le processus des fait, les dimensions,…..)
- Metre en place le serveur DW ( choisir l’architecture du serveur ROLAP,MOlAP,…..)
- Extraction, transformation et chargement des données (utilisation des ETL )
- Restitution ou analyse des données (préparation des rapports, tableaux de bord)
3. Quelle est l’étape qui prend le plus de temps dans la mise en place d’un entrepôt de donnée (0,5 pt)
l’etape de consolidation et chargement de données phase de préparation des jobs ETL
4. Donner les types de schémas de modélisation d’un entrepôt de données, quelle est le plus performant ?
(1pt ) Etoile, flocon (0,25 *2) le plus performant : étoile (0,5 pt)
5. Que contient une table de fait, que signifie une dimension dégénérée et dimension conforme. (1 pt)
La table de fait : clés étrangères des dimensions + mesures, (0,25 *2)
Dimension dégénérée : c’est une dimension qui n’est pas représentée comme une table dans le modèle
(car elle n’a pas d’attributs.) mais elle figure comme une clé dans la table de fait. Le plus souvent elle
figure dans un fait de type transaction (0,25)
Dimension conforme : dimension partagée entre plusieurs tables de faits (dataMarts) (0,25)

Vous aimerez peut-être aussi