Estrategia para la compatibilidad con versiones anteriores del almacenamiento persistente

7

En mi experiencia, intentar garantizar que las nuevas versiones de una aplicación conserven la compatibilidad con el almacenamiento de datos de versiones anteriores a menudo puede ser un proceso doloroso.

Lo que actualmente hago es guardar un número de versión para cada 'unidad' de datos (ya sea un archivo, fila / tabla de la base de datos, o lo que sea) y asegurar que el número de versión se actualice cada vez que los datos cambian de alguna manera . También creo métodos para convertir de v1 a v2, v2 a v3, y así sucesivamente. De esa manera, si estoy en v7 y me encuentro con un archivo v3, puedo hacer v3- > v4- > v5- > v6- > v7.

Hasta ahora, este enfoque parece estar funcionando bien, pero aún no he tenido que usarlo extensamente, por lo que puede haber problemas imprevistos. También me preocupa que si los objetos que estoy cargando cambian significativamente, tendré que evitar las versiones antiguas de las clases o enfrentar la actualización de todos mis métodos de conversión para manejar la nueva definición de clase.

¿Mi enfoque de sonido? ¿Hay otros / mejores enfoques que podría estar usando? ¿Existen patrones de diseño aplicables a este problema?

    
pregunta vaughandroid 04.04.2012 - 12:30

3 respuestas

7

Lo estás haciendo bien. Estás estampando datos con su versión, lo que significa que tienes una interpretación definitiva de los mismos. La única pregunta abierta es cómo manejar los datos "antiguos". Sus opciones son esencialmente entre la actualización de los datos donde vive, que su código adapte los datos en tiempo real o que el código maneje múltiples versiones de datos. A partir de más de 30 años de experiencia, puedo decirles que la primera es la única forma sensata de hacerlo. Muerde la viñeta y escriba una rutina de conversión para cada paso a lo largo del historial, y ejecútelas en secuencia. Si encuentra que un paso posterior obvia uno anterior ( ej. , ¿por qué actualizar las filas en una tabla si un paso posterior elimina la tabla?), Resista la tentación de cortocircuitar a menos que haya una gran ganancia de rendimiento demostrable en el proceso de actualización.

    
respondido por el Ross Patterson 05.04.2012 - 00:54
3

que es un sistema decente rodeado por el código para actualizar datos

mi consejo es que actualice tanto como sea posible mientras se mantiene perezoso (lees un objeto de una versión anterior - > lo sobrescribes con el mismo objeto (ahora actualizado) de la versión actual)

pero se encontrará con problemas si alguna vez ajusta los invariantes de datos o simplemente realiza una revisión completa para que una versión anterior no pueda actualizarse

    
respondido por el ratchet freak 04.04.2012 - 14:12
0

Si sus objetos son solo portadores de datos, puede usar la biblioteca de Google protobuff o algo similar. Para cada miembro de la clase / objeto existe una propiedad que indica si el miembro existe o no. Por ejemplo, una versión de objetos V1 tiene una propiedad llamada DataForV1 y una propiedad llamada HasDataForV1. La versión V2 ya no usa el DataForV1, por lo que HasDataForV1 siempre devolverá false y la propiedad DataForV1 podría contener un valor nulo o predeterminado.

    
respondido por el nohros 04.04.2012 - 14:55

Lea otras preguntas en las etiquetas