Controle de versão dos dados do aplicativo

5

Simplificando, o produto da minha empresa é um webapp com um back-end de banco de dados. Temos um ambiente de palco e um ambiente de produção para cada um dos cerca de 100 clientes. Existe um banco de dados separado para cada ambiente. O conteúdo do banco de dados é proveniente de vários arquivos CSV que são criados e mantidos por nossa equipe de dados (não técnicos). Os dados são específicos do cliente e também devem ser atualizados quando o dev adicionar novos recursos ao produto. No entanto, nem todos os clientes usam a mesma versão do produto, portanto, não apenas o conteúdo, mas também a estrutura dos CSVs variam de acordo com o cliente.

Atualmente, os arquivos CSV são versionados no SVN. No entanto, não há separação entre dados testados e não testados. Minha equipe é responsável pelo carregamento de novos dados para os ambientes do cliente, mas acabamos sendo gravados antes ao carregar dados não testados em um ambiente de produção. A resposta clara para isso é imitar uma configuração de desenvolvimento e criar um tronco, ramificações e tags, onde o tronco é sempre estável (dados testados), ramificações contêm alterações experimentais / não testadas e marcas são criadas toda vez que novos dados são carregados em um meio ambiente.

Minha pergunta envolve a dependência entre dados e código ... quando o dev faz uma versão que inclui novos recursos, os dados precisam ser atualizados para acomodar esses recursos antes que possamos atualizar o código em um ambiente. Como podemos rastrear se os dados de um determinado cliente são compatíveis com uma versão específica do código?

Meu primeiro instinto é criar uma filial no repositório de dados toda vez que um upgrade de código for planejado para um determinado cliente. O nome da filial corresponderia ao número da versão. No entanto, como a versão do código em nossas caixas de produção normalmente fica significativamente atrás de nossos ambientes de estágio, a equipe de dados teria que trabalhar em duas ramificações simultaneamente, garantindo que novos recursos para o código mais recente e maior entrem apenas na ramificação mais recente. correções continuam a ir no ramo mais antigo também. Naturalmente, uma vez que o código no palco e produção divergem, não podemos ter 100% de certeza de que as correções de dados que testamos no palco funcionarão no código antigo instalado na produção. Alguém tem alguma idéia sobre como podemos gerenciar melhor esse processo?

    
por ThisSuitIsBlackNot 26.05.2011 / 15:20
fonte

2 respostas

4

Uau, isso soa como uma bagunça complicada. Eu trabalhei com esses tipos de sistemas antes e ter clientes em diferentes versões realmente complica as coisas.

Eu recomendo usar o método branch. Você precisa tratar esses arquivos csv como código, já que na prática eles são. Eles devem ser testados e promovidos exatamente como você codificaria.

    
por 26.05.2011 / 16:34
fonte
2

Tenha uma tabela que inclua a versão dos dados. Ter um processo de atualização que envolve a atualização de tabelas e a remoção / inserção de dados que mudaram entre as versões.

Também recomendo enfaticamente que você desenvolva um padrão em que os dados possam ser atualizados independentemente do lançamento do código. Ele tornará os lançamentos muito mais suaves se você puder preparar o banco de dados e, em seguida, fazer o lançamento de forma independente, apesar de admitir que ele torna o desenvolvimento um pouco mais complicado.

    
por 26.05.2011 / 16:30
fonte