Hemos estado discutiendo las técnicas de implementación de la base de datos hoy, habiendo tenido un par de fallas recientes en nuestro proceso actual y hemos visto situaciones en las que nos gustaría revertir una implementación, pero la versión anterior de la aplicación nunca se había probado con la nueva versión del base de datos.
Por un lado, hay implementaciones de estilo de migración, donde tiene una instrucción de versión hacia arriba y una instrucción de versión hacia abajo (ya sea que estén escritas en SQL o en el idioma de su aplicación) y su aplicación sabe a qué versión debe llegar.
Estos son simples, y como no vamos a retroceder a menudo, los desarrolladores están interesados en lo simple. Sin embargo, existen riesgos cuando agrega un campo / tabla y ese campo se llena antes de retroceder. O peor, donde se sueltan datos que eran relevantes para la versión anterior.
Por otro lado, podemos considerar un enfoque de actualización, retroceso y retroceso donde el retroceso no es tan drástico como con las migraciones. Por ejemplo, la actualización puede agregar un campo no anulable; la reversión hace que sea anulable para que la aplicación anterior no le importe; rollforward rellena los campos nulos y hace que no sea anulable nuevamente.
Esto retiene datos pero es complicado tanto para codificar como para probar (lamentablemente, nuestras pruebas de integración automatizadas son prácticamente inexistentes y mientras corregimos eso, mientras tanto tenemos un problema).
¿Hay formas seguras de mitigar los problemas con estos? ¿Hay otras opciones que debería considerar? ¿Has tenido malas experiencias que te gustaría compartir y que luego me puedan ahorrar dolor?