Twórz skrypty pod kontrolą wersji i ciągłą integracją, aby je weryfikować
Jednym ze sposobów, które działało dla mnie, było umożliwienie każdemu programistowi pracy z własnym schematem, z którym mogą robić to, co lubią. Ich schemat był możliwy do zniszczenia i wypełniony danymi testowymi pobranymi z zestawu skryptów kontrolowanych wersjami, do którego wszyscy twórcy się przyczynili.
Nocna kompilacja ciągłej integracji wzięła najnowszą wersję wszystkich skryptów i próbowała zbudować z nich spójną testową bazę danych. Następnie aplikacja przeprowadziła szereg testów integracyjnych i funkcjonalnych, aby sprawdzić, czy bieżący schemat jest zgodny z bieżącym kandydatem do wydania.
Przed rozpoczęciem tej drogi istniała dość solidna konstrukcja bazy danych, a DBA zawsze pilnował rzeczy, aby uniemożliwić programistom szaleństwo z powodu denormalizacji i innych okropności.
Kontrola wersji bardzo pomogła tutaj, ponieważ zmiany w skryptach były natychmiast widoczne. Wykorzystaliśmy również VERSION
tabelę bazy danych, aby określić ogólny stan bazy danych. To była prosta sekwencja liczb całkowitych i nie była powiązana z żadną konkretną aplikacją.
Ogólnie rzecz biorąc, działało dobrze i oznaczało, że programiści przestali się obawiać zmiany poziomów trwałości, ponieważ zawsze mogli wycofać swoje własne schematy bez wpływu na inne.
Podejście, którego używam, to zapewnienie jednej tabeli parametrów. Ta tabela będzie zawierała jedną parę nazwa / wartość dla wersji, w której znajduje się baza danych. Daje mi to dwie korzyści: Mam sposób na zweryfikowanie, czy aplikacja poprawiła tylko bazę danych i mogę użyć tej wartości w moich skryptach SQL.
Skrypt SQL utworzy nowe tabele, zmieni kolumny i wszelkie inne prace związane z bazą danych w celu wypromowania skryptu z poprzedniej wersji. Idealnie byłoby też mieć skrypt wycofywania, ale przez większość czasu nie.
BTW, całe to podejście zostało zautomatyzowane w ramach Ruby on Rails, wraz ze skryptami wycofywania. Podoba mi się to, ale nie wszystkie ramy to robią. Kiedy nie używam Ruby on Rails, używam podejścia opisanego powyżej.
źródło