R-03-07.pdf

(694 KB) Pobierz
Rozdzia³_3_Bazy danych
Rozdział 3. Bazy danych
Prawie wszystkie aplikacje wymagają przechowywania danych. Wymagania te mogą się zmieniać,
począwszy od zupełnie podstawowych jak przechowywanie niewielkiej liczby opcji startowych, aż
do olbrzymich i złożonych baz danych jak np. bazy przechowujące informacje o wykształceniu
wszystkich obywateli danego kraju. Równie ważne jest to, że wymagania stawiane pojemności
nośników danych także mogą się zmieniać, począwszy od potrzeby przechowania prostych plików
tekstowych o ustalonej długości aż do dużych obiektów binarnych.
Bardzo waży jest wybór rozwiązania odpowiedniego dla danego problemu. Nie ma przecież sensu
używanie skomplikowanego serwera bazy danych do przechowywania obrazu wyświetlanego jako
„tapeta” na ekranie monitora. Podobnie nie ma też sensu próba przechowywania w jednym pliku
tekstowym wszystkich danych potrzebnych w dużym domu maklerskim do śledzenia kursów
akcji.
Właściwy wybór zależy zarówno od objętości, jak i od rodzaju danych. Jeżeli dane zawierają dużą
liczbę „pojedynczych obiektów” (traktując słowo „obiekt” w jego ogólnym sensie), które muszą
być przechowane, to odpowiednim rozwiązaniem może być baza w postaci prostego lub
indeksowanego pliku tekstowego. Jeśli dane mają strukturę hierarchiczną, wówczas lepsza może
być struktura drzewiasta używana np. w serwerze LDDP (z serwerem LDAP spotkamy się w
dalszych częściach książki).
Jeżeli dane zawierają obiekty kilku różnych rodzajów, powiązanych przez swoje właściwości,
dobrym rozwiązaniem będzie prawdopodobnie relacyjna baza danych. Bazy tego typu są bardzo
elastyczne i umożliwiają przechowywanie większości struktur danych, łącznie ze strukturami
drzewiastymi, jeśli jest to konieczne.
Korzystając z systemu operacyjnego Linux, znajdujemy się w szczęśliwym położeniu, bowiem
dysponujemy wieloma sposobami zarządzania swoimi danymi i możemy wybrać rozwiązanie
spełniające nasze wymagania. W najprostszym przypadku możemy użyć prostych plików
tekstowych albo stosując niskopoziomowe API , albo wykorzystując ułatwiający dostęp do danych
interfejs gnome_config , jeśli aplikacja będzie aplikacją Gnome . Jeżeli nasze wymagania nie są
skomplikowane, a potrzebny jest szybki dostęp do danych, to możemy rozważyć użycie funkcji
ndbm . Umożliwiają one przechowywanie prawie dowolnych danych i zapewniają bardzo wydajny
dostęp za pomocą indeksów. Funkcje te zostały opisane w książce Beginning Linux Programming
wydanej przez wydawnictwo Wrox Press. Rozwiązania tego rodzaju nie są jednak właściwe przy
bardziej skomplikowanych potrzebach i nie będziemy się nimi dalej zajmować.
Na dalszych miejscach skali mamy do wyboru trzy główne bazy: mSQL , MySQL i PostgreSQL ,
które omówimy w dalszych częściach książki. Można także rozważać użycie bazy InterBase , która
formalnie jest produktem komercyjnym, ale w czasie pisania tej książki była dostępna dla systemu
Linux bezpłatnie łącznie z pełnym kodem źródłowym. Jeśli nasze wymagania są ostrzejsze, to
możemy rozważyć użycie jednej z zaadaptowanych dla systemu Linux komercyjnych baz danych,
takich jak DB2 , Sybase lub Oracle . Na szczęście niewielu użytkowników ma aż tak wygórowane
wymagania i większość z nich może zupełnie pomyślnie posługiwać się otwartym
oprogramowaniem w rodzaju MySQL lub PostgreSQL , które całkowicie spełnia ich potrzeby.
Wybór bazy danych
Zanim przejdziemy do omawiania bardziej technicznych zagadnień, omówimy skrótowo trzy
najpopularniejsze otwarte rozwiązania wykorzystujące SQL i dostępne w systemie Linux.
Zastanowimy się także nad tym, które z nich będzie najlepiej spełniać nasze wymagania stawiane
bazie danych. Podczas pisania tej książki dostępne były kody źródłowe dla wszystkich trzech baz
danych, a MySQL i PostgreSQL były ponadto wolne od opłat licencyjnych. Możliwe, że w
przyszłości ograniczenia licencyjne zostaną złagodzone lub zaostrzone, albo też nowsze wersje
kodów źródłowych nie będą swobodnie rozpowszechniane, należy więc sprawdzić aktualny stan
licencji na stronach macierzystych tych produktów.
mSQL
David Hughes, pracownik naukowy Bond University w Australii, pracował nad oprogramowaniem
do zarządzania siecią o nazwie Minerva , które wymagało użycia bazy danych. Chciał on użyć
standardowego języka SQL , ale w owym czasie jedyną „wolną” bazą danych był Postgres , w
którym zastosowano własny język zapytań o nazwie PostQUEL . David napisał interfejs
programowy przetwarzający podstawowe zapytania SQL na PostQUEL i przekazujący je do
serwera Postgres . Nazwano go MiniSQL lub mSQL . Wkrótce okazało się, że użycie serwera
Postgres i tłumaczenie zapytań było bardziej skomplikowane, niż się tego spodziewano i Hughes
ulepszył mSQL w taki sposób, aby nie korzystać ze wspomagania serwera Postgres . Taki
samodzielnie działający mSQL jest obecnie również dostępny i można go znaleźć pod adresem
http://www.hughes.com/au/ .
MySQL
Baza MySQL powstała w podobny sposób jak mSQL . Firma TcX opracowywała aplikację
wykorzystującą WWW i bazę danych i stwierdziła, że najlepszym rozwiązaniem będzie użycie
SQL. Postanowiono wykorzystać API zbudowane na podstawie mSQL i tak powstał produkt o
nazwie MySQL . Po pewnym czasie API dla MySQL i mSQL zaczęły się różnicować w miarę
rozwoju MySQL , ale nadal podobieństwa są na tyle duże, że przenoszenie kodu z mSQL do
MySQL jest dosyć łatwe. MySQL można znaleźć pod adresem http://www.MySQL.com/ .
PostgreSQL
PostgreSQL wywodzi się z pakietu Ingres (bazy danych opracowanej na Uniwersytecie
Kalifornijskim w Berkeley). Podczas pisania książki Ingres był nadal dostępny w ofercie
handlowej firmy Computer Associates. W Berkeley, wkrótce po bazie Ingres , opracowano także
inną bazę o nazwie Postgres , która była wykorzystywana do eksperymentów z relacjami między
obiektami. Początkowo Postgres zupełnie nie korzystał z SQL , ale około roku 1995. Jolly Chen i
Andrew Yu dodali obsługę SQL i wydali nową wersję o nazwie Postgres95 .
Po koniec roku 1996. prace rozwojowe przejął zespół związany z ruchem wolnego
oprogramowania i produkt ponownie zmienił nazwę, tym razem na PostgreSQL , pod którą jest
aktywnie rozwijany do dzisiaj. Ponieważ PostgreSQL nie jest objęty żadnymi restrykcjami
komercyjnymi, zatem może być swobodnie rozpowszechniany. Dzięki temu jest dostępny w wielu
dystrybucjach Linuksa. Można go pobrać z sieci z adresu http://www.postgresql.org/ .
Jaki wybór będzie odpowiedni?
Mamy więc trzy bazy danych przeznaczone do przeciętnych zastosowań, a każda z nich ma
dostępny kod źródłowy — co więc należy wybrać do naszego projektu? Odpowiedź brzmi jak
zawsze: zależy to od wielu czynników. Nie ma prostej odpowiedzi. W czasie pisania książki
najłatwiej było dokonać wyboru między mSQL i MySQL . Baza MySQL lepiej obsługuje standard
SQL i jej licencja jest nieco bardziej otwarta, a więc można ją faworyzować. Być może, podczas
czytania tych słów sytuacja się już zmieniła i baza mSQL odebrała pierwszeństwo MySQL ,
ponieważ obydwie były aktywnie rozwijane.
Wybór między MySQL (lub być może mSQL ) a PostgreSQL zależy już bardziej od naszych
potrzeb. Jeżeli potrzebna jest niewielka baza danych z szybko działającymi zapytaniami,
przeznaczona do zastosowań wewnątrz firmy lub użytku osobistego i nie jesteśmy zbyt mocno
zainteresowani używaniem transakcji (które wyjaśnimy później) lub bardzo zaawansowanymi
aspektami SQL, to najprawdopodobniej najlepszym wyborem będzie MySQL . W rzeczywistości
jest ona szeroko stosowana na wielu serwerach WWW , w których obsługa transakcji jest o wiele
mniej ważna niż szybkość pobierania danych. Wynika to stąd, że serwery WWW wymagają tylko
odczytu danych przekazywanych do klienta, zaś potrzeba modyfikacji danych występuje tam
bardzo rzadko.
Jeśli jednak chcemy rozpowszechniać naszą aplikację z bazą danych i jesteśmy zainteresowani
użyciem mechanizmów transakcyjnych, to PostgreeSQL będzie prawdopodobnie jedyną
możliwością wyboru. Aby dokonać wyboru między tymi krańcowo różniącymi się bazami, należy
samodzielnie przestudiować strony macierzyste obydwu produktów i ocenić je według swoich
potrzeb. Obydwie bazy są na pewno bardzo dobre.
PostgreSQL
W pozostałych częściach tego rozdziału i w następnych rozdziałach skoncentrujemy się na bazie
PostgreSQL z następujących powodów:
1. Jest ona dostępna na warunkach bardzo liberalnej licencji i można jej używać za darmo. Oto
krótki cytat z licencji ilustrujący jej główne założenie:
Copyright (c) 1994-8 Regents of the University of California
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written
agreement is hereby granted, provided that the above copyright notice and
this paragraph and the following two paragraphs appear in all copies.
(Pozostałe części zawierają standardowe zastrzeżenia).
2. Baza ta jest dołączana do wielu dystrybucji Linuksa, są więc duże szanse, że jeśli pracujemy
w tym systemie, to ona również została zainstalowana. Jeżeli tak nie jest, to można ją
zapewne znaleźć na płycie z dystrybucją w postaci gotowej do zainstalowania.
3. Baza PostgreSQL obsługuje transakcje, dzięki czemu możliwe jest dokonanie kilku
modyfikacji danych i podjęcie decyzji, czy wszystkie te modyfikacje zatwierdzić lub wycofać.
W wypadku pracy wielu użytkowników, którzy modyfikują dane, jest to bardzo ważne
zagadnienie. Nawet w aplikacji przeznaczonej dla pojedynczego użytkownika zastosowanie
transakcji może się okazać bardzo pożyteczne.
4. PostgreSQL lepiej wspomaga standard ANSI SQL niż inne bazy, zatem można posługiwać się
zapytaniami o bardziej zaawansowanej konstrukcji.
Instalacja i uruchamianie
Nie mamy zamiaru rozwodzić się tutaj szeroko o instalacji bazy PostgreSQL , ponieważ baza ta
została prawdopodobnie już zainstalowana lub jest dostępna w danej dystrybucji Linuksa. Jeżeli
tak nie jest, to należy pobrać ją ze strony o adresie http://www.postgresql.org i zainstalować we
własnym zakresie. Dostępne są zarówno wersja źródłowa, jak i pakiety binarne. Polecamy
instalację pakietów binarnych, ponieważ jest to łatwiejsze i szybsze niż samodzielna kompilacja.
Po pierwszym uruchomieniu serwera PostgreSQL pojawia się tylko jedna baza danych o nazwie
template1 i z tą bazą należy się połączyć. Domyślnie dostęp do serwera ma tylko jeden
użytkownik o nazwie postgres , mający uprawnienia administratora bazy danych (jest on
tworzony podczas instalacji pakietu).
Po zainstalowaniu PostgreSQL należy się upewnić, czy proces serwera bazy działa i czy serwer
został zainicjowany. Aby zainicjować bazę, należy zalogować się jako root i utworzyć katalog
/usr/local/pgsql/data . Właścicielem tego katalogu powinien być użytkownik postgres :
# chown postgres /usr/local/pgsl/data
Następnie należy zmienić tożsamość na użytkownika postgres :
# su - postgres
i zainicjować PostgreSQL w następujący sposób:
# /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
Teraz należy sprawdzić, czy działa proces postmaster (taką nazwę nosi proces serwera bazy
PostgreSQL ):
# ps axw
Jeśli proces postmaster został uruchomiony, wówczas w zależności od wyboru instalacji
możemy zobaczyć komunikat zbliżony do poniższego:
474 p1 S 0:00 /usr/local/pgsql/bin/postmaster -D/usr/local/pgsql/data
Jeżeli proces postmaster nie działa, to należy go uruchomić za pomocą polecenia:
# /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
Oczywiście, jeżeli zmienna $PATH zawiera katalog /usr/local/pgsql/bin lub jego
równoważnik, to nie trzeba używać pełnej ścieżki w poleceniu i wystarczy tylko napisać:
# postmaster -D /usr/local/pgsql/data
Warto więc zmodyfikować zmienną $PATH , aby zaoszczędzić czas w przyszłości.
Zazwyczaj dystrybucja jest przygotowywana w taki sposób, że przy pierwszym uruchomieniu
serwera wywoływane jest automatycznie polecenie initdb inicjujące bazę PostgreSQL . Można
sprawdzić, czy w pliku konfiguracyjnym systemu po instalacji PostgreSQL automatycznie jest
wywoływany demon serwera PostgreSQL .
W niektórych starszych dystrybucjach (np. w Red Hat 6.0) funkcja initdb nie była wywoływana
automatycznie i nie była tworzona pusta wzorcowa baza danych. Ręczna inicjacja bazy jest
opisana na macierzystej stronie WWW firmy Red Hat oraz w książce Professional Linux
Deployment wydanej przez Wrox.
Po upewnieniu się, że proces postmaster działa, możemy połączyć się z serwerem. Łączenie
polega na połączeniu się z bazą danych. Podobnie jak w innych „prawdziwych” bazach, jeden
proces serwera PostgreSQL może obsługiwać wiele różnych baz.
W pakiecie PostgreSQL istnieje wygodne narzędzie o nazwie psql wspomagające dostęp do bazy
danych z wiersza poleceń. Wykorzystamy je do eksperymentów z bazą, zanim użyjemy do tego
celu języka programowania.
Aby sprawdzić, czy serwer działa poprawnie, najpierw trzeba stać się administratorem bazy
danych. W tym celu, po zalogowaniu jako root , należy użyć polecenia:
# su - postgres
Teraz możemy połączyć się z serwerem:
$ psql template1
Przy odrobinie szczęścia powinniśmy otrzymać sekwencję komunikatów podobną do poniższej:
Zgłoś jeśli naruszono regulamin