As migrações de esquema de banco de dados são um problema nos ambientes de produção?

13

Nas discussões sobre bancos de dados NoSQL x SQL, às vezes ouço dizer que as empresas preferem usar bancos de dados NoSQL sem esquema porque é problemático migrar o esquema para uma nova versão. Mas isso é realmente um grande problema ao fazer atualizações? Os bancos de dados relacionais são ruins para essas operações?

Eu li esta postagem no blog do MongoDB: Por que Schemaless?

Jonas
fonte

Respostas:

20

Só porque o banco de dados NoSql não possui um esquema no sentido tradicional, não significa que não exista um esquema lógico com o qual você precise lidar à medida que ele muda. No caso de um aplicativo típico usando MongoDb, provavelmente o seu código espera que certos campos do objeto json se comportem de determinadas maneiras. Se você alterar o comportamento, a seguir, convém atualizar os dados já existentes no banco de dados. Agora, com o RDBMS tradicional, esse era um problema amplamente resolvido - você apenas precisava ALTERAR as tabelas subjacentes. Mas com esses novos bancos de dados NoSQL, você tem uma decisão - você escreve um script para mover e atualizar todos os seus objetos? Ou você adiciona código para converter entre versões em tempo real? Em caso afirmativo, quanto tempo você suporta objetos v1? Para sempre? Até a v3?

Acrescentarei que o exemplo usado na postagem do blog do MongoDb é um pouco simplista e um caso muito fácil de lidar, se você tiver um processo de atualização decente, independentemente do RDBMS; adicionar um campo raramente dói. É quando você decide dividir seu Namecampo FirstNamee as LastNamecoisas ficam emocionantes.

Wyatt Barnett
fonte
Com o RDBMS tradicional, esse NÃO é um problema resolvido. Você ainda precisa atualizar todos os dados, além de atualizar o esquema. Esta parte é comum para SQL e NoSQL.
Kawing-chiu
3
Os RDBMSs do @ kawing-chiu que valem a pena ter DDL transacional, o que o torna um problema resolvido. Modificações de esquema e correção dos dados a serem executados em uma única transação que pode ser revertida.
Blrfl 24/09
19

Mas isso é realmente um grande problema ao fazer atualizações?

Pode ser.

Algumas organizações são - bem - desorganizadas e fazem um trabalho muito ruim de migração de esquema.

  1. "Fim de semana de migração". Pare os servidores. Faça backup e exporte todos os dados. Crie o novo esquema (geralmente modificando o esquema existente). Recarregue os dados ou tente reestruturar no local.

  2. "Ajustes contínuos". Altere as tabelas na extensão permitida pelo SQL. Sem rastrear a sequência dos ALTERs executados. Não há como voltar para uma versão anterior do esquema. Onde necessário, crie novas tabelas a partir de tabelas existentes, ajustando todos os aplicativos para usar as novas tabelas. Mas - sem um bom controle de qualidade - deixando as tabelas antigas no lugar "por precaução".

  3. "Pânico total". Simplesmente evite modificações de esquema. Faça um grande fedor. Afirme que o risco é muito alto. Bloqueie todos os esforços nessa direção. Tome o esquema como refém até forçado a adotar uma abordagem mais sensata.

Os bancos de dados relacionais são ruins para essas operações?

Qualquer esquema é um problema para migrar.

O maior problema não é técnico.

É semântico.

Um dos principais motivos para uma alteração no esquema é que o esquema anterior não corresponde muito bem ao domínio do problema. Desde que a semântica mudou, o banco de dados (e os aplicativos) precisam mudar. Às vezes, essas são mudanças profundas que exigem repensar a maneira como os aplicativos funcionam com os dados.

A revisão da semântica do banco de dados pode ser muito difícil.

O que as pessoas fazem, em vez de alterações no esquema, é apenas abusar do esquema físico. Eles começam a carregar dados incorretos nos campos existentes porque podem. De repente, um campo "comentário" começa a ter uma parte importante das informações de gerenciamento de clientes, seguida por "//", seguida pelo comentário real. Isso aumenta a necessidade de pedaços de dados "campo 1 - campo 2 // comentário". Os usuários têm uma planilha que extrai esses dados adicionais do campo de comentários, porque o software aplicativo "real" tinha um esquema difícil de mudar que a TI se recusava a alterá-lo.

S.Lott
fonte
9
Eu me sinto sujo depois de ler isso.
Michael Borgwardt
3
+1 para uma grande virada de frase; "tomando o esquema como refém". Uma boa analogia. Estive lá, experimentei isso.
Warren P
1
Mas o aplicativo também precisa ser atualizado de qualquer maneira, portanto, realmente, um banco de dados Schemaless ajuda muito?
Jonas
1
@ Jonas: Sua pergunta é vaga. Mas. Remover o esquema SQL restritivo significa que você tem menos uma coisa com a qual lutar. Então, trivialmente, "Sim, isso ajuda". Você sempre tem alterações de aplicativos. Alterações de aplicativos sem alterações de esquema seriam menos trabalhosas. Certo? Ou você está perguntando algo diferente?
S.Lott 19/09
3

Atualizamos os bancos de dados de produção adicionando tabelas e colunas (anuláveis) sem problemas. As versões anteriores do aplicativo funcionam bem com o banco de dados atualizado, elas simplesmente não fazem referência às novas coisas. Evitamos remover tabelas ou colunas ou alterar a forma como os dados existentes são armazenados, mas quando isso é necessário, produzimos scripts de conversão apropriados. Quer seu banco de dados tenha ou não um esquema seguro de tipo declarado, as alterações na estrutura de dados requerem conversão de dados e atualizações de aplicativos para interagir com a nova estrutura.

JGWeissman
fonte
1

Depende.

Primeiro, se você tem um banco de dados muito grande, abrangendo várias máquinas, tudo (não apenas a atualização do banco de dados) será complicado. (não importa quanto você planejou com antecedência).

Segundo, a atualização de um banco de dados NÃO é apenas uma coisa do banco de dados - também depende do sistema maior do qual o banco de dados faz parte. Isso também inclui a implantação do banco de dados (muitos servidores de banco de dados, vários data centers, configurações mestre-escravo etc.)

A dor pode ser aliviada pela arquitetura dos componentes do sistema, de forma que todos eles tenham algum tipo de 'conhecimento' do evento de alteração do esquema do DB. Isso significa que todo o sistema deve tolerar alterações de esquema e pode responder a ele de maneira "sã".

Você pode conferir um utilitário desenvolvido pelo Facebook para lidar com as atualizações de esquema do MySQL.

Além disso, existem práticas recomendadas padrão, como transformar o mestre em somente leitura, fazer alterações nos escravos ou na cópia de desenvolvimento etc.

De qualquer forma, é essencial ter um backup completo e um amplo conjunto de testes . Somente então, você poderá fazer alterações com confiança e segurança.

codificador de árvore
fonte
Mas o aplicativo também precisa ser atualizado de qualquer maneira, portanto, realmente, um banco de dados Schemaless ajuda muito?
Jonas