Overview
Los esquemas de bases de datos necesitan actualizarse ocasionalmente. Por ejemplo, un esquema diseñado para almacenar información de contacto de usuarios podría necesitar actualizarse para incluir nuevos métodos de comunicación a medida que se popularizan, como Twitter o Skype.
Puede usar el modelo de esquema flexible de MongoDB, que admite documentos con diferentes formatos en la misma colección, para actualizar gradualmente el esquema de su colección. A medida que actualiza su modelo de esquema, el patrón de control de versiones del esquema le permite rastrear estas actualizaciones con números de versión. El código de su aplicación puede usar números de versión para identificar y gestionar documentos con diferentes formatos sin interrupciones.
Patrón de control de versiones del esquema
Para implementar el patrón de control de versiones del esquema, agregue un schema_version
(o con un nombre similar) a su esquema la primera vez que lo modifique. Los documentos que usan el nuevo esquema deben tener un schema_version de 2 para indicar que se adhieren a la segunda iteración de su esquema. Si actualiza su esquema de nuevo, incremente 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 de los documentos de la colección users.
En la primera iteración de este esquema, un registro incluye los 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" }
Añadir un schema_version significa que una aplicación puede identificar documentos adaptados al nuevo esquema y gestionarlos adecuadamente. La aplicación puede seguir gestionando documentos antiguos si el valor schema_version no existe en el documento.
Por ejemplo, considere una aplicación que encuentra el número de teléfono de un usuario mediante galactic_id. Al obtener un galactic_id, la aplicación debe consultar 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 verifica 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 representa 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.
Al utilizar el campo schema_version, el código de la aplicación puede admitir cualquier cantidad de iteraciones de esquema en la misma colección agregando funciones de controlador dedicadas al código.
Casos de uso
El patrón de control de versiones de esquema 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
La actualización de documentos puede tardar horas, días o semanas en 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.