Exercices sur l'Entreposage de Données
Exercices sur l'Entreposage de Données
1.1.1 Solution
1.1.5 Solutions possibles pour la mesure NUMÉRO (comptage des événements primaires)...........................................14
1.1.6 Solutions possibles pour la mesure COÛT (mesure avec AVG dans un schéma transactionnel)..................15
1.2.1 Solution
1.3.1 Solution........................................................................................................................................24
1.3.2 Variante
1.4.1 Solution
1.5.1 Solution........................................................................................................................................32
1
1 EXERCICES - Conception d'un DW
Pour certains exercices, le code SQL est également fourni pour tester les solutions données. La table de faits et les
Les tables de dimension sont définies comme des vues dans le DBO donné (architecture à un niveau)
RÉGION ÉTAT
VILLE
MAGASIN (1,1) DANS (0,N) CITTA RÉGIONà ÉTAT
ORDRE
(1,1) (1,1)
REPARTO(REPARTO, MAGASIN:MAGASIN)
DISTRIBUTION CLIENT
MAGASIN
(1,N) REPARTITION (1,N)
CLIENT
OUAIS CLIENTE
DEL
COÛT EXPÉDITION(NRIGA,ORDRE:ORDRE,
(1,1) PRODUIT (1,1)
PRODUIT
REPARTO
EXPÉDITION (1,N) ORDRE
DATE
(1,1) COSTO)
(1,1) NRIGA ORDRE
MOIS
Données AK: { ORDINE,PRODOTTO,
ORDRE DÉPARTEMENT
DONNÉES ANNEE
(0,N)
Données (0,N)
DONNÉES
EXPÉDITION
Il est demandé de :
A) Conception conceptuelle : Conception du schéma de fait EXPÉDITION avec dimensions
PRODUIT
mesurer
COUT : c'est le coût moyen de DÉ[Link]
2
Exemple d'instance du DBO et correspondante instance du fait (événements primaires)
PRODUIT
ENTREPÔT
CLIENT
DATASPED
3
Solution
Conception conceptuelle
Dans la conception conceptuelle, il est nécessaire de présenter un schéma de fait avec toutes les dimensions requises et, pour
chaque dimension, avec toute la hiérarchie dérivant du schéma du DBO.
4
INNESTO sur REPARTO et ORDRE
RÉGIONà État
MÉSEà ANNEE
5
Si obtient
6
Choix des dimensions
Un schéma de fait est donc créé, en tenant compte d'un partage sur CITTA.
7
VILLE
RÉGION ENTREPÔT
ÉTAT
EXPÉDITION DATASPED
NUMÉRO
COUT (Moy.) MOIS
CLIENT NUMÉRO_DE_COMMANDES
ANNEE
PRODUIT
EXPÉDITION(NRIGA,ORDRE,PRODUIT,DÉPARTEMENT, DATASPEDITION,COUT)
Dimensioni:{PRODOTTO,MAGAZZINO,CLIENTE,DATASPED}
Granularité
Mesures normales
NOMBRE= COUNT(*), additive
Mesures calculées
COSTO = COSTO_SUM / COSTO_COUNT
pigeon
COSTO_SUM = SOMME(COSTO), additive
COSTO_COUNT = COUNT(COSTO)
Table de faits
TABLE_DE_FACTURE(PRODUCT,ENTREPOT,CLIENT,DATESPED,
NUMÉRO
À ce stade, une table de faits avec une structure simplifiée (sans références aux)
Tableau des dimensions) pour résumer quelles sont les dimensions du fait et les mesures à considérer.
Résumer quelles sont toutes les mesures est également utile pour vérifier s'il y a parmi toutes ces mesures
certaines équivalentes. Par exemple, dans ce cas, deux mesures ont été introduites et reportées dans la Table des Faits
NOMBRE
COUNT(COSTO)
Ces deux mesures sont-elles équivalentes ? Si la réponse est positive, une seule sera insérée dans la Fact Table.
mesure.
8
Conception Logique
Dans la conception logique, il est demandé de décrire à la fois le SCHÉMA ÉTOILE et le SCHÉMA FLOCON.
SCHEMA; La table de faits dans ces deux types de schémas coïncide (tandis que celles qui changent sont
évidemment les tables de dimension) donc nous pouvons rapporter la table de faits une seule fois.
FACT_TABLE(PRODOTTO,MAGAZZINO,CLIENTE,DATASPED,
NUMÉRO
Comme dit précédemment, nous devons nous demander si les deux mesures
COMPTE(*)
COUNT(COSTO)
sont équivalents, c'est-à-dire si leur valeur coïncide. Donc, il faut vérifier si COUNT(*) et
COUNT(COSTO) renvoie la même valeur : la réponse est négative si dans le DBO le champ COSTO peut
assumer des valeurs NULL, car par définition une valeur NULL est comptée par COUNT(*) mais
non est compté par COUNT(COSTO). Dans nos exercices, nous supposons le cas général de la présence de
NULL donc dans la table de faits, les deux mesures seront toujours retenues.
FACT_TABLE(CLIENTE:dtCLIENTE,MAGAZZINO:dtMAGAZZINO,DATASPED:dtDATA,PRODOTT
O,
NUMÉRO
Veuillez noter que la dimension PRODUIT est dégénérée, donc la table de dimension correspondante n'est pas insérée.
Schéma en étoile
dtDonnées(DONNÉES,MÉMOIRE,ANNÉE)
dtCLIENTE(CLIENTE,CITTA,REGIONE,STATO)
dtMAGAZZINO(MAGAZZINO,VILLE,RÉGION,ÉTAT)
Schéma SnowFlake
dtDonnées(DONNÉES, MOIS:dtMOIS)
dtMESE(MESE,ANNO)
dtCLIENTE
dtMAGAZZINO(MAGAZZINO,VILLE:dtVILLE)
dtCITTA(CITTA,REGIONE:dtREGIONE)
dtRÉGION(RÉGION, ÉTAT)
9
Alimentation
EXPÉ[Link]
EXPÉ[Link]
[Link]
[Link]
Pour tester la requête, en devant l'exécuter sur un SGBD qui ne prend pas en charge le NATURAL JOIN :
DE EXPÉDITIONJOINDRE
[Link]=SPÉ[Link]
[Link]
10
1.1.2 Variante 1
Il est demandé de discuter comment change l'agrégation de la mesure NUMERO_ORDINI en tenant compte de
come dimensione MESE_ORDINE invece di DATASPED.
Dimensioni:{PRODOTTO,MAGAZZINO,CLIENTE,MESE_ORDINE}
ORDREà CLIENT
ORDREà MOIS_COMMANDE
Donc maintenant NUMERO_ORDINI est agrégable tant par rapport à CLIENTE qu'à MESE_ORDINE, par conséquent
NA:{PRODOTTO,MAGAZZINO }
Dimensioni:{PRODOTTO,MAGAZZINO, ORDINE,DATASPED }
Par rapport à l'exemple précédent, on utilise comme dimension ORDRE à la place de CLIENT, donc le nouveau
fait est à un niveau de détail plus élevé. L'aspect principal concerne la mesure
NOMBRE_COMMANDES=COMPTER(DISTINCT COMMANDE):
Grâce à la présence de la dimension ORDRE, maintenant NUMÉRO_COMMANDES est une mesure dérivée d'un
dimension, donc elle ne sera pas insérée dans la table des faits !
Le schéma est en fait similaire à celui précédent : l'ajout de l'attribut dimensionnel ORDRE fait que
DATA est désormais un attribut dimensionnel commun entre la dimension COMMANDE (en effet, une COMMANDE a une
DATA) et la dimension DATASPED. Notez que pour cet attribut dimensionnel commun, on utilise le
termine plus général DATA et non DATA_SPED (sinon il serait indiqué qu'une COMMANDE a une)
DATA_SPED, chose non vraie). Cependant, DATA_SPED doit rester comme nom de la dimension, donc il
mette tale nome sularco(come avveniva ad esempio nel caso del Fatto Chiamata discusso sulle dispense).
CITTA ÉTAT
ENTREPÔT
EXPÉDITION RÉGION
NUMÉRO ORDRE
Fait:EXPÉDITION(NRIGA,ORDRE,PRODUIT,DÉPARTEMENT, DATASPEDITION,COUT)
AK: { ORDINE,PRODOTTO, REPARTO,DATASPEDIZIONE }
Dimensioni:{PRODOTTO,MAGAZZINO,ORDINE,DATASPED}
Granularité
11
Dépendances fonctionnelles entre les dimensions : Aucune
Mesures normales
NUMÉRO
Mesures calculées
COSTO_MEDIO = COSTO_SUM/COSTO_COUNT où
SOMME(COSTO), additive
COUNT(COSTO)
Mesures dérivées
NOMBRE_COMMANDES
Table des faits
TABLE_DE_FACTURES(PRODOTTO,MAGAZZINO,ORDINE,DATASPED,
NUMÉRO
PRODUIT
Donc, on utilise la taille SERVICE au lieu de STOCK, donc - comme dans le précédent
variante - le nouveau fait est à un niveau de détail plus élevé, c'est-à-dire que le nouveau fait a une granularité plus fine.
La caractéristique fondamentale de ce cas est que les dimensions coïncident (et qu'elles contiennent) une
clé du fait, c'est-à-dire que les dimensions coïncident avec la clé alternative
Ainsi, le nouveau fait EXPÉDITION est transactionnel ; les événements primaires du nouveau fait EXPÉDITION seront
en nombre égal au nombre d'instances (la cardinalité) de la relation EXPÉDITION du DBO :
Dans ce qui suit, ce nouveau cas est entièrement développé, mettant en évidence comment pour un schéma de
le fait transactionnel soit différent la requête d'alimentation de la table fait et le calcul des mesures, dans
particulièrement celles agrégées par la moyenne.
12
Conception Conceptuelle
Le schéma est en fait similaire au précédent : l'ajout de l'attribut dimensionnel ORDRE fait que
DATA est maintenant un attribut dimensionnel commun entre la dimension COMMANDES (en effet, une COMMANDE a une
DATA) et la dimension DATASPED. Dans ce qui suit, la convergence/le partage sur DATA sera discuté.
DISTRIBUTION
VILLE ÉTAT
MAGASIN
EXPÉDITION RÉGION
NUMÉRO ORDRE
FattoEXPÉDITION
AK: { ORDINE,PRODOTTO, REPARTO,DATASPEDIZIONE }
{PRODUIT,DÉPART,COMMANDE,DATESPED}
Granularité
Conception Logique
FACT_TABLE(ORDINE:dtORDINE,REPARTO: dtREPARTO,DATASPED:dtDATA,PRODOTTO,
<sera terminé après la discussion sur les mesures>
Schéma en étoile
dtDONNÉES(DONNÉES,MOS,ANNÉE)
dtORDRE
dtREPARTO
Schéma SnowFlake
dtDONNEES(DONNEES,MOIS:dtMOIS)
dtMESE(MESE,ANNO)
dtORDINE(ORDINE,DATA:dtDATA,CLIENTE:dtCLIENTE)
dtCLIENTE
dtCITTA(CITTA,RÉGION:dtRÉGION)
dtRÉGION(RÉGION, ÉTAT)
dtREPARTO(REPARTO,MAGAZZINO:dtMAGAZZINO)
dtMAGAZZINO
13
1.1.5 Solutions possibles pour la mesure NUMÉRO (compte des événements primaires)
La mesure NUMÉRO dans le cas d'un schéma transactionnel correspond à ce qui a été discuté dans le cas de « Schémas ».
de fait vides”, c'est-à-dire que NUMERO est une mesure utilisée pour le comptage des événements primaires. Comme cela avait été
déjà signalé et comme nous le mettrons en évidence dans l'exemple, le nom « Schémas de fait vide » provient du fait que dans
dans ce cas, une solution possible est de ne pas insérer explicitement de mesure dans le schéma de
fait pour le comptage des événements primaires, c'est-à-dire ne mémoriser aucune valeur : ce concept de non
l'insertion de aucune mesure et la non-mémorisation de aucune valeur entraîne que dans la table des faits correspondante il n'y a pas
il ne doit y avoir aucun attribut pour cette mesure. D'autre part, le schéma de fait et donc la table de faits peuvent
contenerealtremisure (comme c'est le cas ici pour la mesure COÛT)
Prima Solution : mesurez les indicateurs pour le comptage des événements primaires
Mesures normales
(COMPTER)à pour indiquer en effet une mesure vide pour le comptage des événements primaires
Alimentation
Une autre manière de représenter la survenue d'un événement est à travers une mesure de type booléen, additive :
normalement, lorsqu'il s'agit d'effectuer un simple comptage des événements primaires, cette mesure prend
il n'y a que la valeur 1 (événement qui s'est produit) et non la valeur 0 (dans le schéma, en fait, on ne représente pas les
événements qui ne se produisent pas). Nous verrons néanmoins dans un prochain exercice qu'il est parfois nécessaire de compter
seulement certains événements (par exemple, dans le cas de l'exercice sur le fait BIGLIETTO, on souhaite représenter
tous les billets mais on ne veut compter que ceux qui ont également enregistré des bagages); dans ce cas
La mesure de comptage booléenne prend les valeurs 1 et 0.
Mesures normales
NUMERO = 1, additiva
Table de faits
TABLE_DE_FAITS
NUMÉRO)
NUMÉRO est une mesure normale : cette mesure a une valeur pour chaque événement primaire - dans ce cas
constante égale à 1 – et un opérateur d'agrégation pour en déterminer la valeur pour les événements secondaires
Si je le ramenais dans la table des faits, alors pour les agrégations, je devrais évidemment utiliser
NUMERO = SOMME(NUMERO)
14
Mais étant NUMERO=1, cela équivaut à faire
SOMME(1)
Il n'est donc pas nécessaire de rapporter le NUMÉRO comme attribut de la table de faits.
SÉLECTIONNER
M.VILLE_MAGASIN_VILLE, C.VILLE_CLIENT_VILLE
=SOMME(1)
FROMFACT_TABLE FJOIN
dtREPARTO [Link]=[Link]
dtMAGAZZINO [Link]
dtORDINE [Link]=[Link]
dtCLIENTE [Link]=[Link]
GROUPE PAR [Link], [Link]
On peut vérifier que le résultat est correct en le comparant avec ce qui a été obtenu dans les tableaux de faits.
précédents.
En définitive, nous avons deux solutions similaires, dans les deux cas rien n'est reporté dans la table des faits pour la
mesure numéro (c'est ce qui justifie le terme Schéma de Fait vide utilisé dans ces cas). Ce que
Changez l'opérateur d'agrégation, dans le sens où nous pouvons utiliser deux opérations équivalentes
=NB(*)
ou bien
=SOMME(1)
1.1.6 Solutions possibles pour la mesure COÛT (mesure avec AVG dans le schéma transactionnel)
Dans un schéma transactionnel, pour une mesure telle que le COÛT qui doit être agrégée par moyenne, il
il y a deux solutions possibles
Table de faits
15
Alimentation
CREER VIEWFACT_TABLEAS
SELECTIONNER PRODUIT
FROMSPEDIZIONE
SÉLECTIONNER
M.CITTAASMAGAZZINO_CITTA
C.CITTAASCLIENTE_CITTA
COSTO = MOYEN(COSTO)
DE<comme avant>
On peut vérifier que le résultat est correct en le comparant avec ce qui a été obtenu dans les schémas de fait.
précédents.
Dans ce cas, étant le schéma transactionnel, les événements primaires seront calculés sans regrouper.
il n'a donc évidemment aucun sens de définir une mesure à travers un opérateur d'agrégation :
dans COSTO_COUNT =COUNT(COSTO) il a été indiqué COUNT en italique justement pour indiquer que
conceptuellement, je dois faire un comptage mais ce comptage est unitaire, c'est-à-dire COSTO_COUNT=1. De
en conséquence, cette mesure COSTO_COUNT coïncide avec la mesure NUMERO et peut donc être
définie et calculée comme déjà discuté précédemment :COMPTE(*)ou bienSOMME(1).
Les deux solutions pour le calcul du COÛT comme valeur moyenne coïncident sous l'hypothèse que dans le schéma
operazione le valeur de COÛT ne doit pas être NULL ; en effet, une valeur NULL de COÛT n'est pas prise en compte,
c'est-à-dire qu'elle ne participe pas au calcul, dans la première solution, car, par définition, la fonction AVG est
calcolée sur les valeurs non nulles. Dans la deuxième solution, en revanche, la valeur NULL de COÛT est considérée dans
combien n'est pas additionné (par définition, la fonction SOMME sur les valeurs non nulles) mais est
conteggié, que ce soit via COUNT(*), car par définition COUNT(*) compte aussi les valeurs nulles, soit
à travers SUM(1) .
Modifions la table EXPÉDITION avec quelques NULL sur COÛT, puis vérifions la différence pour un
modèle simple {ORDRE}
16
tableau SPEDIZIONE COUT calculé comme COUT calculé comme
COUT=MOYEN(COUT) COSTO=SUM(COSTO_SUM)/SUM(1
)
Dans le cas de COÛT en tant que mesure calculée, pour considérer que COÛT peut être nul et donc non
doit participer à la moyenne, nous ne pouvons plus utiliser comme COSTO_COUNT l'expression SUM(1) (même
discours pour l'expression COUNT(*)) mais nous devons compter les valeurs NULL différemment, donc
on insère une mesure normale COÛT_COUNT qui sera 1 si COÛT n'est pas NULL, 0 sinon.
CREER VUE_TABLE_COMME
SELECTPRODOTTO
COSTO
CASE WHEN COSTO IS NULL THEN 0 ELSE 1 END
FROMSPEDIZIONE
17
Code SQL
Création du DBO (vérifier, il peut ne pas être complètement à jour par rapport à l'exemple)
18
1.2 Exercice : Détail de la commande
Considérons un DBO avec le schéma E/R suivant et le schéma relationnel correspondant
RÉGION État
VILLE
ENTREPRISE (1,1) DANS (0,N) VILLE RÉGIONà État
(1,N) (0,N)
ENTREPRISE
VILLE DONNÉES(DONNÉES,Mois,ANNÉE)
DI ADRESSE DF : MOISà ANNEE
(0,N)
Données (0,N)
Données
EXPÉDITION
Il est demandé de
A) Conception conceptuelle : Conception du schéma de fait DÉTAILS des co-dimensions
produit
c'est le coût moyen
NUMÉRO : c'est le nombre total d'expéditions
B) Conception logique : Conception du SCHEMA STAR et du SCHEMA SNOWFLAKE
C) Alimentation : Écrire en SQL l'alimentation de la table de faits.
Solution
Le schéma de fait est similaire à celui de la fait Livraison – deuxième variante : le seul ajout est
l'association PREFER (un CLIENT a un PRODUIT préféré) qui relie CLIENT à PRODUIT.
Cela implique que l'attribut dimensionnel PRODUIT est maintenant commun aux deux dimensions COMMANDES et
PRODUIT. Dans ce cas - contrairement à ce qui a été discuté avec DATE et DATE_EXPÉDITION - étant donné qu'il n'y a pas
nous pouvons utiliser le même nom PRODUIT à la fois pour la dimension et pour l'attribut commun.
DÉTAIL RÉGION
NUMÉRO
Avec la nouvelle association PREFER, CITTA est également accessible par le chemin CLIENTE_PRODOTTO.
19
Fait:DÉTAIL(NRIGA,ORDRE, PRODUIT, DATEXPÉDITION,COSTE)
Dimensioni:{PRODOTTO,ORDINE,DATASPED}
Temporal
Mesures normales
NOMBRE
Mesures calculées
COSTO_MOYEN = COSTO_SOMME / COSTO_NOMBRE
colombe
SOMME(COSTO), additive
COUT_COUNT = COUNT(COUT), additif
Table de faits
FACT_TABLE(PRODOTTO,MAGAZZINO,CLIENTE,DATASPED,
NUMÉRO
Conception Logique
FACT_TABLE(ORDINE:dtORDINE,PRODOTTO:dtPRODOTTO,DATASPED:dtDATA,
NUMÉRO
Schéma en étoile
dtDONNÉES(DONNÉES,MOIS,ANNEE)
dtORDINE(ORDINE,DATA,MOIS,ANNEE,
CLIENT
PROD_P_CLIENTE
PROD_P_CLIENTE_AZIENDA_REGION )
dtPRODOTTO(PRODOTTO,AZIENDA,AZIENDA_CITTA,AZIENDA_REGIONE,AZIENDA_STATO)
Schéma SnowFlake
dtDonnées(DONNÉES,MES:dtMÉS)
dtMESE(MESE,ANNO)
dtORDINE
dtPRODUIT(PRODUIT,ENTREPRISE:dtENTREPRISE)
dtENTREPRISE(ENTREPRISE,VILLE:VILLE)
dtVILLE(VILLE,RÉGION:dtRÉGION)
dtRÉGION(RÉGION, ÉTAT)
dtCLIENTE(CLIENTE, CITTA:dtCITTA,PREFER:dtPRODOTTO)
Alimentation
CREER VUE_TABLE_DE_FAIT
SÉLECTIONNER
PRODUIT
SOMME(COSTO)
COUNT(COSTO)
=NB(*)
DE
DÉTAIL
GROUPE PAR
PRODUIT
20
Code SQL
Création du DBO
CRÉER TABLE ORDINE ( ORDINE INT, CLIENTE INT, DATA INT);
CRÉER TABLE PRODOTTO ( PRODOTTO INT, AZIENDA INT);
CRÉER TABLE AZIENDA ( AZIENDA INT, CITTA INT);
CREER TABLE CLIENTE ( CLIENTE INT, CITTA INT, PREFER INT);
CRÉER TABLE CITTA ( CITTA INT, REGIONE INT, STATO INT);
CRÉER TABLE DONNÉES ( DONNÉE INT, MOIS INT, ANNÉE INT);
CRÉER UNE TABLE DETTAGLIO ( NRIGA INT, ORDRE INT, PRODUIT INT, DATASPED INT, COÛT FLOAT );
INSÉRER DÉTAIL ( NRIGA, ORDRE, PRODUIT, DATASPED, COÛT ) SÉLECTIONNER 1, 4, 10, 30, 22
INSÉRER DÉTAIL ( NRIGA, ORDRE, PRODUIT, DATASPED, COÛT ) SÉLECTIONNER 2, 4, 20, 30, 22
INSÉRER DÉTAIL ( NRIGA, ORDRE, PRODUIT, DATASPED, COÛT ) SÉLECTIONNER 3, 4, 30, 30, 22
INSÉRER DÉTAIL ( NRIGA, ORDRE, PRODUIT, DATEENVOI, COÛT ) SÉLECTIONNER 1, 1, 10, 30, 16
INSÉRER DÉTAIL ( NRIGA,ORDRE,PRODUIT,DATASPED,COUT ) SÉLECTIONNER 2,1,20,20,15
INSÉRER DÉTAIL ( NRIGA, ORDRE, PRODUIT, DATEENVOI, COÛT ) SÉLECTIONNER 3, 1, 30, 30, 13
INSÉRER DÉTAIL ( NRIGA, ORDRE, PRODUIT, DATASPED, COÛT ) SÉLECTIONNER 1, 2, 10, 20, 13
INSÉRER DÉTAIL ( NRIGA, ORDINE, PRODUIT, DATASPED, COÛT ) SÉLECTIONNER 2, 2, 20, 30, 13
INSÉRER DÉTAIL ( NRIGA, ORDRE, PRODUIT, DATASPED, COÛT ) SÉLECTIONNER 3, 2, 30, 20, 12
INSÉRER DÉTAIL ( NRIGA,ORDRE,PRODUIT,DATASPED,COUT ) SÉLECTIONNER 1,3,10,20,11
INSÉRER DÉTAIL ( NRIGA,ORDRE,PRODUIT,DATASPED,COUT ) SÉLECTIONNER 2,3,30,30,22
Création du StarSchema
CRÉER UNE VUE [DTDATA] AS SÉLECTIONNER * DE DONNÉES
21
1.3 Exercice : Billet
Considérons un DBO avec le schéma relationnel suivant :
VOLO(CODVOLO,DATA,RITARDO,COMPAGNIA)
BIGLIETTO(POSTO,[CODVOLO,DATA]:VOLO,COSTO )
Il est demandé de
En effet, on veut représenter tous les billets (en comptant leur nombre total via NBIGLETS et le coût
moyen coût) et on veut compter ceux qui ont également fait le check-in : NBIBLIETTICHECK-IN
ce sera une mesure de comptage booléenne qui prend la valeur 1 (il y a eu un enregistrement) et la valeur 0 (pas d'enregistrement)
dans).
Une autre caractéristique réside dans l'alimentation : en effet, la taille VOLO provient d'une paire d'attributs.
(Données et CODVOLO) du DBO.
22
Exemple d'instance du DBO et instance correspondante du fait (événements primaires)
VOL BILLET
ENREGISTREMENT
Événements Primaires
du Fait BIGLIETTO
Avec des dimensions
{VOLO,NPOSTO}
23
1.3.1 Solution
Conception conceptuelle
Pour des raisons de simplicité, on commence par effectuer l’ingénierie inverse du schéma relationnel.
NPOSTO
Le schéma de fait BILLET avec dimensions
{VOLO,NPOSTO} est très simple ; notez qu'avec VOLO, on
entend l'attribut dimensionnel dérivant de CODVOLO + VOLO BILLET
(comme dans le cas du DISTRICT de l'exemple VENTE). COUT (Moyenne)
L'attribut dimensionnel CODVOLO est un fils de VOLO (de NBC
CODVOLO permet de recueillir des informations telles que le départ, la destination NB
COMPAGNIE
NB=NBIGLIETTI
NBIGLIETTI_CHECK-IN Données
RITARDO
FattoBIGLIETTO(VOL,NPOSTO,COUT)
Dimensioni {VOLO,NPOSTO}
Granularité : Transactionnelle (en fait VOLO est CODVOLO + VOLO, donc on obtient CODVOLO, VOLO, DATE)
Mesures normales
NB=1, additiva
Veuillez noter qu'à ce stade, il est seulement indiqué, à un niveau élevé, comment calculer le NBC ; le calcul effectif
sera explicité lors de l'alimentation
Mesures calculées
COSTO_SUM/COSTO_COUNT
dove COSTO_SUM = SUM(COSTO), additiva
COSTO_COUNT = COUNT(COSTO), additiva
Table de faits
(VOLO,NPOSTO,NBC, COSTO_SUM,COSTO_COUNT)
Veuillez noter que deux choix de conception ont déjà été effectués :
1) pour la mesure NB : elle n'est pas introduite dans la Fact Table, elle sera agrégée via COUNT(*)
24
2) pour la mesure COÛT : le schéma est transactionnel, il y a deux possibilités pour définir COÛT
(voir section 1.1.4), il est choisi de considérer le COÛT comme une mesure calculée
Conception Logique
dtVOLO(VOLO,DONNEE,CODVOLO,COMPAGNIE,RETARD)
Alimentation
Le schéma est transactionnel, donc la vue d'alimentation ne doit pas regrouper. Il faut calculer.
NBC =SI <BIGLIETTO AVEC ENREGISTREMENT> ALORS 1 SINON 0, additive
Il est important (même sans l'exécuter réellement) de savoir que cette requête retourne en sortie le même
nombre de tuples de BIGLIETTO : en effet, BIGLIETTO est du côté gauche de la jointure et BIGLIETTO et CHECK-IN
ils partagent la clé. Par conséquent, si dans la sélection, on met BIGLIETTO.*, je reçois la table BIGLIETTO.
avec en plus la colonne NBC et donc j'ai tout ce dont j'ai besoin pour calculer la Fact Table.
CREER VUE_TABLE_COMME
[Link],
VOLO=[Link]+CODVOLO
NBC=CAS QUAND C.[CODVOLO] EST NULL ALORS 0 SINON 1 FIN,
COSTO
CASE WHEN COSTO IS NULL THEN 0 ELSE 1 END
DEBIGLIETTO BLEFT JOIN[ENREGISTREMENT] CON(
B.[DONNÉES]=C.[DONNÉES]ETB.[CODVOLO]=C.[CODVOLO]ETB.[POSTO]=C.[POSTO])
En réalité, pour effectuer la concaténation VOLO = [Link] + CODVOLO, il est nécessaire de les convertir en chaînes.
VOLO=CONVERTIR(CHAR(20),[Link]) +'__'+CONVERTIR(CHAR(20),[Link]).
25
1.3.2 Variante
Dans le schéma de fait précédent (transactionnel), on introduit la mesure
C'est-à-dire que le GAINS est défini à partir de l'attribut COÛT, tout comme la mesure COÛT, mais c'est une
mesure additive. On introduit également une mesure additive NCOLLI. Les événements primaires sont :
Mesures normales
NB=COMPTE(*), additive
NCOLLI = SOMME(SI <BIGLIETTO AVEC ENREGISTREMENT> ALORS NCOLLI SINON 0), additive
COSTO, additiva
Mesures calculées
COSTO = SOMME_COSTO / NOMBRE_COSTO
colombe
SOMME(COSTO), additive
COUT_COUNT = COUNT(COUT), additif
Conception Logique
Naturellement, le GUADAGNO est calculé à partir de COSTO_SUM, donc il n'est pas nécessaire d'avoir un autre attribut :
NCOLLI=ISNULL(NCOLLI,0)
26
1.3.3 Variante (dimension résultant de la discrétisation)
Si considère une autre variante dans laquelle la dimension précédente NPOSTO est discrétisée dans l'attribut.
classe dimensionnelle de cette manière :
emisure{COSTO,NBIGLIETTI,NBIGLIETTI_CHECK-IN,GUADAGNO,NCOLLI}.
Événements Primaires
de la Fait BIGLIETTO
DONNÉES
RITARDO
Mesures normales
NB=NB(*), additive
NBC = SOMME(SI <BIGLIETTO AVEC ENREGISTREMENT> ALORS 1 SINON 0), additive
NCOLLI = SOMME(SI <BIGLIETTO AVEC ENREGISTREMENT> ALORS NCOLLI SINON 0), additive
GUADAGNO : SOMME(COSTO), additive
FACT_TABLE(CLASSE,VOLO:dtVOLO,NB,NBC,NCOLLI, COSTO_SUM,COSTO_COUNT)
dtVOLO(VOLO,DATAS,COMPAGNIE,FASCIA_RITARDO)
Alimentation : Étant donné le schéma temporel, l'alimentation de la Table de faits nécessite de regrouper
sur les dimensions. Mais dans ce cas, les deux dimensions sont calculées
VOL=DONNÉE+CODVOL
CLASSE=SI POSTO<=1 ALORS 'PRIMA' SINON 'SECONDA' FIN
En SQL, le regroupement GROUP BY est également possible sur des expressions génériques donc
Bien que non demandé, pour obtenir les événements primaires et la table de dimension dtVOLO
28
1.4 Exercice : Examen
RÉGION SEDE: un CDS (CorsoDiStudio) a sede d'une
ÉTUDIANT (1,1) ISCRI
(0,N) FACULTÉ
FACULTÉ
DI (0,N) TTO
(0,N)
(0,N) DELtra DOCENTE et CDS : un DOCENTE est de
(1,1)
GROUPE (0,N) un CDS
RAPPRES
TIPO (1,N) AFFERENZA
ENTANT SIEGE
CONtra APPELLO et DOCENTE : un APPEL
EXAMEN DEL (1,1) c'est avec le DOCENTE qui le tient
(1,1) (1,1)
ÉTUDIANT
(1,1)
(1,N) DEL (1,1) Attributo TYPE_EXAM de l'EXAMEN : assume le
CDS ENSEIGNANT
EXAMEN valore STUD s'il s'agit d'un examen d'un étudiant
GROUPE
(1,N) et la valeur GRUP s'il s'agit d'un examen d'un
(T,E) CON
GÉNÉRE
groupe
VOTE (1,1)
NUMES NUMESè un identifiant d'EXAMEN (clé
EXAMEN (1,1) DI (1,N) APPEL
alternativa dans le schéma relationnel):
c'est un numéro progressif unique
DONNÉES TYPE_DE_EXAMEN de l'examen.
(ÉTUD/GROUPE)
FACULTÉ CDS
ENSEIGNANT
APPELLO
ESAME(NUMES, APPELLO:APPELLO, DATA, TIPO_ESAME, VOTO) AK : NUMES
ESAMEGRUPPO(NUMES:ESAME, GRUPPO:GRUPPO)
ESAMESTUDENTE(NUMES:ESAME, STUDENTE:STUDENTE) GRUPPO(GRUPPO,TIPO)
Il est demandé :
A) Conception conceptuelle : Conception du schéma de fait EXAMEN avec
dimensions GROUPE
L'ÉTUDIANT est l'ÉTUDIANT qui a passé l'examen
GRUPPO est le GRUPPO qui a passé l'examen
mesures
c'est la note moyenne de l'examen
c'est le nombre distinct des appels
B) Conception logique : Conception du STARSCHEMA
C) Alimentation : Écrire en SQL l'alimentation de la table de faits.
Exemple d'instances :
DBO:relationEXAMEN DW : Événements Primaires du Fait EXAMEN
29
Solution
Conception conceptuelle
Dimensioni ENSEIGNANT
Mesures normales
COUNT(DISTINCT [Link]), additiva avec NA = {STUDENTE,DATA,GRUPPO}
Mesures calculées
VOTO_TOT / VOTO_COUNT
colombe
SOMME(VOTO)
COMPTE_VOTES = COMPTE(*)
FACT_TABLE(DATA,GRUPPO:dtGRUPPO,STUDENTE:dtSTUDENTE,DOCENTE:dtDOCENTE
TIPOESAME
dtGRUPPO(GRUPPO,TIPO)
dtSTUDENTE(STUDENTE, FACOLTA, FACOLTA_REGIONE, FACOLTA_STATO)
dtDOCENTE(DOCENTE,FACOLTA, FACOLTA_REGIONE,
CDS
CDS_ÉTUDIANT
30
Alimentation
L'aspect caractéristique est la présence de dimensions optionnelles, dont la valeur nulle est appropriément
codifié (on utilise toujours 9999)
Pour une simplicité, on utilise le NATURAL JOIN (afin d'éviter d'écrire la condition de jointure).
Il est possible d'utiliser le NATURAL JOIN même pour les jointures externes, c'est-à-dire que l'écriture de la VIEW1 peut
simplifier en écrivant :
CRÉER UNE VUE VIEW1 COMME
SELECT ESAME.*, ISNULL([Link],9999) AS STUDENTE,
ISNULL([Link],9999) AS GRUPPO
DE L'ESAME
JOINTURE NATURELLE GAUCHE SUR LE MÊME GROUPE
JOINTURE NATURELLE GAUCHE AVEC LE MÊME ÉTUDIANT
31
1.5 Exercice : Vente
Soit donné le schéma relationnel du DBO
VENTE
PRODUITà CAISSE
NUMÉRO_DE_BON_DE_CASSEà
DONNÉES
PRODUIT(PRODUIT,TYPE:TYPE)
TIPO
Il est demandé :
1) Ingénierie inverse : Schéma E/R équivalent
2) Conception Conceptuelle : Schéma de Fait avec
{PRODUIT,CAISSE,COMMIS,DAT}
i. NUMVENDITE = count(*)
ii. NUMCLIENTI = compter(DISTINCT NUMERO_SCONTRINO)
3) Conception logique : SCHÉMA EN FLOCON DE NEIGE
4) Supposons que l'attribut COMMIS prenne la valeur NULL pour les ventes sans COMMIS et
une valeur NON NULLE pour les ventes avec vendeur, considérer le Schéma de Fait avec
{PRODUIT, CAISSE, DATE} et discuter de la définition et de l'agrégation de
mesure nombre de ventes avec COMMIS
1.5.1 Solution
Schéma E/R :
(1,1) COMM
CATÉGORIE
DI
CASSA (1,N)
GROUPE
(1,N)
TYPE
TYPE
PRODUIT PRODUIT
VENTE VENTE
CAISSE
NUMVENDIT
NOMBRE DE VENTES
E CASSA
NUMCLIENTI
NUMCLIENTI
FaitVente
Dimensioni= { PRODOTTO,CASSA, COMM,DATA}
Granularité
Dépendances fonctionnelles entre les dimensions : {Données, Produit}à CASSA
32
Mesures normales
NOMBREVENTES= COUNT(*),additive
NUMCLIENTI=COMPTE(DISTINCT NUMERO_SCONTRINO), additif
{ PRODUIT, COMM}
Pour évaluer quels sont les modèles pour lesquels la valeur agrégée de NUMCLIENTI peut être calculée :
si considère le schéma équivalent sans FD entre les dimensions : NA = { PRODUIT, COMMISSION}.
Schéma SnowFlake
FACT_TABLE(PRODOTTO:dtPRODOTTO,DATA,COMMESSO,CASSA,NUMVENDITE,NUMCLIENTI)
dtPRODOTTO(PRODOTTO,TIPO:dtTIPO)
dtTIPO(TIPO, GROUPE, CATÉGORIE)
Il est possible de limiter la clé de la Fact Table au seul pattern primaire {PRODUIT,DATE,COMMANDE}
FACT_TABLE(PRODOTTO:dtPRODOTTO,DATA,COMMESSO,CASSA,NUMVENDITE,NUMCLIENTI)
33
1.6 Exercice (19/12/2012)
Étant donné le schéma de fait suivant
RÉGION VILLE
FILIALE COMPTE COURANT
ÉTAT BANQUE OPÉRATION
CLIENT
MONTANT (MOY)
BANQUE N_BANCOMAT
CHÈQUE SEXE
MOIS
COMMISSION
OPÉRATIONS via CARTE BANCAIRE dans une AGENCE et sur un COMPTE COURANT ; pour les OPÉRATIONS
diversamento-assegnoc’il y a la BANQUE du CHÈQUE DÉPOSÉ et la COMMISSION est indiquée
cela dépend de cette banque et de l'ÉTAT de la banque de la succursale de l'opération.
Il est demandé de :
1) Conception logique : Conception du SCHÉMA SNOWFLAKE ;
2) Si considère un arc multiplo pour COMPTE COURANT et CLIENT (un compte courant est maintenant au nom de
plus de clients, avec un certain POIDS), avec MONTANT mesure pondérée et N_BANCOMAT mesure d'impact.
Discuter de ce qui change dans la Conception Logique (il suffit de rapporter seulement les parties du schéma)
qui sont modifiées).
Solution
SCHÉMA ENFLAKE
TABLE_DE_FAITS (MOIS, FILIALE:DT_FILIALE, CC:DT_CC, BANCAASSEGNO:DT_BANCA,
NBANKOMAT
DT_BANCA(BANCA,ÉTAT)
DT_CC(CC,CLIENTE:DT_CLIENTE)
DT_CLIENTE
DT_FILIALE
DT_VILLE(VILLE, RÉGION:DT_RÉGION)
DT_RÉGION(REGION, ÉTAT)
DT_COMMISSIONE(BANCAASSEGNO:DT_BANCA,STATO,COMMISSIONE)
FACT_TABLE_PD(MESE,FILIALE:DT_FILIALE,CC:DT,BA:DT_BANCA, CLIENTE:DT_CLIENTE,
NBANKOMAT_P
DT_CC(CC,CLIENTE:DT_CLIENTE)
Le SCHÉMA SNOWFLAKE est identique au précédent, on enlève seulement DT_CC car il est maintenant dégénéré.
34
1.7 Exercice (14/01/2013)
Étant donné le schéma relationnel suivant du DBO :
VIAGGIO(PERSONA:PERSONA,DATA, ITINERARIO:ITINERARIO)
ITINERARIO(ITINERARIO,PARTENZA:CITTA,DESTINAZIONE:CITTA,AGENZIA,TIPO)
FD: PARTENZA, DESTINAZIONE à AGENCE
PERSONA
CITOYEN
RÉGION(RÉGION, ÉTAT)
Il est demandé de :
A) Conception conceptuelle : schéma de fait VOYAGE en co-dimensions
RÉSIDENCE
1. NumVIAGGI : nombre de voyages, obtenu par un simple comptage
2. NumITINERARI : nombre d'itinéraires, obtenu comme count(distinct ITINERARIO)
3. NumPERSONE : nombre de personnes, obtenu avec count(distinct PERSONA)
Solution
Schéma de Fait VOYAGE
NumViaggi ÉTAT_DE_DESTINATION
AGENCE
FattoVIAGGIO(PERSONA:PERSONA,DATA:DATA, ITINERARIO:ITINERARIO)
Dimensioni= { RESIDENZA,PARTENZA, DESTINAZIONE_STATO, ANNO, AGENZIA }
Temporelle
Mesures normales
COMPTE(*)
NumITINERARI = COMPTE(DISTINCT ITINERARIO), additive
con NA = { RÉSIDENCE, ANNÉE } en raison de
ITINÉRAIREà DEPART
NumPERSONE =COMPTER(DISTINCT PERSONA), additive
{PARTENZA, DESTINATION_STATE, AGENCY, YEAR}
en tant que PERSONNEà RÉSIDENCE
Schéma en étoile
FACT_TABLE(RESIDENZA:DTCITTARESID,PARTENZA:DTCITTAPART,
DESTINATION_ÉTAT
NumPERSONNES
DTCITTARESID(RESIDENCE,RÉGION,ÉTAT,DISTRICT)
DTCITTAPART(DÉPART,RÉGION,ÉTAT,DISTRICT)
35
1.8 Exercice (16/04/2013)
Étant donné le schéma relationnel du DBO :
TELEFONATA(NP,DATA,DA_CHIAMANTE:SIM, A_CHIAMATA:SIM,DURATA)
SIM
PREFISSO(PREFISSO, OPERATORE)
UTILISATEUR
Il est demandé de :
A) Conception conceptuelle : schéma de fait APPEL TÉLÉPHONIQUE
condimensioni{DATA, SIM_CHIAMANTE, OPERATORE_CHIAMATO, UTENTE_CHIAMATO }
émisure
DURATA_MEDIA durée moyenne des appels
NumSIM_CHIAMANTI nombre de SIM appelants,count(distinct DA_CHIAMANTE)
NumSIM_CHIAMATE nombre des SIM appelées, count(distinct A_CHIAMATA)
B) Conception logique : Conception du SCHÉMA ÉTOILE.
SolutionSchéma de Fait APPEL TÉLÉPHONIQUE
OPÉRATEUR
OPÉRATEUR_APPELÉ
SIM_APPELANT PREFISSO
APPEL TÉLÉPHONIQUE
NumSIM_APPLE TARIF
Données
NumSIM_APPELS
UTILISATEUR
DURÉE_MOYENNE
UTILISATEUR_APPELÉ
VILLE
CONVENTION
CONTRAT COMMITTENTE
PERSONA, ANNO, TIPO, DURÉE, MONTANT
INSTITUTION
PERSONA
VILLE
Il est demandé de :
A) Conception conceptuelle : schéma de fait CONTRAT avec cinq dimensions
CONTRATANT
CLIENT_VILLE
3) CONVENTION
4) ANNEE
5) TYPE
les tremblements
Solution
INSTITUTION
ÉTAT
CONVENTION
ANNEE
CONTRAT
CONTRAENT
DURÉE VILLE
IMPORTO PERSONA TITRE
NUMÉRO
TYPE COMMANDITAIRE_VILLE
L'ensemble des dimensions contient la clé {CONTRACTANT, CONVENTION}, donc le schéma est
la dépendance fonctionnelle entre les dimensions
37
PARTIEà VILLE_COMMISSIONNAIRE
Mesures normales
DURÉE
IMPORTO, additiva
Étant donné que le schéma transactionnel, la mesure NUMÉRO peut être considérée comme une mesure vide, par
agréger par count(*) et donc ne sera pas reporté dans la FACT_TABLE.
Schéma en étoile
FACT_TABLE(CONVENZIONE:DTCONVENZIONE,CONTRAENTE:DTCONTRAENTE,
DTCOMMITTENTE_CITTA
DTCOMMITTENTE_CITTA(CITTA, STATO)
DTCONVENZIONE(CONVENZIONE, GENRE, INSTITUTION,
DIRECTEUR
VILLE_SEDE
DTCONTRAENTE(PERSONA, TITOLO, CITTA, STATO,)
38