Correction détaillée - Exercices d’entraînement avancés DW

Exercice 1 : Data Warehouse bancaire - Correction

A. Architecture et composants

1. Architecture complète

Sources de données :

  • Systèmes core banking (comptes, transactions)
  • Systèmes de crédit (prêts, garanties)
  • CRM (données clients)
  • Systèmes de paiement (TPE, cartes)
  • Sources externes (taux de change, données économiques)

Zone de staging :

  • Landing zone : Réception des données brutes des 5 systèmes
  • Transformation zone :
    • Conversion des formats legacy vers standards
    • Nettoyage des données (doublons, valeurs manquantes)
    • Validation des contraintes métier
  • Archive zone : Conservation des données brutes pour audit

Couche d’intégration :

  • Master Data Management : Référentiel unique clients/produits
  • Harmonisation des devises : Conversion vers devise de référence
  • Application des règles métier : Classification clients, calcul des risques
  • Data Quality Management : Contrôles de cohérence inter-systèmes

Core Data Warehouse :

  • Modèle normalisé (approche Inmon) :
    • Tables clients, comptes, produits, transactions
    • Historisation complète (10 ans requis)
    • Gestion des versions de données pour audit
  • Métadonnées : Lignage des données, règles de calcul, définitions métier

Data Marts :

  • Mart Retail Banking : Analyse des comptes particuliers
  • Mart Corporate Banking : Analyse des comptes entreprises
  • Mart Risk Management : Calculs de risque et provisioning
  • Mart Regulatory : Reporting réglementaire par pays

2. Défis ETL spécifiques

Extraction :

  • Systèmes legacy : Formats mainframe, COBOL copybooks
  • Fréquences différentes : Real-time pour fraude, batch nightly pour reporting
  • Volumes importants : Millions de transactions/jour
  • Disponibilité : Extraction sans impact sur systèmes opérationnels

Transformation :

  • Standardisation : Codes produits différents entre systèmes
  • Dédoublonnage : Client présent dans plusieurs systèmes
  • Enrichissement : Géocodage des adresses, scoring client
  • Validation : Contrôles de cohérence comptable (débits = crédits)

Load :

  • Gestion des SCD : Historisation des changements clients/produits
  • Performance : Window de batch limitée (2h max)
  • Rollback : Mécanisme de retour arrière en cas d’échec

3. Stratégie taux de change

Architecture multi-temporelle :

Table EXCHANGE_RATES
- date_effective
- currency_from  
- currency_to
- rate
- rate_type (closing, average, buying, selling)
- source_system

Stratégies de conversion :

  • Transaction date : Taux au moment de la transaction (historique)
  • Reporting date : Taux à la date du rapport (comparaison)
  • Average rate : Taux moyen mensuel (lissage des variations)

Gestion dans les faits :

  • Montants stockés en devise locale ET devise de référence
  • Métadonnée du taux utilisé pour audit
  • Recalcul possible avec nouveaux taux

B. Modélisation dimensionnelle

1. Application des 4 étapes de Kimball

Étape 1 - Processus métier : Analyse des transactions bancaires

Étape 2 - Granularité : Une ligne par transaction individuelle

  • Transaction ID unique
  • Horodatage précis (seconde)
  • Montant exact
  • Comptes débiteur/créditeur

Étape 3 - Dimensions :

  • DIM_DATE : Jour, mois, trimestre, année, jour ouvré
  • DIM_CUSTOMER : Données client avec historique
  • DIM_ACCOUNT : Type compte, statut, devise
  • DIM_PRODUCT : Famille produit, caractéristiques
  • DIM_CHANNEL : Agence, web, mobile, TPE
  • DIM_GEOGRAPHY : Pays, région, ville (client et transaction)

Étape 4 - Faits/Mesures :

  • Montant_devise_locale (additive)
  • Montant_devise_reference (additive)
  • Nombre_transactions (additive)
  • Solde_compte (semi-additive - pas de somme sur temps)
  • Taux_marge (non-additive - ratio)

2. Schéma en étoile

FACT_TRANSACTION
├── transaction_key (PK)
├── date_key (FK)
├── customer_key (FK) 
├── account_debit_key (FK)
├── account_credit_key (FK)
├── product_key (FK)
├── channel_key (FK)
├── geography_key (FK)
├── amount_local_currency (mesure additive)
├── amount_reference_currency (mesure additive)
├── exchange_rate_used (mesure non-additive)
├── account_balance_after (mesure semi-additive)
└── transaction_count (mesure additive = 1)

3. Gestion SCD

Changement d’adresse client - SCD Type 2 :

DIM_CUSTOMER
├── customer_key (PK surrogate)
├── customer_business_key (NK)
├── customer_name
├── address  
├── effective_date
├── expiry_date  
├── current_flag
└── version_number

Justification : Analyses géographiques nécessitent historique complet

Modification produit - SCD Type 1 :

  • Corrections d’erreurs : écrasement direct
  • Mise à jour descriptions : pas d’impact analytique

Changement de taux d’intérêt - SCD Type 3 :

DIM_PRODUCT
├── current_interest_rate
├── previous_interest_rate  
└── rate_change_date

C. Défis complexes

1. Relations many-to-many (Comptes multi-titulaires)

Solution : Bridge Table

BRIDGE_ACCOUNT_CUSTOMER
├── account_key (FK)
├── customer_key (FK)
├── ownership_percentage
├── role (titular, authorized, beneficiary)
├── effective_date
└── expiry_date

FACT_TRANSACTION (modifiée)
├── account_key → bridge_account_customer_key
├── allocation_factor (pour répartir les montants)

Allocation des transactions :

  • Répartition proportionnelle selon pourcentages
  • Mesures additives conservées
  • Possibilité d’analyse par titulaire principal

2. Granularité multiple

Solution : Architecture Lambda

Batch Layer (analyses quotidiennes) :

FACT_TRANSACTION_DAILY
├── date_key
├── customer_key
├── account_key  
├── daily_transaction_count
├── daily_total_amount
├── daily_avg_amount
└── end_of_day_balance

Speed Layer (détection fraude temps réel) :

FACT_TRANSACTION_STREAMING  
├── transaction_timestamp
├── customer_key
├── amount
├── merchant_category
├── risk_score (calculé en temps réel)
└── fraud_flag

Serving Layer :

  • Données batch pour reporting standard
  • Données streaming pour alertes
  • Réconciliation périodique

3. Conformité réglementaire

Audit Trail complet :

AUDIT_LOG
├── audit_id
├── table_name
├── record_key
├── operation_type (INSERT/UPDATE/DELETE)
├── old_values (JSON)
├── new_values (JSON)
├── user_id
├── timestamp
├── business_reason
└── regulation_reference

Data Lineage :

DATA_LINEAGE
├── target_table
├── target_column  
├── source_system
├── source_table
├── source_column
├── transformation_rule
├── last_update
└── validation_status

RGPD - Droit à l’effacement :

  • Pseudonymisation des identifiants
  • Soft delete avec marqueurs
  • Logs de suppression
  • Impact analysis avant suppression

Exercice 2 : Optimisation OLAP - Correction

A. Séquences d’opérations OLAP

1. “Évolution smartphones France vs Allemagne”

Séquence détaillée :

  1. SLICE sur dimension Géographie = “France”
  2. SLICE sur dimension Produit = “Smartphones”
  3. ROLL-UP sur dimension Temps vers “Trimestre”
  4. PIVOT pour avoir Trimestres en colonnes, Mesures en lignes
  5. DICE pour ajouter Géographie = “Allemagne”
  6. PIVOT final : Pays en lignes, Trimestres en colonnes

Requête MDX équivalente :

SELECT 
  {[Time].[Trimester].Members} ON COLUMNS,
  {[Geography].[France], [Geography].[Germany]} ON ROWS
FROM Sales
WHERE ([Product].[Smartphones])

2. “Ventes par catégorie 2023, puis détail mensuel top performers”

Séquence détaillée :

  1. SLICE sur dimension Temps = “2023”
  2. ROLL-UP sur dimension Produit vers “Catégorie”
  3. Analyse des résultats → identification top 3 catégories
  4. DRILL-DOWN sur dimension Temps vers “Mois”
  5. FILTER pour garder seulement les top 3 catégories
  6. PIVOT : Mois en colonnes, Catégories en lignes

3. “Paris vs Londres, puis B2B vs B2C”

Séquence détaillée :

  1. DICE sur dimension Géographie = {“Paris”, “Londres”}
  2. ROLL-UP sur dimension Géographie vers “Ville”
  3. Analyse comparative entre villes
  4. DRILL-ACROSS vers dimension Client
  5. SLICE successive sur Type_Client = “B2B” puis “B2C”
  6. PIVOT pour créer matrice Ville × Type_Client

B. Choix de schémas et performance

1. Performance vs Storage

Recommandation : Schéma en étoile

Justifications :

  • Requêtes typiques : Analyses cross-dimensionnelles fréquentes
  • Performance critique : Retail nécessite réponses sub-secondes
  • Volumes : Dimensions relativement stables, explosion des faits
  • Utilisateurs : Business analysts non-techniques

Cas d’exception Snowflake :

  • Dimension Géographie si hiérarchies très profondes
  • Dimension Produit si catalogues très riches (mode/high-tech)

2. Dénormalisation recommandée

Dimension Temps :

DIM_TIME (dénormalisée)
├── date_key
├── full_date  
├── day_name, day_abbrev
├── day_of_week, day_of_month, day_of_year
├── week_of_year, week_of_month
├── month_name, month_abbrev, month_number
├── quarter_name, quarter_number
├── year_number
├── is_weekend, is_holiday
├── season_name
└── fiscal_year, fiscal_quarter

Justification : Dimension de référence, interrogée dans 90% des requêtes

Dimension Géographie :

DIM_GEOGRAPHY (partiellement dénormalisée)
├── geography_key
├── store_name, store_code
├── store_address (complet)
├── city_name, city_code
├── region_name, region_code  
├── country_name, country_code
├── continent_name
├── timezone, currency
├── store_type, store_size_category
└── opening_date

3. Stratégie de partitionnement

Partitionnement horizontal par date :

FACT_SALES
├── PARTITION sales_2024_Q1 (Jan-Mar 2024)
├── PARTITION sales_2024_Q2 (Apr-Jun 2024)  
├── PARTITION sales_2024_Q3 (Jul-Sep 2024)
├── PARTITION sales_2024_Q4 (Oct-Dec 2024)
└── PARTITION sales_2025_Q1 (Jan-Mar 2025)

Avantages :

  • Partition pruning : Élimination automatique des partitions
  • Maintenance : Chargement parallèle, archivage simple
  • Performance : Scans limités aux périodes pertinentes

Sous-partitionnement par géographie :

SUBPARTITION BY HASH(geography_key) SUBPARTITIONS 8

C. Gestion des hiérarchies complexes

1. Hiérarchie géographique irrégulière

Problème : Zones économiques spéciales (Monaco, Hong Kong, etc.)

Solution : Hiérarchies multiples

DIM_GEOGRAPHY_BRIDGE
├── geography_key (FK)
├── hierarchy_type ('administrative', 'commercial', 'fiscal')
├── parent_geography_key  
├── level_number
├── level_name
└── path_description

Exemple d’utilisation :

  • Monaco → France (administratif)
  • Monaco → Zone Euro (commercial)
  • Monaco → Paradis fiscal (fiscal)

2. Hiérarchie produit multiple

Solution : Dimensions multiples

DIM_PRODUCT_USAGE
├── product_key (FK to main product dim)
├── usage_category
├── usage_subcategory
└── target_demographic

DIM_PRODUCT_PRICE  
├── product_key (FK)
├── price_range
├── price_tier
└── competitive_position

DIM_PRODUCT_SEASON
├── product_key (FK)  
├── season_primary
├── season_secondary
└── seasonality_index

Fact table adaptée :

FACT_SALES
├── product_key (FK to main dimension)
├── product_usage_key (FK to usage dimension)
├── product_price_key (FK to price dimension)
├── product_season_key (FK to season dimension)

Exercice 3 : Migration architecture - Correction

A. Architecture hybride

1. Architecture intégrée

Couche Legacy (maintenue) :

┌─────────────────┐
│   DW Existant   │
│   (Inmon/3NF)   │  ──────┐
└─────────────────┘        │
┌─────────────────┐        │    ┌──────────────────┐
│   Data Marts    │        │    │   Data Lake      │
│   Finance/Ops   │  ──────┼───→│   Raw IoT Data   │
│   R&D           │        │    │   Archives       │
└─────────────────┘        │    └──────────────────┘
                  ┌──────────────────┐
                  │  Integration     │
                  │  Layer (New)     │
                  └──────────────────┘
    ┌─────────────────────────────────────────┐
    │                                         │
    ↓                                         ↓
┌─────────────────┐                ┌──────────────────┐
│  Streaming      │                │   ML/AI Layer    │
│  Platform       │                │   Feature Store  │  
│  (Kafka/Flink)  │                │   Model Registry │
└─────────────────┘                └──────────────────┘

Nouvelles couches :

Data Lake (HDFS/S3) :

  • Raw zone : IoT brut, logs, fichiers
  • Refined zone : Données nettoyées, partitionnées
  • Curated zone : Données préparées pour ML

Streaming Platform :

  • Kafka : Ingestion temps réel IoT
  • Flink/Spark Streaming : Transformations en vol
  • Redis : Cache des métriques temps réel

ML/AI Layer :

  • Feature Store : Features calculées batch + streaming
  • Model Registry : Versioning des modèles ML
  • Prediction API : Scoring temps réel

2. Stratégie de migration

Phase 1 (3 mois) - Coexistence :

  • Déploiement du Data Lake en parallèle
  • Duplication des données critiques (DW → Lake)
  • Tests de performance et qualité
  • Formation des équipes

Phase 2 (6 mois) - Streaming IoT :

  • Mise en place pipeline IoT → Lake
  • Développement APIs temps réel
  • Intégration progressive avec systèmes existants
  • Monitoring et alertes

Phase 3 (9 mois) - ML Integration :

  • Déploiement Feature Store
  • Migration modèles ML existants
  • Nouveaux modèles exploitant données temps réel
  • Optimisation performances

Phase 4 (12 mois) - Optimisation :

  • Rationalisation des flux de données
  • Décommissionnement composants legacy
  • Gouvernance unifée
  • Formation utilisateurs finaux

3. Gouvernance des données

Data Catalog unifié :

UNIFIED_CATALOG
├── asset_id (global unique)
├── asset_type (table, stream, model, api)
├── source_system  
├── business_owner
├── technical_owner
├── data_classification
├── retention_policy
├── lineage_upstream
├── lineage_downstream
├── quality_score
├── last_accessed
└── compliance_tags

Data Quality Framework :

  • Règles communes : Validation cross-systèmes
  • Monitoring unifié : Dashboard qualité global
  • Alerting : Notifications proactives sur anomalies
  • Remediation : Workflows automatisés de correction

B. Modélisation évolutive

1. SCD complexes - Firmware devices

Problème : Un capteur change de firmware, impactant la précision des mesures historiques.

Solution : SCD Type 2 avec métadonnées techniques

DIM_DEVICE
├── device_key (PK surrogate)  
├── device_serial_number (NK)
├── device_model
├── firmware_version
├── calibration_date
├── accuracy_class  
├── effective_date
├── expiry_date
├── is_current
├── change_reason
└── backward_compatibility_flag

Impact sur analyse historique :

  • Recalibration : Facteurs de correction appliqués rétroactivement
  • Traceability : Marquage des périodes affectées
  • Reporting : Notes explicatives sur changements méthodologiques

2. Événements vs États IoT

Recommandation : Tables séparées avec pont

FACT_IOT_EVENTS (détail brut) :

├── event_timestamp
├── device_key  
├── sensor_type
├── raw_value
├── processed_value
├── quality_flag
└── event_sequence_number

FACT_DEVICE_SNAPSHOTS (états agrégés) :

├── snapshot_timestamp (every 5min)
├── device_key
├── avg_temperature
├── max_pressure  
├── battery_level
├── operational_status
└── alert_count

Justification :

  • Performance : Snapshots pour analyses rapides
  • Auditabilité : Events pour traçabilité complète
  • Flexibilité : Recalcul possible des snapshots

3. Agrégations pré-calculées

Stratégie par fréquence d’usage :

Très haute fréquence (sub-seconde) :

REALTIME_METRICS (Redis)
├── device_id
├── current_value
├── trend_5min
├── anomaly_score
└── last_update

Haute fréquence (minutes) :

FACT_DEVICE_5MIN
├── time_bucket (5min intervals)
├── device_key
├── avg_value, min_value, max_value
├── std_deviation
├── sample_count
└── quality_percentage

Fréquence standard (heures/jours) :

  • Agrégations batch dans DW traditionnel
  • Cubes OLAP pour analyses multi-dimensionnelles

C. Conformité et sécurité

1. RGPD - Droit à l’oubli

Défis techniques dans DW :

  • Données dénormalisées : Éparpillement dans multiple tables
  • Agrégations : Impact sur métriques pré-calculées
  • Sauvegardes : Purge des backups et archives
  • Logs : Nettoyage des traces d’audit

Solution technique :

-- Table de mapping pour pseudonymisation
PATIENT_PSEUDONYM_MAP
├── patient_business_key (encrypted)
├── pseudonym_key (used in DW)  
├── encryption_key_version
├── creation_date
├── deletion_request_date
└── deletion_completed_date

-- Processus de suppression
DELETION_IMPACT_ANALYSIS
├── patient_pseudonym_key
├── affected_table
├── affected_records_count
├── aggregation_impact  
├── deletion_status
└── completion_timestamp

Processus automatisé :

  1. Requête de suppression → Identification pseudonyme
  2. Impact analysis → Recensement données affectées
  3. Validation métier → Confirmation faisabilité
  4. Suppression technique → Exécution par lot
  5. Vérification → Contrôle absence résiduelle
  6. Documentation → Preuve de conformité

2. Anonymisation recherche médicale

Techniques par type de données :

Données directement identifiantes :

  • Suppression : Noms, adresses, numéros
  • Hachage : Identifiants techniques avec sel

Données quasi-identifiantes :

  • Généralisation : Âge exact → Tranche d’âge
  • Perturbation : Ajout bruit statistique dates
  • Suppression sélective : Codes postaux rares

Données sensibles :

  • k-anonymat : Minimum k individus par combinaison
  • l-diversité : Minimum l valeurs différentes par attribut sensible
  • t-closeness : Distribution proche population générale

3. Audit trail

Architecture de traçabilité :

ACCESS_LOG
├── session_id
├── user_id  
├── query_hash
├── tables_accessed[]
├── rows_returned
├── execution_time
├── access_timestamp
└── business_justification

DATA_MODIFICATION_LOG  
├── transaction_id
├── table_name
├── operation_type
├── affected_keys[]  
├── old_checksum
├── new_checksum
├── modification_timestamp
├── authorized_by
└── business_reason

Monitoring proactif :

  • Accès anormaux : Volumes, heures, utilisateurs
  • Modifications sensibles : Données critiques, privilégiées
  • Performance : Requêtes coûteuses, ressources
  • Conformité : Respect des politiques de rétention

Exercice 4 : Plateforme streaming - Correction

A. Architecture multi-vitesse

1. Lambda architecture détaillée

                    SPEED LAYER (Real-time)
┌─────────────────────────────────────────────────────────┐
│  Kafka Streams    │   Flink CEP    │   Real-time ML    │
│  ↓               │   ↓            │   ↓              │
│  Redis/Hazelcast │   Alerts       │   Recommendations │
└─────────────────────────────────────────────────────────┘
                    SERVING LAYER
┌─────────────────────────────────────────────────────────┐
│     API Gateway (GraphQL/REST)                         │
│  ┌─────────────┬─────────────┬─────────────────────────┐│
│  │   User API  │ Artist API  │    Analytics API        ││
│  │             │             │                         ││
│  │ - Profile   │ - Royalties │ - Dashboards            ││
│  │ - Playlists │ - Stats     │ - Reports               ││
│  │ - Reco      │ - Trends    │ - A/B Tests             ││
│  └─────────────┴─────────────┴─────────────────────────┘│
└─────────────────────────────────────────────────────────┘
                    BATCH LAYER
┌─────────────────────────────────────────────────────────┐
│           Master Dataset (HDFS/S3)                      │
│  ┌─────────────────┬─────────────────┬─────────────────┐│
│  │  Raw Events     │   Curated       │   Aggregated    ││
│  │                 │                 │                 ││
│  │ - Plays         │ - User Sessions │ - Daily Stats   ││
│  │ - Clicks        │ - Clean Tracks  │ - Artist Metrics││
│  │ - Interactions  │ - Enriched      │ - Genre Trends  ││
│  └─────────────────┴─────────────────┴─────────────────┘│
└─────────────────────────────────────────────────────────┘

Speed Layer (< 100ms) :

  • Kafka : 10M events/sec, partitioning par user_id
  • Flink CEP : Pattern detection (skip patterns, repeat listening)
  • Feature Store : Pré-calcul features pour ML temps réel

Batch Layer (minutes à heures) :

  • Spark : Processing des 100M streams/jour
  • Hive/Presto : Requêtes analytiques complexes
  • Airflow : Orchestration des pipelines batch

2. Hot/Warm/Cold storage

Hot Storage (0-7 jours) - SSD/Memory :

- User current sessions (Redis)
- Real-time recommendations (Hazelcast)  
- Trending tracks cache (Memcached)
- Anti-fraud models (in-memory)

Warm Storage (7 jours - 2 ans) - SSD :

- Recent plays for personalization
- User behavior analytics  
- A/B test data
- Operational metrics

Cold Storage (> 2 ans) - Archive :

- Historical plays for ML training
- Deleted user data (retention légale)
- System logs and audit trails
- Raw event backups

Politiques automatisées :

  • Tiering : Migration automatique selon âge et accès
  • Compression : Ratios différents par température
  • Indexing : Index complets hot, partiels warm, minimaux cold

3. APIs et exposition

GraphQL API (Unified) :

type User {
  id: ID!
  profile: UserProfile
  currentPlaying: Track
  recommendations: [Track!]!
  playlists: [Playlist!]!
  listeningHistory(limit: Int): [PlayEvent!]!
}

type Query {  
  user(id: ID!): User
  search(query: String!): SearchResults
  trending(genre: Genre, geo: Country): [Track!]!
  analytics(metric: Metric, period: Period): AnalyticsResult
}

type Subscription {
  userActivity(userId: ID!): PlayEvent
  trendingUpdates: TrendingUpdate
}

REST APIs spécialisées :

  • Ingestion API : POST /events (haute throughput)
  • Royalties API : GET /royalties/{artist_id} (calculs complexes)
  • Admin API : Gestion contenu, utilisateurs (sécurisée)

B. Modélisation multi-granularité

1. Fact tables multiples

FACT_PLAY_EVENTS (détail maximum) :

├── play_id (PK)
├── user_id (FK)
├── track_id (FK)  
├── session_id (FK)
├── device_id (FK)
├── timestamp_start
├── timestamp_end
├── duration_played_seconds
├── skip_reason_code  
├── audio_quality
├── geographical_location
├── playlist_context_id
├── recommendation_algorithm_id
└── user_interaction_flags (JSON)

FACT_USER_DAILY_ACTIVITY (agrégation utilisateur) :

├── activity_date
├── user_id (FK)
├── total_listening_time_minutes  
├── unique_tracks_played
├── unique_artists_played
├── skip_rate_percentage
├── discovery_rate_new_tracks
├── avg_session_duration_minutes
├── device_switches_count
├── playlist_interactions_count
└── social_shares_count

FACT_ARTIST_ROYALTIES (agrégation artiste) :

├── calculation_period_start
├── calculation_period_end  
├── artist_id (FK)
├── country_id (FK)
├── total_streams
├── unique_listeners
├── revenue_generated_usd
├── revenue_per_stream
├── top_track_id
├── growth_rate_vs_previous_period
└── royalty_splits (JSON - multi-rights holders)

2. Dimensions évolutives

Catalog dynamique avec versioning :

DIM_TRACK
├── track_key (PK surrogate)
├── track_id (NK business)
├── title
├── artist_primary_id (FK)
├── album_id (FK)
├── duration_seconds
├── explicit_flag
├── availability_countries (JSON array)
├── genre_primary, genre_secondary
├── mood_tags (JSON array)
├── bpm (beats per minute)
├── key_signature
├── energy_level (1-10)
├── danceability_score (0-1)
├── acousticness_score (0-1)
├── popularity_score (calculated daily)
├── release_date
├── label_id (FK)
├── isrc_code
├── copyright_info
├── effective_date
├── expiry_date
├── is_current_version
├── version_reason
└── audio_fingerprint_hash

Gestion des suppressions du catalogue :

DIM_TRACK_TOMBSTONE
├── track_id
├── removal_date
├── removal_reason (rights, quality, legal)
├── replacement_track_id (si applicable)
├── impact_analysis_completed
└── user_notification_sent

Métadonnées enrichies dynamiquement :

FACT_TRACK_METADATA_EVOLUTION
├── track_id (FK)
├── metadata_date
├── mood_scores (JSON - ML generated)
├── similarity_clusters (JSON - algorithmic)
├── user_generated_tags (JSON - crowdsourced)
├── cultural_context (JSON - regional preferences)
├── seasonal_popularity_pattern (JSON)
└── recommendation_contexts (JSON)

3. Bridge tables - Playlists collaboratives

Gestion many-to-many complexe :

BRIDGE_PLAYLIST_CONTRIBUTORS
├── playlist_id (FK)
├── user_id (FK)
├── contributor_role (owner, editor, viewer, collaborator)
├── permission_level (add, remove, reorder, share)
├── contribution_weight (for analytics allocation)
├── joined_date
├── last_activity_date
├── invitation_status (pending, accepted, declined)
└── notification_preferences (JSON)

BRIDGE_PLAYLIST_TRACKS  
├── playlist_id (FK)
├── track_id (FK)
├── added_by_user_id (FK)
├── position_order
├── added_timestamp
├── play_count_from_playlist
├── skip_count_from_playlist
├── likes_from_playlist
├── removal_timestamp (soft delete)
├── removal_reason
└── recommendation_source (manual, algorithmic, social)

Allocation des métriques pour analytics :

  • Plays weighted by contribution : Répartition selon poids contributeurs
  • Discovery attribution : Crédit à l’ajouteur du track
  • Engagement metrics : Agrégation par rôle dans la playlist

C. Optimisations avancées

1. Columnar storage

Données à stocker en colonaire (Parquet/ORC) :

Event stream data :

OPTIMAL FOR COLUMNAR:
- user_id (high selectivity, frequent filtering)
- track_id (joins fréquents avec catalogue)
- timestamp (range queries constantes)
- geographical_data (analyses par région)
- device_type (segmentation comportementale)

SUBOPTIMAL FOR COLUMNAR:
- event_metadata_json (peu de patterns répétitifs)
- user_agent_string (très haute cardinalité)
- session_context (accès row-wise fréquent)

Partitioning strategy :

-- Partitioning hybride par date + géographie
PARTITION BY (
  year = YEAR(event_timestamp),
  month = MONTH(event_timestamp),
  geo_region = CASE 
    WHEN country IN ('US','CA','MX') THEN 'AMERICAS'
    WHEN country IN ('GB','FR','DE','ES','IT') THEN 'EUROPE'
    ELSE 'OTHER'
  END
)
CLUSTERED BY user_id INTO 256 BUCKETS

Compression par type de donnée :

  • Timestamps : Delta encoding + ZSTD
  • IDs : Dictionary encoding + Snappy
  • Metrics : RLE (Run Length Encoding) pour valeurs répétées
  • Text : LZ4 pour performance décompression

2. Stratégies de compression

Tiered compression selon usage :

HOT DATA (0-7 days):
- Compression: LZ4 (fast decompression)
- Ratio: ~3:1 
- Priority: Query speed over storage

WARM DATA (7 days - 6 months):  
- Compression: ZSTD level 3
- Ratio: ~7:1
- Balance: Speed/Storage

COLD DATA (> 6 months):
- Compression: ZSTD level 19 + columnar
- Ratio: ~15:1  
- Priority: Storage cost over speed

Compression spécialisée par domaine :

  • Audio metadata : Similarity-based clustering puis compression
  • User behavior patterns : Sequence compression algorithms
  • Geographical data : Spatial indexing + coordinate quantization

3. Caching multi-niveaux

L1 Cache - Application Level (Redis Cluster) :

# User current context (TTL: 30min)
user:123456:current_session -> {
  "current_track": "track789",
  "queue": ["track790", "track791"],  
  "position": 120,
  "preferences": {...}
}

# Hot tracks cache (TTL: 5min)  
trending:genre:rock:country:US -> [
  {"track_id": "abc123", "score": 95.2},
  {"track_id": "def456", "score": 92.1}
]

# Recommendation cache (TTL: 1hour)
reco:user:123456 -> [
  {"track_id": "xyz789", "reason": "similar_users", "confidence": 0.87}
]

L2 Cache - Query Result Cache (Hazelcast) :

// Complex aggregations cache (TTL: 4hours)
analytics🧑🎨456:daily:2024-01-15 -> {
  "streams": 1523420,
  "unique_listeners": 45231,
  "countries": {...},
  "age_demographics": {...}
}

// Catalog metadata cache (TTL: 24hours)  
track:789:metadata -> {
  "title": "Song Title",
  "duration": 240,
  "features": {...}
}

L3 Cache - CDN Level (CloudFlare/CloudFront) :

  • Static assets : Album covers, artist images
  • API responses : Public charts, genre listings
  • Computed playlists : Daily/weekly algorithmic playlists

Cache invalidation strategies :

EVENT-DRIVEN INVALIDATION:
- Track metadata change → Invalidate all related caches
- User behavior update → Invalidate personal recommendations  
- Chart updates → Invalidate trending caches

TIME-BASED INVALIDATION:
- User session data: 30 minutes
- Recommendations: 1-4 hours selon user activity
- Analytics: 4-24 hours selon criticité métier

PROBABILISTIC INVALIDATION:
- 5% chance early refresh before TTL expire
- Prevents cache stampede on popular items

Conseils pédagogiques et points d’évaluation

Critères d’évaluation par exercice

Exercice 1 (Banque) - Critères

Excellent (90-100%) :

  • Architecture complète avec justification de chaque composant
  • Gestion SCD appropriée avec compréhension métier
  • Solutions créatives pour many-to-many (bridge tables)
  • Prise en compte réglementaire (RGPD, audit)

Bon (75-89%) :

  • Architecture cohérente avec composants principaux
  • Modélisation dimensionnelle correcte (4 étapes Kimball)
  • Gestion basique des SCD
  • Identification des défis ETL

Satisfaisant (60-74%) :

  • Structure basique data warehouse
  • Schéma en étoile simple
  • Compréhension concepts fondamentaux

Exercice 2 (Retail) - Critères

Excellent :

  • Séquences OLAP détaillées et logiques
  • Justifications techniques pour choix architecture
  • Solutions innovantes pour hiérarchies complexes
  • Stratégies optimisation avancées

Bon :

  • Opérations OLAP correctes
  • Choix étoile vs flocon justifié
  • Partitioning basique proposé

Satisfaisant :

  • Identification opérations OLAP principales
  • Compréhension schémas de base

Exercice 3 (HealthTech) - Critères

Excellent :

  • Architecture lambda/kappa bien conçue
  • Stratégies migration réalistes
  • Gestion RGPD technique détaillée
  • Vision intégrée temps réel/batch

Bon :

  • Coexistence legacy/moderne planifiée
  • Compréhension enjeux conformité
  • Solutions data lake appropriées

Satisfaisant :

  • Identification composants nouveaux
  • Compréhension besoins évolution

Exercice 4 (Streaming) - Critères

Excellent :

  • Architecture distribuée cohérente haute performance
  • Modélisation multi-granularité sophistiquée
  • Optimisations techniques avancées (compression, cache, columnar)
  • Compréhension business model streaming

Bon :

  • Architecture big data basique
  • Tables de faits multiples appropriées
  • Stratégies cache simples

Satisfaisant :

  • Identification défis volumétrie
  • Modèles dimensionnels de base
Pierre-Henri Paris
Pierre-Henri Paris
Associate Professor in Artificial Intelligence

My research interests include Knowlegde Graphs, Information Extraction, and NLP.