W wielu podejściach do tworzenia oprogramowania, takich jak metodyki zwinne, projektowanie oparte na domenie oraz analiza i projektowanie zorientowane obiektowo, zachęcamy do stosowania jednego iteracyjnego podejścia do programowania.
Dlatego nie powinniśmy robić naszego modelu domeny poprawnie przy pierwszym uruchomieniu projektu. W miarę upływu czasu zmieniamy model, ponieważ z czasem lepiej rozumiemy dziedzinę problemową.
Poza tym, nawet jeśli staramy się uzyskać idealny model z góry, co, jak już jestem przekonany, jest bardzo trudne, wymagania mogą się zmienić. Więc po program został wdrożony do produkcji, użytkownicy końcowi mogą zauważyć, że pewien wymóg nie został do końca poznany, lub, co gorsza, niektóre wymóg brakowało.
Chodzi o to, że po wdrożeniu oprogramowania może się okazać, że będziemy musieli zmienić model. Jeśli tak się stanie, mamy problem: produkcyjna baza danych zawiera ważne dane użytkownika i jest już dopasowana do formatu starego modelu .
Aktualizacja kodu może być trudnym zadaniem, jeśli kod nie jest dobrze zaprojektowany i jeśli system jest duży. Ale można to zrobić z czasem, mamy narzędzia takie jak Git, które pomagają nam to zrobić bez uszkodzenia wersji gotowej do produkcji.
Z drugiej strony, jeśli model się zmieni, jeśli właściwości klas znikną, czy cokolwiek innego, baza danych również powinna się zmienić. Ale mamy problem: istnieją już dane, których nie można utracić, co jest już sformatowane dla starego modelu.
Wydaje się, że relacyjna baza danych stanowi tutaj barierę uniemożliwiającą iteracyjny rozwój, a nawet aktualizację oprogramowania, gdy jest to wymagane przez użytkowników końcowych.
Jednym ze sposobów, które już zastosowałem, było kodowanie specjalnej klasy, która mapuje stare tabele bazy danych na nowe. Zatem klasy te pobierają dane w starym formacie, konwertują je na format używany przez nowy model i zapisują w nowych tabelach.
To podejście nie wydaje się najlepsze. Moje pytanie brzmi: czy istnieją dobrze znane i zalecane podejścia do pogodzenia iteracyjnego rozwoju z relacyjnymi bazami danych?