In molti approcci allo sviluppo di software come metodologie agili, progettazione orientata al dominio e analisi e progettazione orientata agli oggetti, siamo incoraggiati ad adottare un approccio iterativo allo sviluppo.
Quindi non è previsto che il nostro modello di dominio venga eseguito correttamente la prima volta che iniziamo a lavorare nel progetto. Invece, con il passare del tempo, il modello viene ridefinito perché acquisiamo una conoscenza più approfondita del dominio del problema con il tempo.
A parte questo, anche se proviamo a ottenere un modello perfetto in anticipo, che sono già molto convinto, i requisiti potrebbero cambiare. Quindi, dopo che il software è stato distribuito in produzione, gli utenti finali potrebbero notare che un determinato requisito non era completamente compreso, o, peggio, mancava un requisito.
Il punto qui è che potremmo finire per dover cambiare il modello dopo che il software è stato distribuito. Se ciò accade, abbiamo un problema: il database di produzione contiene dati dell'utente che sono importanti e sono già presenti nel formato del vecchio modello .
L'aggiornamento del codice potrebbe essere un compito difficile se il codice non è ben progettato e se il sistema è grande. Ma può essere fatto con il tempo, abbiamo strumenti come Git che ci aiutano a farlo senza danneggiare la versione pronta per la produzione.
D'altra parte, se il modello cambia, se le proprietà delle classi scompaiono o qualsiasi altra cosa, anche il database dovrebbe cambiare. Ma abbiamo un problema: ci sono già dati che non possono essere persi, che è già stato creato per il vecchio modello.
Sembra che un database relazionale sia una barriera che ci impedisce di fare lo sviluppo iterativo e persino di aggiornare il software quando richiesto dagli utenti.
Un approccio che ho già usato è stato quello di codificare una classe speciale che mappa le vecchie tabelle del database in nuove. Pertanto, queste classi selezionano i dati nel vecchio formato, li convertono nel formato utilizzato dal nuovo modello e salvano nelle nuove tabelle.
Questo approccio sembra non essere il migliore. La mia domanda qui è: esistono approcci ben noti e consigliati per conciliare lo sviluppo iterativo con i database relazionali?