Expand/contract (migration de schéma)
Le pattern expand/contract découpe une migration de schéma qui semble être une seule opération en trois étapes indépendantes, chacune déployable et validable séparément, pour qu’aucune version de l’application (ancienne ou nouvelle) ne se retrouve jamais face à un schéma qu’elle ne comprend pas pendant la transition.
Les trois étapes
Expand : ajouter le nouvel élément (colonne, table) sans toucher à l’existant ; l’ancienne version continue de fonctionner normalement, elle ignore simplement ce qui est nouveau. Migrate : faire coexister les deux représentations, en écrivant vers les deux ou en synchronisant l’une depuis l’autre, le temps que toutes les instances de l’application tournent sur la nouvelle version. Contract : supprimer l’ancien élément, seulement une fois la certitude acquise que plus rien n’en dépend.
Pourquoi séparer plutôt que tout faire d’un coup
Une migration en une seule étape (renommer une colonne, par exemple) crée une fenêtre où l’ancienne version de l’application, encore en cours de déploiement progressif, échoue immédiatement contre le nouveau schéma. Le découpage en trois étapes élimine cette fenêtre : chaque étape est rétrocompatible avec la version d’application qui tourne encore à ce moment précis, ce qui rend possible un déploiement progressif du code sans jamais synchroniser parfaitement son timing avec celui de la base.