Dados de modelo para controle de versão de esquema
Visão geral
Os esquemas de banco de dados ocasionalmente precisam ser atualizados. Por exemplo, um esquema projetado para manter as informações de contato do usuário pode precisar ser atualizado para incluir novos métodos de comunicação à medida que se tornam populares, como Twitter ou Skype.
Você pode usar o modelo de esquema flexível do MongoDB, que suporta documentos com formatos diferentes na mesma coleção, para atualizar gradualmente o esquema da sua coleção. À medida que você atualiza seu modelo de esquema, o padrão de controle de versão do esquema permite que você acompanhe essas atualizações com números de versão. O código do seu aplicativo pode usar números de versão para identificar e lidar com documentos com formatos diferentes sem tempo de inatividade.
Padrão de versionamento de esquema
Para implementar o padrão de Versão de Esquema, adicione um campo schema_version
(ou de forma semelhante) ao seu esquema da primeira vez que você modificar seu esquema. Os documentos que usam o novo esquema devem ter schema_version
ou 2
para indicar que estão de acordo com a segunda iteração de seu esquema. Se você atualizar seu esquema novamente, incremente o schema_version
.
O código do aplicativo pode usar a schema_version
de um documento ou a falta dela para manipular documentos condicionalmente. Use o esquema mais recente para armazenar novas informações no banco de dados.
Exemplo
O exemplo a seguir repete o esquema para documentos na coleção users
.
Na primeira iteração deste esquema, um registro inclui campos galactic_id
, name
e phone
:
// users collection { "_id": "<ObjectId>", "galactic_id": 123, "name": "Anakin Skywalker", "phone": "503-555-0000", }
Na próxima iteração, o esquema é atualizado para incluir mais informações em uma forma diferente:
// users collection { "_id": "<ObjectId>", "galactic_id": 123, "name": "Darth Vader", "contact_method": { "work": "503-555-0210", "home": "503-555-0220", "twitter": "@realdarthvader", "skype": "AlwaysWithYou" }, "schema_version": "2" }
Adicionar um schema_version
significa que um aplicativo pode identificar documentos moldados para o novo esquema e tratá-los adequadamente. O aplicativo ainda poderá lidar com documentos antigos se schema_version
não existir no documento.
Por exemplo, considere uma aplicação que encontre o(s) número(s) de telefone de um utilizador até galactic_id
. Após receber um galactic_id
, o aplicativo precisa fazer query do banco de dados:
db.users.find( { galactic_id: 123 } );
Depois que o documento é retornado do banco de dados, o aplicativo verifica se o documento tem um campo schema_version
.
Se não tiver um campo
schema_version
, o aplicativo passará o documento retornado para uma função dedicada que renderiza o campophone
a partir do esquema original.Se tiver um campo
schema_version
, o aplicativo verificará a versão do esquema. Neste exemplo, oschema_version
é2
e o aplicativo passa o documento retornado para uma função dedicada que renderiza os novos camposcontact_method.work
econtact_method.home
.
Usando o campo schema_version
, o código do aplicativo pode oferecer suporte a qualquer número de iterações de esquema na mesma coleção adicionando funções de manipulador dedicadas ao código.
Casos de uso
O padrão de versão do esquema é ideal para qualquer um ou uma combinação dos seguintes casos:
O tempo de inatividade do aplicativo não é uma opção
A atualização de documentos pode levar horas, dias ou semanas para ser concluída
Atualizar documentos para a nova versão do esquema não é um requisito
O padrão de Controle de Versão de Esquema ajuda você a decidir melhor quando e como as migrações de dados ocorrerão em relação aos bancos de dados tabulares tradicionais.