En muchos enfoques para el desarrollo de software, como las metodologías ágiles, el diseño basado en dominios y el análisis y diseño orientados a objetos, se nos alienta a adoptar un enfoque iterativo para el desarrollo.
Por lo tanto, se supone que no debemos hacer nuestro modelo de dominio correctamente la primera vez que comenzamos a trabajar en el proyecto. En cambio, a medida que pasa el tiempo, refactorizamos el modelo porque obtenemos una comprensión más profunda del dominio del problema con el tiempo.
Aparte de eso, incluso si tratamos de obtener un modelo perfecto por adelantado, que ya estoy convencido de que es muy difícil, los requisitos pueden cambiar. Entonces, después de que el software se haya implementado en producción, los usuarios finales pueden notar que cierto requisito no se entendió completamente o, lo que es peor, falta algún requisito.
El punto aquí es que podemos terminar necesitando cambiar el modelo después de que se haya implementado el software. Si esto sucede, tenemos un problema: la base de datos de producción tiene datos de usuario que son importantes y ya está ajustada en el formato del modelo anterior .
La actualización del código puede ser una tarea difícil si el código no está bien diseñado y si el sistema es grande. Pero se puede hacer con el tiempo, tenemos herramientas como Git que nos ayudan a hacerlo sin dañar la versión lista para producción.
Por otro lado, si el modelo cambia, si las propiedades de las clases desaparecen o lo que sea, la base de datos también debería cambiar. Pero tenemos un problema: ya hay datos allí que no se pueden perder, que ya están formateados para el modelo anterior.
Parece que una base de datos relacional aquí está siendo una barrera que nos impide realizar un desarrollo iterativo e incluso actualizar el software cuando lo requieren los usuarios finales.
Un enfoque que ya utilicé fue codificar una clase especial que asigna tablas de bases de datos antiguas a nuevas. Por lo tanto, estas clases recogen datos en formato antiguo, los convierten al formato utilizado por el nuevo modelo y los guardan en las nuevas tablas.
Este enfoque parece no ser el mejor. Mi pregunta aquí es: ¿existen enfoques conocidos y recomendados para conciliar el desarrollo iterativo con bases de datos relacionales?