Examen corrigé bda diagramme de classe odl 2012 2013 bases d
Télécharger PDFExercice 1 : Conception et Requêtes ODL/OQL
1. Diagramme de Classe et Transformation de la Classe Associative
Cette section aborde la modélisation des données avec un diagramme de classe et les principes de transformation des classes associatives, concepts fondamentaux en bases de données orientées objet.
2. Code ODL (Object Definition Language)
L'ODL est un langage de définition de schéma utilisé pour décrire les types d'objets, leurs attributs et leurs relations dans les systèmes de gestion de bases de données orientées objet. Voici la définition des classes pour un module de laboratoire :
Module laboratoire {
class membre (extent membres key (nom, prenom)) {
Attribute string nom;
Attribute string prenom;
Relationship set<affectProjet> prjdemem inverse affectprojet :: memdeprj;
Float remun();
}
class projet (extent projets key (code)) {
Attribute int code;
Attribute string nom;
Attribute Float budget;
Attribute date date_lancement;
Attribute int duree;
Relationship set<affectProjet> affectprj inverse affectprojet :: prjaffect;
}
class Affectprojet (extent Affectprojets key (nom, prenom, code)) {
Attribute date d_debut;
Attribute date d_fin;
Attribute REAL pourcentage;
Relationship Projet prjdaffect inverse projet :: affectprj;
Relationship membre memdeprj inverse membre :: prjdemem;
}
}
Dans ce schéma ODL, extent désigne la collection d'objets pour chaque classe, et key définit l'identifiant unique. Les relations inverse établissent des liens bidirectionnels entre les classes.
3. Requêtes OQL (Object Query Language)
L'OQL est un langage de requête pour les bases de données orientées objet, permettant d'interroger les objets, leurs attributs et leurs relations. Voici des exemples de requêtes OQL :
Requête 1 : Sélectionner le nom du projet et le grade des membres affectés
Select distinct (A.nom, A.memdeprj.Grade)
From projets p, p.affectprj A
Group by p.code
Note : Le concept de 'Grade' est supposé être un attribut de la classe membre ou hérité, s'il est pertinent pour le modèle.
Requête 2 : Sélectionner les noms des projets ayant un budget supérieur à 1 000 000
Select distinct (struct (A1.nom, A2.nom))
From affectprojets A1, affectprojets A2
Where A1.prjaffect.budget > 1000000 and A2.prjaffect.budget > 1000000
Requête 3 : Sélectionner les noms des membres dont tous les projets affectés ont un budget supérieur à 1 000 000
Select m.nom
From membres m
Where (FOR ALL e in m.prjdemem) : e.prjaffect.budget > 1000000
Exercice 2 : Fragmentation de Tables et Requêtes Distribuées
1. Fragmentation Horizontale de la Table "abonné"
La fragmentation horizontale divise une table en plusieurs sous-tables (fragments) basées sur un critère de sélection de lignes. Chaque fragment contient un sous-ensemble des lignes de la table d'origine.
Expressions Algébriques de Fragmentation
Table Abonné
Ab_sud = σ abonne (Region = 'sud')
Ab_Nord = σ abonne (Region = 'nord')
Ab_Est = σ abonne (Region = 'Est')
Ab_Ouest = σ abonne (Region = 'Ouest')
Ces expressions représentent la division de la table "abonné" en fragments distincts en fonction de la valeur de l'attribut "Region".
2. Requête SQL pour la Fragmentation par Liste de la Table "abonné"
La fragmentation par liste est une stratégie de partitionnement où les données sont réparties en fonction d'une liste de valeurs discrètes spécifiées pour une colonne donnée.
CREATE TABLE abonnes (
num_tel NUMBER PRIMARY KEY,
NomAb VARCHAR2(20),
PrenomAb VARCHAR2(20),
AutreChamp VARCHAR2(20),
Age NUMBER(2),
Region VARCHAR(5),
Situation_Professionnelle VARCHAR(10),
Adresse VARCHAR(30)
)
PARTITION BY LIST (Region) (
PARTITION ab_sud VALUES ('sud'),
PARTITION ab_Nord VALUES ('Nord'),
PARTITION ab_Est VALUES ('Est'),
PARTITION ab_Ouest VALUES ('Ouest')
);
3.a. Requête SQL et Arbre Algébrique Optimisé
Voici une requête SQL pour calculer la moyenne du montant des appels pour les abonnés des régions 'nord' ou 'sud' à une date spécifique :
Select AVG(montant)
From Appel a, abonnes b
Where a.numTelAppellant = b.num_tel
and (b.Region = 'nord' or b.Region = 'sud')
and a.dateAppel = '01/01/2013';
L'arbre algébrique optimisé illustre l'ordre des opérations relationnelles (sélection, projection, jointure) pour exécuter cette requête de manière efficace.
3.b. Forme Canonique
La forme canonique d'une requête est une représentation standardisée qui facilite les phases d'optimisation, en éliminant les redondances et en normalisant l'expression logique de la requête.
3.c. Simplification de la Requête
La simplification de la requête implique des transformations syntaxiques et sémantiques visant à réduire la complexité et le coût d'exécution, souvent en appliquant des règles d'algèbre relationnelle.
4.a. Type de Fragmentation de la Table "Appel"
Il s'agit d'une fragmentation dérivée. La fragmentation de la table "Appel" est déterminée par la fragmentation de la table "abonné", car la colonne de fragmentation ("Region") n'est pas un attribut direct de la table "Appel" mais est liée via une clé étrangère.
4.b. Fragmentation Dérivée de la Table "Appel" (Expressions Algébriques)
La fragmentation dérivée assure que les données connexes sont stockées ensemble, minimisant ainsi les jointures distribuées.
Table Appel
Appel_sud = appel ⋉ ab_sud
Appel_Nord = appel ⋉ ab_Nord
Appel_Est = appel ⋉ ab_Est
Appel_Ouest = appel ⋉ ab_Ouest
Le symbole (⋉) représente une semi-jointure, indiquant que les tuples de la table "Appel" sont inclus dans un fragment s'ils correspondent aux tuples du fragment "abonné" correspondant.
4.c. Requête SQL pour la Fragmentation par Référence de la Table "Appel"
La fragmentation par référence permet de partitionner une table enfant en s'alignant sur le partitionnement de sa table parente, en utilisant la contrainte de clé étrangère qui les lie.
CREATE TABLE appel (
numTelAppellant NUMBER PRIMARY KEY,
dateAppel VARCHAR2(40),
numTelCorrespondant NUMBER,
duree NUMBER,
montant NUMBER,
CONSTRAINT numappellant_fk FOREIGN KEY (numTelAppellant) REFERENCES abonnes (num_tel)
)
PARTITION BY REFERENCE (numappellant_fk);
5.i. Requête SQL sur Fragments
Cette requête agrège les moyennes des montants d'appels pour les abonnés de moins de 25 ans, en combinant les résultats de fragments spécifiques.
Select AVG(montant) From appel_sud where age < 25
UNION ALL
Select AVG(montant) From appel_ouest where age < 25;
Note : L'utilisation de UNION ALL est souvent préférée à UNION pour éviter le coût de l'élimination des doublons si cela n'est pas nécessaire.
5.ii. Stratégies d'Exécution pour Requêtes Distribuées
Lors de l'exécution d'une requête sur des fragments de données répartis sur différents sites, plusieurs stratégies peuvent être employées pour optimiser les performances :
- Envoyer le fragment "Appel_sud" vers le site d'Oran, exécuter la sous-requête localement, puis envoyer le résultat partiel au site central d'Alger.
- Envoyer le fragment "Appel_ouest" vers le site d'Oran (ou un autre site approprié), exécuter la sous-requête localement, puis envoyer le résultat partiel au site central d'Alger.
- Transférer les deux fragments ("Appel_sud" et "Appel_ouest") directement au site central d'Alger et y exécuter la requête complète.
Le choix de la stratégie dépend des coûts de communication, de la puissance de calcul des sites et de la distribution des données.
Foire Aux Questions (FAQ)
Qu'est-ce que l'ODL et l'OQL ?
L'ODL (Object Definition Language) est un langage servant à définir la structure (le schéma) d'une base de données orientée objet, incluant les classes, leurs attributs et leurs relations. L'OQL (Object Query Language) est le langage de requête associé, permettant d'interroger et de manipuler les objets dans ces bases de données avec une syntaxe riche.
Pourquoi la fragmentation de base de données est-elle utilisée ?
La fragmentation est une technique essentielle dans les bases de données distribuées pour améliorer les performances des requêtes, augmenter la disponibilité des données, faciliter la gestion et permettre une meilleure scalabilité en répartissant les données sur plusieurs sites physiques. Elle peut réduire les transferts de données et optimiser l'utilisation des ressources.
Quelle est la différence entre la fragmentation horizontale par liste et par référence ?
La fragmentation horizontale par liste divise une table en fragments en se basant sur une liste de valeurs spécifiques pour un attribut de cette table (par exemple, partitionner les clients par pays). La fragmentation horizontale par référence partitionne une table (dite enfant) en fonction du schéma de partitionnement d'une table liée (dite parente), en utilisant une contrainte de clé étrangère, afin de co-localiser les données liées et d'optimiser les jointures distribuées.