Dans de nombreuses approches de développement de logiciels comme les méthodologies agiles, la conception pilotée par domaine et l'analyse et la conception orientées objet, nous sommes encouragés à adopter une approche itérative du développement.
Nous ne sommes donc pas censés réussir notre modèle de domaine la première fois que nous commençons à travailler sur le projet. Au lieu de cela, au fil du temps, nous refactorisons le modèle parce que nous acquérons une compréhension plus profonde du domaine problématique avec le temps.
En dehors de cela, même si nous essayons d'obtenir un modèle parfait dès le départ, dont je suis déjà convaincu qu'il est très difficile, les exigences peuvent changer. Ainsi , après que le logiciel a été déployé à la production, les utilisateurs finaux peuvent remarquer qu'une certaine exigence n'a pas été complètement compris, ou pire, une exigence qui manquait.
Le point ici est que nous pourrions finir par avoir besoin de changer le modèle après le déploiement du logiciel. Si cela se produit, nous avons un problème: la base de données de production contient des données d'utilisateur qui sont importantes et sont déjà adaptées au format de l'ancien modèle .
La mise à jour du code peut être une tâche difficile si le code n'est pas bien conçu et si le système est volumineux. Mais cela peut se faire avec le temps, nous avons des outils comme Git qui nous aident à le faire sans endommager la version prête pour la production.
D'un autre côté, si le modèle change, si les propriétés des classes disparaissent ou autre, la base de données devrait également changer. Mais nous avons un problème: il y a déjà des données qui ne peuvent pas être perdues, qui sont déjà formatées pour l'ancien modèle.
Il semble qu'une base de données relationnelle soit ici un obstacle nous empêchant de faire du développement itératif et même de mettre à jour les logiciels lorsque les utilisateurs finaux le demandent.
Une approche que j'ai déjà utilisée consistait à coder une classe spéciale qui mappe les anciennes tables de base de données aux nouvelles. Ces classes sélectionnent donc les données dans l'ancien format, les convertissent au format utilisé par le nouveau modèle et les enregistrent dans les nouvelles tables.
Cette approche ne semble pas être la meilleure. Ma question est la suivante: existe-t-il des approches bien connues et recommandées pour concilier le développement itératif avec les bases de données relationnelles?