Aby się dało łatwo odtworzyć bazę, skorzystamy z naszego własnego formatu binarnego. Jednak nie będzie to jedyna możliwość. Postanowiliśmy stworzyć system na tyle elastyczny, by można było do niego przy pomocy wtyczek dodać obsługę różnych formatów zapisu danych. Gdy tylko zostanie załadowany odpowiedni plugin, będzie można obraz bazy zapisać w pliku tekstowym, np. w formacie mysqla czy postgresa. Dzięki temu aplikacja nie tylko doskonale nadaje się do ewentualnego późniejszego odtworzenia bazy, lecz również do ewentualnej konwersji pomiędzy różnymi bazami danych.
Bazy danych przechowują zazwyczaj bardzo duże ilości danych (rzędu wielu megabajtów). W związku z tym, niezależnie od tego jaki format zapisu wybierzemy, plik wynikowy z backupem będzie sporych rozmiarów. Taki plik będzie użytkownikowi dość trudno będzie ściągnąć na dysk lokalny, zwłaszcza jeżeli będzie on dysponował wolnym łączem internetowym (co zwłaszcza w Polsce nie powinno nikogo dziwić...). Tymczasem taki plik prawdopodobnie będzie się bardzo dobrze nadawał do kompresji, gdyż większą jego część będą zapewne stanowiły powtarzające się ciągi znaków. Kompresja plików w Javie jest bardzo prosta, nie trzeba ściągać żadnych zewnętrznych bibliotek - funkcje te są dostępne w standardowej bibliotece Javy (pakiet java.util.zip). Dostępne są dwa algorytmy kompresji - do pliku formatu ZIP i GZIP. Aby dać użytkownikowi większy wybór, pozwolimy mu samemu zdecydować którego algorytmu chce użyć (czy też może woli w ogóle nie kompresować pliku, jeżeli nie jest on zbyt duży). Prawdopodobnie administrator pracujący na codzień w Windowsie będzie wolał, żeby system przysłał mu plik *.zip, a administrator linuxowy - plik *.gz, więc w ten sposób wszyscy powinni być zadowoleni.
Plik wynikowy będzie można poddać opcjonalnie zakodowaniu. Jednakże najprostszą metodą będzie korzystanie z naszego systemu poprzez kanał ssl i właśnie ten sposób będziemy zalecali użytkownikom.
Serwery baz danych używają wielu różnych systemów zarządzania relacyjnych baz danych. Jak wiadomo, wszystkie one implementują wspólny standard SQL, ale każda z nich interpretuje niektóre szczegóły nieco inaczej, każda też ma nieco inne możliwości (np. najpopularniejszy chyba MySQL dopiero w obecnej wersji, wydanej pod koniec października, zaczął obsługiwać widoki, procedury składowane i triggery). Dlatego nie da się napisać jednego uniwersalnego modułu który ściągałby wszystkie dane ze wszystkich typów baz. Możemy albo ograniczyć się tylko do pewnego zakresu elementów które są obsługiwane przez wszystkie bazy (ale wtedy z części z nich otrzymywalibyśmy niekompletne dane, i taki dump nie nadawałby się w zasadzie do niczego), albo wybrać kilka typów które chcemy obsługiwać, i do każdego z nich podejść indywidualnie. Postanowiliśmy napisać część systemu odpowiedzialną za ściąganie danych w taki sposób, aby z jednej strony zminimalizować czas pisania kodu, z drugiej - umożliwić obsługę jak największej liczby typów baz. Zostanie w tym celu wykorzystana specjalna grupa klas:
W ten sposób te funkcje, które wszystkie bazy wykonują tak samo, wystarczy napisać tylko raz w klasie głównej, a specyficzne funkcje zostaną zdefiniowane w podklasach. Klasa ogólna będzie mogła być wykorzystana przez użytkownika w sytuacji, kiedy będzie chciał spróbować zrobić backup bazy jakiegoś mało znanego typu, którego obsługi nie przewidzieliśmy (niestety nie możemy zagwarantować, że mu się to uda).
Aby umożliwić użytkownikom łatwe rozszerzanie systemu o kolejne typy baz, spróbujemy napisać system w ten sposób, aby listę dostępnych klas obsługujących bazy tworzył dynamicznie, przeszukując odpowiedni pakiet w poszukiwaniu klas dziedziczących po ogólnej klasie obsługi połączenia. W ten sposób użytkownik nie będzie musiał nawet nic zmieniać w naszym końcowym pliku *.jar, a tylko podłączy do systemu inny plik ze swoimi klasami obsługującymi, a system powinien je wykryć i umożliwić korzystanie z nich.
Na początku zostanie stworzona struktura tabel, następnie zostaną one wypełnione danymi, by na końcu dodać constrainty.
Aby rozpoznać nazwy tabel w bazie danych skorzystamy z tzw. metadanych (klasa DatabaseMetaData).