Zapytanie w sprawie bazy

  • Tomasz Kopacz,

Język SQL w MySQL nie obsługuje podzapytań, ale większość programistów potrafi to obejść, tworząc tabele tymczasowe. Bardzo wygodnym mechanizmem jest np. klauzula LIMIT, pozwalająca wskazać zakres numerów wierszy, które ma zwrócić dana kwerenda. Niestety, nie są optymalizowane zapytania skierowane do różnych typów baz (np. MyISAM i InnoDB).

Spora część operacji administracyjnych MySQL wymaga jawnego blokowania całych tabel. Jeżeli np. chcemy wykonać kopię zapasową, trzeba jawnie zablokować wszystkie tabele w bazie albo upewnić się, że nikt w danym momencie nie wykonuje zapisu. Istnieje rozszerzenie pozwalające wykonywać kopie baz w trybie online, nie jest ono jednak dostępne za darmo.

Z kolei PostgreSQL jest bardzo rozbudowaną bazą relacyjną SQL, w pełni zgodną z ACID. Dysponuje aż 7 poziomami blokad. Można w niej stosować triggery oraz funkcje i typy definiowane przez użytkownika. Procedury mogą być przechowywane albo pisane w języku SQL, albo dołączane jako zewnętrzne moduły. W maju br. zakończono prace nad serwerem replikacyjnym - dotychczas PostgreSQL nie obsługiwał replikacji bezpośrednio. Baza ma wiele algorytmów optymalizujących kwerendy - jeden z modułów eksperymentalnych wykorzystuje algorytmy genetyczne. PostgreSQL umożliwia ponadto dziedziczenie schematu tabeli.

PostgreSQL to pełnoprawny serwer bazodanowy, wyposażony w większość cech serwerów komercyjnych. O ile twórcy MySQL starają się robić najprostszą bazę danych, o tyle PostgreSQL ma być bazą wyposażoną w jak najwięcej możliwości. Z tego powodu znacznie łatwiej jest np. przenieść aplikację z bazy komercyjnej na PostgreSQL niż na MySQL. Trzeba jednak podkreślić, że taka operacja nie jest prosta. Przewaga wydajnościowa MySQL nad PostgreSQL nie jest ogromna i ma miejsce tylko w niektórych sytuacjach. Wykorzystanie PostgreSQL ułatwia także licencja. Baza jest dostępna na licencji BSD, co nie utrudnia wykorzystania jej w rozwiązaniu z "zamkniętym" kodem. MySQL jest dostępna albo na licencji GPL, albo komercyjnej.

Bazy osadzone

W wielu sytuacjach w aplikacji potrzebna jest "osadzona" baza danych. Może ona służyć do tymczasowego przechowywania informacji, np. gdy aplikacja odłącza się od dużego serwera, albo jako rozwiązanie typu podręczne repozytorium danych.

W świecie .Net taką bazą jest DataSet - obiekt, w którym są przechowywane tabele i relacje. DataSet pozwala zapisywać i wyszukiwać informacje. Można go obsługiwać zarówno jako dokument XML, jak i jako strukturę relacyjną.

Borland oferuje wbudowaną bazę danych JDataStore napisaną w języku Java. Implementuje pełny standard SQL 92. Baza jest zintegrowana z pakietem JBuilder - łatwo można ją połączyć z własną aplikacją. To jednak w pełni oddzielny produkt - JDataStore można zainstalować jako samodzielny serwer bazodanowy.

Innym przykładem bazy napisanej w Javie jest McKoi SQL Database, dostępna na licencji GPL. Nie implementuje ona pełnego standardu SQL 92, jednak w wersji 1.0 są dostępne wszystkie ważniejsze mechanizmy SQL - mechanizmy integralności, triggery, indeksy itp. Baza może być osadzona w pisanym kodzie Javy (jako dodatkowa biblioteka). Wtedy dostępny jest specjalny, lokalny sterownik JDBC pozwalający na trochę szybszy dostęp do danych.

Tego typu bazy nie są zbyt szybkie. Doskonale sprawdzają się jednak jako mechanizm cache lub we współpracy z małymi aplikacjami. Dla programistów posługujących się Javą są bardzo interesującą propozycją z racji tego, że działają wszędzie tam, gdzie jest dostępna maszyna wirtualna Javy.

Wśród baz open source, które można wykorzystać jako rozwiązania 'osadzone', warto wymienić SQLite. To zaimplementowana w C biblioteka, która jest de facto pełnym serwerem bazodanowym. Implementuje podzbiór standardu SQL-92. Nie są obsługiwane klucze obce, a mechanizm triggerów został uproszczony. Nie można też stosować zagnieżdżonych transakcji. Kod źródłowy bazy zajmuje jednak... 25 tys. linii, można go więc łatwo 'osadzić' we własnym kodzie. Baza SQLite jest dostępna na licencji Public Domain.