datawarehouse
17
Arbres.md
17
Arbres.md
@@ -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 @@ L’extension 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 l’arbre.
|
||||
|
||||
|
||||
|
||||
### Trouver toutes les familles descendantes d’une 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 n’est pas directement saisie par l’utilisateur, mais obtenue à partir d’une expression basée sur d’autres 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.
|
||||
|
||||
3
Home.md
3
Home.md
@@ -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
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 d’analyse.
|
||||
|
||||
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
|
||||
|
||||
|
||||
37
models.md
37
models.md
@@ -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.
|
||||
|
||||

|
||||
|
||||
## 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**, c’est-à-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 l’exé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 d’espace,
|
||||
- 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
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 |
Reference in New Issue
Block a user