Aller au contenu

Adaptations ETL — Intégration SCD2 Marketplace

Contexte

L'introduction de dim_vendor (SCD2) et fact_vendor_stock nécessite d'adapter le pipeline d'ingestion existant :

Avant C17 :  Event Hubs → Stream Analytics → fact_order / fact_clickstream
Après C17 :  Event Hubs → Stream Analytics → fact_order / fact_clickstream
             API vendeurs (batch) → sp_merge_dim_vendor → dim_vendor (SCD2)
             API vendeurs (batch) → fact_vendor_stock

Flux existants (inchangés)

Flux Source Destination Fréquence
Commandes Event Hub orders fact_order Temps réel (2s)
Clickstream Event Hub clickstream fact_clickstream Temps réel (2s)
Produits Event Hub products dim_product 120s

Nouveaux flux C17

Flux Source Destination Fréquence Mécanisme
Vendeurs API Marketplace (batch) dim_vendor Quotidien sp_merge_dim_vendor (SCD2)
Stocks API Marketplace (batch) fact_vendor_stock Toutes les heures INSERT horodaté

Logique ETL dim_vendor (SCD2)

La procédure sp_merge_dim_vendor gère automatiquement les trois cas :

Source (API vendeurs)
        │
        ▼
sp_merge_dim_vendor(@vendor_id, @vendor_name, ...)
        │
        ├── vendor_id inconnu → INSERT version 1 (is_current=1)
        │
        ├── attribut tracké changé → UPDATE version courante (valid_to=now, is_current=0)
        │                            INSERT nouvelle version (valid_from=now, is_current=1)
        │
        └── aucun changement → UPDATE email uniquement (pas de nouvelle version SCD2)

Logique ETL fact_vendor_stock

Les stocks sont des faits ponctuels — chaque mise à jour est un nouvel enregistrement horodaté (pattern insert-only) :

INSERT INTO dbo.fact_vendor_stock (vendor_sk, product_id, quantity_available, quantity_reserved, unit_cost)
SELECT
    v.vendor_sk,
    @product_id,
    @quantity_available,
    @quantity_reserved,
    @unit_cost
FROM dbo.dim_vendor v
WHERE v.vendor_id  = @vendor_id
  AND v.is_current = 1;

Requête analytique type — stock courant par vendeur

SELECT
    vendor_id,
    vendor_name,
    product_name,
    quantity_available,
    stock_net,
    stock_timestamp
FROM dbo.vw_vendor_stock_disponible
WHERE stock_net > 0
ORDER BY vendor_id, product_name;

Impact sur les requêtes existantes

Les tables fact_order, fact_clickstream, dim_customer et dim_product ne sont pas modifiées structurellement — seule dim_product reçoit une colonne vendor_id additionnelle (nullable, non bloquante).

Les requêtes existantes continuent de fonctionner sans modification.

Séquence de déploiement C17

# 1. Créer dim_vendor
sqlcmd -S sql-server-rg-e6-sbuasa.database.windows.net \
  -U sqladmin -P 'P@ssw0rd!2024' -d dwh-shopnow \
  -i sql/scd2/dim_vendor_create.sql -C

# 2. Créer la procédure SCD2
sqlcmd -S sql-server-rg-e6-sbuasa.database.windows.net \
  -U sqladmin -P 'P@ssw0rd!2024' -d dwh-shopnow \
  -i sql/scd2/dim_vendor_merge.sql -C

# 3. Créer fact_vendor_stock
sqlcmd -S sql-server-rg-e6-sbuasa.database.windows.net \
  -U sqladmin -P 'P@ssw0rd!2024' -d dwh-shopnow \
  -i sql/scd2/fact_vendor_stock.sql -C

# 4. Enrichir dim_product
sqlcmd -S sql-server-rg-e6-sbuasa.database.windows.net \
  -U sqladmin -P 'P@ssw0rd!2024' -d dwh-shopnow \
  -i sql/scd2/dim_product_update.sql -C