Gerir a migração de quebrar alterações banco de dados para um banco de dados compartilhado por versão antiga do mesmo aplicativo

StackOverflow https://stackoverflow.com/questions/257045

Pergunta

Um dos meus objetivos é ser capaz de implantar uma nova versão de uma aplicação web que corre lado a lado a versão antiga. O problema é que tudo o que compartilha um banco de dados. Um banco de dados que na nova versão tende a incluir refatoração significativa para tabelas de banco de dados. Eu gostaria de ser lançamento da nova versão do aplicativo para os usuários ao longo do tempo e ser capaz de mudá-los de volta para a versão antiga, se eu precisar.

Oren teve uma boa postar configurar o problema, mas terminou com:

"Nós ainda estamos em um pouco de água barrenta no que diz respeito à implantação de produção no que diz respeito às mudanças que afeta todo o sistema, a saber, quebrando alterações de banco de dados. Vou discutir isso na próxima edição, este tem apenas um tad fora de mão, eu tenho medo ".

O follow-on pós nunca veio ;-). Como você iria sobre como gerenciar a migração de quebrar alterações banco de dados para um banco de dados compartilhado por versão antiga do mesmo aplicativo. Como você manter os dados sincronizados up?

Foi útil?

Solução

Se a versão antiga tem de ser mantido, as mudanças simplesmente não pode ser de ruptura. Isso também ajuda na implantação de uma nova versão de um aplicativo web -. Se você precisa rolar para trás, realmente Ajuda se você pode deixar o banco de dados, pois é

Obviamente, isso vem com deficiências arquitetônicas significativas, e você quase certamente vai acabar com um banco de dados que mostra sua linhagem, por assim dizer -., Mas os benefícios de implantação são geralmente vale a pena as dores de cabeça, na minha experiência

Ela ajuda se você tem uma coleção sólida de testes de integração para cada versão antiga envolvidos. Você deve ser capaz de executá-los contra o seu banco de dados de teste migrado para cada versão que ainda é considerado "possivelmente ao vivo" - que pode muito bem ser "toda versão de sempre" em alguns casos. Se você é capaz de implantação de controle razoavelmente estritamente você pode começar afastado com apenas tendo compatibilidade para três ou quatro versões - caso em que você pode planejar phasing out mesas obsoletos / colunas etc, se há uma necessidade real. Basta ter em mente a complexidade de tal planejamento contra os benefícios acumulados.

Outras dicas

O livro de leitura Scott Ambler " Refactoring Databases "; tomar com uma pitada de sal, mas há um monte de boas idéias lá dentro.

Os detalhes das soluções disponíveis dependem das DBMS que você usa. No entanto, você pode fazer coisas como:

  • criar uma nova tabela (ou várias novas tabelas) para o novo projeto
  • criar uma exibição com o antigo nome da tabela que recolhe dados da nova tabela (s)
  • criar 'em vez de' gatilhos no fim de atualizar as novas tabelas em vez da vista

Em algumas circunstâncias, você não precisa de uma nova tabela -. Você pode apenas precisar de gatilhos

Assumindo que apenas 2 versões do seu cliente, eu só manter uma cópia dos dados nas novas tabelas.

Você pode manter o contrato entre os antigos e novos aplicativos por trás vistas no topo das novas tabelas. Use antes de / em vez de gatilhos para as gravações do punho para o "velho" pontos de vista que realmente escrever nas novas tabelas.

Você está mantendo 2 versões de código e ainda deve desenvolver o seu aplicativo de idade, mas é inevitável.

Desta forma, não há problemas de sincronização, efetivamente você tem que lidar com conflitos de replicação entre os "antigos" e esquemas "novos".

Mais de 2 versões torna-se complicado como mencionado ...

Em primeiro lugar, gostaria de dizer que este problema é muito duro e você pode não encontrar uma resposta completa.

Ultimamente tenho estado envolvido em manter uma linha legado de aplicativos de negócios, que pode evoluir mais rapidamente para uma nova versão. Manutenção inclui erros resolvendo, otimização de código antigo e novos recursos, que às vezes não pode caber facilmente na arquitetura do aplicativo atual. O principal problema com o nosso aplicativo é que ele foi mal documentada, não há qualquer vestígio de mudanças e estamos basicamente a equipe rotação 5ª trabalhando neste projeto (que são bastante novo para ele).

Deixando os detalhes exteriores do lado (código, camadas, etc), vou tentar explicar um pouco como estamos actualmente a gerir as alterações de banco de dados.

Temos neste momento duas regras que estamos tentando seguir:

  1. Em primeiro lugar, é que o código antigo (sql, procedimentos armazenados, funções, etc) funciona como é e deve ser mantido como está, sem modificar muito a menos que haja o caso (bug ou alteração do recurso), e de claro, tentar documentá-lo, tanto quanto possível (especialmente os problemas como: "WTF !, por que ele fez que, em vez disso?").

  2. O segundo é que cada característica nova que vem em devem usar as melhores práticas conhecidas neste momento, e modificar a estrutura banco de dados antigo tão pouco quanto possível. Isso iria introduzir algum banco de dados refatoração opções como o uso de pontos de vista editáveis ??em cima da antiga estrutura, a introdução de novas tabelas de extensão para os já existentes, a normalização da estrutura e uma estrutura mais velhos através de exibições, etc.

Além disso, estamos tentando escrever tantos testes de unidade como podemos desde que os analistas de negócios estão trabalhando lado a lado e documentar as regras de negócio.

refatoração de banco de dados é um campo muito complexo para ser respondida em uma resposta curta. Há um monte de livros que respondem a todos os seus problemas, um http://databaserefactoring.com/ sendo apontado em um das respostas .

Editar Mais tarde:. Esperemos que a segunda regra também vai responder a manipulação de quebrar alterações

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top