Créez des scripts sous contrôle de version et intégration continue pour les vérifier
Une approche qui a fonctionné pour moi a été de faire travailler chaque développeur avec son propre schéma avec lequel il peut faire ce qu'il veut. Leur schéma était destructible et rempli de données de test provenant d'un ensemble de scripts contrôlés par la version auxquels tous les développeurs ont contribué.
Le build d'intégration continue nocturne a pris la dernière version de tous les scripts et a tenté de construire une base de données de test cohérente à partir d'eux. L'application a ensuite exécuté une série de tests d'intégration et de tests fonctionnels pour vérifier que le schéma actuel était conforme à la version actuelle candidate.
Avant de commencer dans cette voie, il y avait une conception de base de données assez solide en place et un DBA gardait toujours un œil sur les choses pour empêcher les développeurs de devenir fous de la dénormalisation et d'autres horreurs.
Le contrôle de version a énormément aidé ici car les modifications apportées aux scripts étaient immédiatement évidentes. Nous avons également utilisé une VERSION
table de base de données pour identifier l'état général de la base de données. Il s'agissait d'une simple séquence entière et n'était liée à aucune application particulière.
Dans l'ensemble, cela a bien fonctionné et signifie que les développeurs ont cessé d'avoir peur de modifier les niveaux de persistance car ils pouvaient toujours annuler leurs propres schémas sans affecter les autres.
L'approche que j'utilise est de fournir une table pour les paramètres. Cette table aura une paire nom / valeur pour la version sur laquelle se trouve la base de données. Cela me donne deux avantages: j'ai un moyen de vérifier qu'un correctif de base de données a été appliqué via l'application, et je peux utiliser cette valeur pour mes scripts SQL.
Le script SQL créera de nouvelles tables, modifiera les colonnes et tout le travail nécessaire sur la base de données pour promouvoir le script à partir de la version précédente. Idéalement, j'aurais également un script de restauration, mais la plupart du temps je n'en ai pas.
BTW, toute cette approche a été automatisée dans le cadre de Ruby on Rails, avec les scripts de restauration. J'aime l'idée de cela, mais tous les cadres ne le font pas. Lorsque je n'utilise pas Ruby on Rails, j'utilise l'approche décrite ci-dessus.
la source