Em muitas abordagens ao desenvolvimento de software, como metodologias ágeis, Design Orientado a Domínio e Análise e Design Orientado a Objetos, somos incentivados a adotar uma abordagem iterativa ao desenvolvimento.
Portanto, não devemos executar nosso modelo de domínio corretamente na primeira vez em que começarmos a trabalhar no projeto. Em vez disso, à medida que o tempo passa, refatoramos o modelo porque adquirimos uma compreensão mais profunda do domínio do problema com o tempo.
Além disso, mesmo se tentarmos antecipar um modelo perfeito, o que já estou convencido de que é muito difícil, os requisitos podem mudar. Então, depois que o software tenha sido implantado para produção, os usuários finais podem notar que uma certa exigência não foi completamente compreendido, ou pior, alguma exigência estava faltando.
O ponto aqui é que podemos acabar precisando alterar o modelo após a implantação do software. Se isso acontecer, temos um problema: o banco de dados de produção possui dados do usuário, o que é importante e já está ajustado no formato do modelo antigo .
Atualizar o código pode ser uma tarefa difícil se o código não for bem projetado e se o sistema for grande. Mas isso pode ser feito com o tempo, temos ferramentas como o Git que nos ajudam a fazer isso sem danificar a versão pronta para produção.
Por outro lado, se o modelo for alterado, se as propriedades das classes desaparecerem ou o que for, o banco de dados também deve ser alterado. Mas temos um problema: já existem dados que não podem ser perdidos, que já estão formatados para o modelo antigo.
Parece que um banco de dados relacional aqui está sendo uma barreira nos impedindo de desenvolver iterativamente e até atualizar o software quando exigido pelos usuários finais.
Uma abordagem que eu já usei foi codificar uma classe especial que mapeia tabelas de banco de dados antigas para novas. Portanto, essas classes selecionam dados no formato antigo, convertem-no para o formato usado pelo novo modelo e salvam nas novas tabelas.
Essa abordagem parece não ser a melhor. Minha pergunta aqui é: existem abordagens conhecidas e recomendadas para conciliar desenvolvimento iterativo com bancos de dados relacionais?