tadata
← Retour à l'accueil

Évolution de Schéma : Gérer le Changement sans Casser les Pipelines

#data-engineering#schema#databases#migration#governance

Les changements de schéma sont inévitables. Les exigences métier évoluent, de nouvelles sources apparaissent, les modèles sont refactorisés. La question n'est pas si les schémas vont changer, mais si ces changements vont casser les consommateurs en aval ou traverser le système en toute sécurité.

Matrice de Compatibilité de Schéma

Type de CompatibilitéChangementAnciens Lecteurs → Nouvelles DonnéesNouveaux Lecteurs → Anciennes DonnéesOpérations Sûres
BackwardLe nouveau schéma lit les anciennes donnéesPeut casserFonctionneSupprimer champs, ajouter optionnels
ForwardL'ancien schéma lit les nouvelles donnéesFonctionnePeut casserAjouter champs, supprimer optionnels
FullLes deux directions fonctionnentFonctionneFonctionneAjouter/supprimer champs optionnels uniquement
NoneAucune garantiePeut casserPeut casserTout changement (risqué)

En pratique, la compatibilité backward est le mode le plus couramment appliqué. Les schema registries (Confluent, AWS Glue, Karapace) l'appliquent automatiquement.

Comparaison des Stratégies de Migration

StratégieDowntimeRisqueComplexitéRollbackIdéal Pour
Big bangÉlevé — réécriture complèteÉlevéFaibleDifficilePetites tables, dev
Expand-contractZéroFaibleMoyenFacile — supprimer les nouvelles colonnesSystèmes de production, APIs
Blue-green schemaQuasi-zéroFaibleÉlevéBasculer le pointeurSystèmes critiques
Shadow writesZéroTrès faibleÉlevéArrêter le shadowChangements à haut risque
Schémas versionnésZéroFaibleMoyenGarder l'ancienne versionFlux d'événements, APIs

Pattern Expand-Contract

Le pattern expand-contract divise chaque changement cassant en trois phases non-cassantes.

Expand-contract sur la table users

tadata

Expand-contract sur la table users

Phase 1 : EXPANDPhase 2 : MIGRATEPhase 3 : CONTRACT
id INT · name VARCHAR (ancienne) · full_name VARCHAR (nouvelle)id INT · name VARCHAR (dépréciée) · full_name VARCHAR (synchronisée)id INT · full_name VARCHAR (nouvelle)
Double écriture dans les deux colonnesBackfill de l'ancienne colonne vers la nouvelleSuppression de l'ancienne colonne et de la double écriture
Déployer le nouveau code (écrit dans les deux)Lancer le script de migration (backfill + vérification)Déployer le code de nettoyage (suppression de l'ancienne colonne)

Évaluation des Risques par Type de Changement

Type de ChangementNiveau de RisqueImpact CompatibilitéMitigation
Ajouter colonne optionnelleFaibleForward + backward OKValeur par défaut requise
Ajouter colonne obligatoireMoyenCasse backwardExpand-contract
Renommer colonneÉlevéCasse les deux directionsExpand-contract avec alias
Changer type de donnéeÉlevéCasse les deux directionsNouvelle colonne + migration
Supprimer colonneMoyenCasse forwardDéprécier d'abord, contract ensuite
Changer clé primaireTrès élevéCasse jointures, CDC, lookupsBlue-green ou shadow writes
Fusionner/scinder tablesTrès élevéTous les avals cassentAbstraction par vue + expand-contract
tadata
Conditions Remove Narrow Semantics Add Docs Column removed or renamed Y N N N N Type narrowed or nullability tightened – Y N N N Meaning, unit or grain changed – – Y N N Optional column added or type widened – – – Y N Docs or descriptions only – – – – Y Actions MAJOR bump, new version side by side X X X Deprecation window, notify consumers X X X MINOR bump X PATCH bump X Notes consumers failloudly values maytruncate orfail silent: sameschema, wrongnumbers safe forreaders no data impact
Conditions Remove Narrow Semantics Add Docs Column removed or renamed Y N N N N Type narrowed or nullability tightened – Y N N N Meaning, unit or grain changed – – Y N N Optional column added or type widened – – – Y N Docs or descriptions only – – – – Y Actions MAJOR bump, new version side by side X X X Deprecation window, notify consumers X X X MINOR bump X PATCH bump X Notes consumers failloudly values maytruncate orfail silent: sameschema, wrongnumbers safe forreaders no data impact
Ce changement est-il cassant ? Que faire

Extrait de la fiche « Data Contracts » · Demander la fiche complète

Essentiels du Contrat de Données

ÉlémentObjectifExemple
Définition du schémaGarantie de structureSchéma Avro, JSON Schema, Protobuf
Type sémantiqueSignification métieremail, devise_eur, code_pays_iso
SLA de fraîcheurDélai de livraison"Mis à jour dans les 15 min du changement source"
Règles de qualitéValidité des données"taux de null < 1%", "valeurs dans [A, B, C]"
PropriétaireResponsabilitééquipe-paiements@entreprise.com
tadata
Producer dev CI Contract registry ML team 1. PR: rename amount ->amount_eur 2. fetch orders v2.1.0 3. contract + consumers 4. diff: column removed =breaking 5. fail: needs v3.0.0 6. publish v3.0.0, keep v2 for 60 days 7. deprecation notice
Producer dev CI Contract registry ML team 1. PR: rename amount ->amount_eur 2. fetch orders v2.1.0 3. contract + consumers 4. diff: column removed =breaking 5. fail: needs v3.0.0 6. publish v3.0.0, keep v2 for 60 days 7. deprecation notice
Shift left : un changement cassant est détecté dans la pull request du producteur, pas dans les métriques du modèle

Extrait de la fiche « Data Contracts » · Demander la fiche complète

Ressources

Nous utilisons des cookies analytiques pour améliorer votre expérience. Aucune donnée personnelle n'est collectée.