Overview
Ocasionalmente, los esquemas de la base de datos necesitan ser actualizados. Por ejemplo, un esquema diseñado para almacenar información de contacto de los usuarios puede requerir una actualización para incluir nuevos métodos de comunicación a medida que se vuelvan populares, como Twitter o Skype.
Puedes utilizar el modelo de esquema flexible de MongoDB, que admite documentos de diferentes formas en la misma colección, para actualizar gradualmente el esquema de tu colección. A medida que actualizas tu modelo de esquema, el patrón de versionado de esquemas permite rastrear estas actualizaciones con números de versión. Tu código de aplicación puede utilizar números de versión para identificar y gestionar documentos con diferentes estructuras sin tiempo de inactividad.
Patrón de versionado de esquema
Para implementar el patrón de Versionado de Esquemas, añade un schema_version
(o con un nombre similar) a su esquema la primera vez que se modifique el esquema. Los documentos que emplean el nuevo esquema deben poseer un schema_version de 2 para indicar que siguen la segunda iteración de tu esquema. Si actualizas tu esquema nuevamente, incrementa el schema_version.
El código de su aplicación puede usar el schema_version de un documento, o su ausencia, para gestionar documentos condicionalmente. Use el esquema más reciente para almacenar la información nueva en la base de datos.
Ejemplo
El siguiente ejemplo itera sobre el esquema para documentos en la colección users.
En la primera iteración de este esquema, un registro incluye campos galactic_id, name y phone:
// users collection { "_id": "<ObjectId>", "galactic_id": 123, "name": "Anakin Skywalker", "phone": "503-555-0000", }
En la siguiente iteración, el esquema se actualiza para incluir más información en una 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" }
Agregar una schema_version significa que una aplicación puede identificar documentos diseñados para el nuevo esquema y gestionarlos en consecuencia. La aplicación aún puede gestionar documentos antiguos si schema_version no existe en el documento.
Por ejemplo, considera una aplicación que encuentra el/los número(s) de teléfono de un usuario por galactic_id. Al recibir un galactic_id, la aplicación necesita query la base de datos:
db.users.find( { galactic_id: 123 } );
Después de que el documento se devuelve desde la base de datos, la aplicación comprueba si el documento tiene un campo schema_version.
Si no tiene un campo
schema_version, la aplicación pasa el documento devuelto a una función dedicada que renderiza el campophonedel esquema original.Si tiene un campo
schema_version, la aplicación comprueba la versión del esquema. En este ejemplo, elschema_versiones2y la aplicación pasa el documento devuelto a una función dedicada que procesa los nuevos camposcontact_method.workycontact_method.home.
Utilizando el campo schema_version, el código de la aplicación puede soportar cualquier número de iteraciones de esquema en la misma colección añadiendo funciones manejadoras dedicadas al código.
Casos de uso
El patrón de versionado de esquemas es ideal para cualquiera o una combinación de los siguientes casos:
El tiempo de inactividad de la aplicación no es una opción
Actualizar documentos puede llevar horas, días o semanas de tiempo para completarse
Actualizar los documentos a la nueva versión del esquema no es un requisito
El patrón de control de versiones de esquema le ayuda a decidir mejor cuándo y cómo se realizarán las migraciones de datos en relación con las bases de datos tabulares tradicionales.