datawarehouse

2025-09-10 21:59:34 +02:00
parent f7aab0471b
commit 7a1283a341
10 changed files with 159 additions and 42 deletions

@@ -27,12 +27,12 @@ CREATE TABLE familles (
```
```
Électronique
├── Téléphones
│ ├── Smartphones
│ └── Téléphones fixes
└── Télévisions
└── Accessoires TV
Primeur
├── Légumes
│ ├── Racines
│ └── Feuilles
└── Fruits
└── Pépins
```
### Lire la famille de premier niveau
@@ -109,8 +109,8 @@ ORDER BY niveau DESC; -- de la racine vers le nœud
Récupérer la hiérarchie dans une chaine de caractères formatée.
```sql
SELECT string_agg(nom, ' > ' ORDER BY niveau DESC) AS fil_ariane
FROM ancetres;
SELECT string_agg(famille, ' > ' ORDER BY niveau DESC) AS fil_ariane
FROM ancetre;
```
## représentation intervallaire
@@ -173,7 +173,6 @@ Lextension introduit le type ltree, qui est une chaîne de labels séparés p
Il représente le chemin complet depuis la racine, ce qui simplifie toutes les opérations sur larbre.
### Trouver toutes les familles descendantes dune catégorie
Utilisation d'un nouvel opérateur `<@`

@@ -1,27 +1,5 @@
# Calcul
## Volatilité
> La volatilité indique au moteur postgreSQL à quel point le résultat de la fonction dépend de létat de la base ou du contexte. Il existe 3 niveaux.
#### IMMUTABLE
Le résultat **ne change jamais** pour les mêmes arguments.
Exemple : abs(-5) donne toujours 5, peu importe quand ou où la fonction est exécutée.
Utilisable dans : index, colonnes calculées, contraintes CHECK, etc.
#### STABLE
Le résultat ne change pas pendant une requête donnée, mais **peut changer entre deux requêtes**.
La fonction `ST_Length(geom)` est STABLE car pour une même géométrie, la longueur est toujours la même, MAIS cela dépend de paramètres de la session (SRID de référence).
#### VOLATILE
Le résultat peut changer même dans une seule requête. Par exemple : `random()` ou `now()` donnent des résultats différents à chaque appel.
## Colonnes calculées
> Une colonne calculée (ou dérivée) est une colonne dont la valeur nest pas directement saisie par lutilisateur, mais obtenue à partir dune expression basée sur dautres colonnes de la même table.
@@ -99,3 +77,26 @@ Un trigger repose sur deux éléments :
1. Une fonction (en PL/pgSQL ou un autre langage supporté) qui contient le code à exécuter.
2. Le trigger lui-même, qui associe cette fonction à un événement (INSERT, UPDATE, DELETE…).
## Volatilité
> La volatilité indique au moteur postgreSQL à quel point le résultat de la fonction dépend de létat de la base ou du contexte. Il existe 3 niveaux.
#### IMMUTABLE
Le résultat **ne change jamais** pour les mêmes arguments.
Exemple : abs(-5) donne toujours 5, peu importe quand ou où la fonction est exécutée.
Utilisable dans : index, colonnes calculées, contraintes CHECK, etc.
#### STABLE
Le résultat ne change pas pendant une requête donnée, mais **peut changer entre deux requêtes**.
La fonction `ST_Length(geom)` est STABLE car pour une même géométrie, la longueur est toujours la même, MAIS cela dépend de paramètres de la session (SRID de référence).
#### VOLATILE
Le résultat peut changer même dans une seule requête. Par exemple : `random()` ou `now()` donnent des résultats différents à chaque appel.

@@ -10,9 +10,10 @@
- [Colonnes calculées](Calculated.md)
- [Business Intelligence](datawarehouse.md)
- [Les modèles de données](models.md)
- [Intervalles](intervalle.md)
- [Exploration des données](exploration.md)
- [Arbres](Arbres.md)
- [Données spatiales](Spatial.md)
- [Intervalles](intervalle.md)
- [Données JSON](json.md)
## Exercices

@@ -99,7 +99,6 @@ Le type `LINESTRING` représente une ligne constituée de points.
select GeomFromText('LINESTRING(3 5,6 7,8 2,12 1)');
```
### Polygone
Le type `POLYGON` est une ligne fermée qui représente une surface. Les coordonnées du dernier point sont égales aux coordonnées du premier point. Chaque point est séparé par une virgule (attention au format décimal français qui utilise aussi la virgule) et les coordonnées sont séparées par des espaces.

@@ -123,4 +123,5 @@ Les tables de dimensions apportent le **contexte descriptif** nécessaire pour a
- **Stables :** moins fréquemment mises à jour que les tables de faits.
Apache Parquet

32
exploration.md Normal file

@@ -0,0 +1,32 @@
# Exploration des données
## Drill down
L'approfondissemnt permet aux utilisateurs de voir des niveaux plus bas de données hiérarchiques dans un seul rapport. Il leur permet de passer d'un niveau plus généralisé à un niveau plus approfondi tout en gardant la même logique danalyse.
Par exemple, imaginez un tableau de bord qui montre les ventes par continent. Il pourrait également être prévu pour afficher les ventes par pays, état, ville, quartier, etc.
**Exercice :** Effectuer un drill down sur le code postal.
```sql
WITH ventes_mensuelles AS (
SELECT
annee,
mois,
codepostal,
famille_code,
SUM(vente) AS total_ventes
FROM ventes_analyse
WHERE famille_code = '02CARO'
GROUP BY annee, mois, codepostal, famille_code
)
SELECT
annee,
mois,
codepostal,
total_ventes,
LAG(total_ventes, 1) OVER (PARTITION BY codepostal ORDER BY annee, mois) AS ventes_mois_prec,
LAG(total_ventes, 12) OVER (PARTITION BY codepostal ORDER BY annee, mois) AS ventes_an_dernier
FROM ventes_mensuelles
ORDER BY codepostal, annee, mois;
```

@@ -1,6 +1,4 @@
---
title: Les modèles transactionnels
---
# Les modèles transactionnels
## modèle ACID

@@ -1,6 +1,5 @@
# Modèles de données
Il existe deux (trois) modèles principaux, le modèle étoile (star) et le modèle flocon (snowflake). Ils sont utilisés dans les entrepôts de données pour organiser les données de manière à **faciliter** les analyses multidimensionnelles, particulièrement dans les systèmes de Business Intelligence (BI). Ces modèles se distinguent par la manière dont les tables de faits et les tables de dimensions sont structurées et reliées entre elles.
## Modèle étoile (Star Schema)
@@ -13,6 +12,8 @@ Le modèle en étoile est une structure simple où une table de faits est relié
- **Accès rapide** : Comme les tables de dimensions sont dénormalisées (les données sont centralisées et répétées), les requêtes sont plus simples et plus rapides à exécuter. Il y a moins de jointures à réaliser
- **Lisibilité** : Le modèle est simple à comprendre et à concevoir, car il n'y a qu'une seule relation directe entre la table de faits et chaque table de dimension. Idéal pour des besoins analytiques simples avec de grandes quantités de données.
![étoile](star.svg)
## Modèle flocon (Snowflake Schema)
Le modèle flocon est une extension du modèle étoile. Dans ce modèle, certaines ou toutes les tables de dimensions sont **normalisées**, cest-à-dire qu'elles sont subdivisées en plusieurs sous-tables pour éliminer les redondances. Le modèle est appelé "flocon" parce que la structure résultante a une forme plus complexe, semblable à celle d'un flocon de neige.
@@ -23,7 +24,7 @@ Le modèle flocon est une extension du modèle étoile. Dans ce modèle, certain
- **Complexité** : Les requêtes sont plus complexes à écrire et prennent plus de temps à s'exécuter car elles impliquent plusieurs jointures entre les tables de dimensions et sous-tables.
- **Réduction de la redondance** : Le modèle flocon réduit la redondance des données dans les dimensions. Les tables étant normalisées, les données redondantes sont éliminées, ce qui réduit la taille des tables.
#### Inconvénients
### Inconvénients
- **Requêtes plus lentes** : Le modèle flocon nécessite des jointures supplémentaires entre les tables, ce qui peut ralentir lexécution des requêtes.
- **Complexité accrue** : La structure est plus complexe à comprendre et à concevoir par rapport au modèle étoile.
@@ -32,12 +33,38 @@ Le modèle flocon est une extension du modèle étoile. Dans ce modèle, certain
Tout est regroupé dans une seule table large.
Exemple : une seule table qui contient directement Produit, Sous-famille, Famille, Client, Date, etc.
### Avantages
Avantage : très simple pour les outils BI et le reporting.
Très simple pour les outils BI et le reporting. Requêtes simplifiées
#### Inconvénients
### Inconvénients
- beaucoup de redondance,
- consommation despace,
- difficile à maintenir.
**Exercice :** A l'aide d'une vue matérialisée créer une table aplatie. Les dimensions d'analyse sont : l'année, le mois, la semaine, le code famille de l'article, le code postal, l'âge et le genre de l'adhérent. Mon fait est la vente (soit le prix unitaire multiplié par la quantité).
```sql
CREATE MATERIALIZED VIEW ventes_analyse AS
SELECT
-- Dimensions temporelles
EXTRACT(YEAR FROM t.date_ticket)::int AS annee,
EXTRACT(MONTH FROM t.date_ticket)::int AS mois,
EXTRACT(WEEK FROM t.date_ticket)::int AS semaine,
-- Dimension article
a.famille_code,
-- Dimension adhérent
ad.codepostal,
date_part('year', age(t.date_ticket, ad.naissance))::int AS age,
ad.genre,
-- Fait
ROUND(l.prix_unitaire * l.quantite, 2) AS vente
FROM ligne l
JOIN ticket t ON l.ticket_id = t.id
JOIN article a ON l.article_code = a.code
JOIN adherent ad ON t.adherent_id = ad.id;
```
Attention : L'age à prendre en compte est celui au moment de la vente. Pas l'âge d'aujourd'hui.

@@ -39,7 +39,6 @@ WHERE nom_colonne = (
)
```
**Exercice :** Sélectionner les articles dont le prix est supérieur à la moyenne générale des prix des articles.
Dans un langage procédural on utiliserait deux étapes pour obtenir le résultat. Première étape calculer la moyenne des prix

60
star.svg Normal file

@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="300" height="300"
viewBox="0 30 290 220"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs>
<style>
rect.dimension {
fill: #00cc00;
width: 60px;
height: 40px;
}
text.dimension {
text-anchor: middle;
font-size: 10px;
fill: #fff;
font-family: Sans
}
</style>
<marker
id="arrow"
viewBox="0 0 10 10"
refX="5"
refY="5"
markerWidth="6"
markerHeight="6"
orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" />
</marker>
</defs>
<path
style="fill:#0000ff;stroke-width:0.25;fill-opacity:0.11118909"
d="M 152.36874,164.27255 87.667804,131.41265 23.918653,166.08295 35.176586,94.39443 -17.496399,44.479097 54.162323,33.033058 85.357779,-32.486615 118.38737,32.127859 190.34021,41.549808 139.0949,92.929789 Z"
transform="translate(59.519037,72.018036)" />
<rect class="dimension" x="115" y="23" />
<text class="dimension" x="145" y="45">Dimension</text>
<rect class="dimension" x="10" y="102" />
<text class="dimension" x="40" y="124">Dimension</text>
<rect class="dimension" x="53" y="216" />
<text class="dimension" x="83" y="238">Dimension</text>
<rect class="dimension" x="222" y="102" />
<text class="dimension" x="252" y="124">Dimension</text>
<rect class="dimension" x="184" y="222" />
<text class="dimension" x="214" y="244">Dimension</text>
<line x1="146" y1="68" x2="146" y2="150" stroke-width="1" stroke="#000" marker-start="url(#arrow)" />
<line x1="75" y1="125" x2="146" y2="150" stroke-width="1" stroke="#000" marker-start="url(#arrow)" />
<line x1="218" y1="125" x2="146" y2="150" stroke-width="1" stroke="#000" marker-start="url(#arrow)" />
<line x1="95" y1="212" x2="146" y2="150" stroke-width="1" stroke="#000" marker-start="url(#arrow)" />
<line x1="200" y1="215" x2="146" y2="150" stroke-width="1" stroke="#000" marker-start="url(#arrow)" />
<rect
fill="#d40000"
stroke-width="1" stroke="#af0000"
width="80" height="40"
x="105"
y="128" />
<text fill="#fff" font-family="Sans"
x="145" y="150" text-anchor="middle" font-size="10">Faits / Mesures</text>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB