PostgreSQL jest obiektowo-relacyjnym systemem zarządzania bazą danych, bazującym na systemie POSTGRES, rozwijanym na Uniwersytecie Kalifornijskim na wydziale informatyki (Berkeley Computer Science Department). Projekt POSTGRES, który prowadził profesor Michael Stonebraker był sponsorowany przez następujące instytucje: DARPA (Defense Advanced Research Projects Agency), ARO (Army Research Office), NSF (National Science Foundation) oraz ESL.
PostgreSQL wywodzi się z tego projektu. Dostarcza on wsparcie dla języków SQL-92 oraz SQL:1999 i posiada inne nowoczesne cechy.
W chwili obecnej najnowsza wersja systemu to PostgreSQL 7.2.
POSTGRES wprowadził wiele obiektowo-relacyjnych pojęć, które są obecnie zaimplementowane w niektórych komercyjnych systemach baz danych. Tradycyjny, relacyjny system obsługuje model danych składający się ze zbiorów nazwanych relacji, zawierających atrybuty określonego typu. W obecnych systemach komercyjnych, dopuszczalne typy zawierają liczby zmiennoprzecinkowe, liczby całkowite, ciągi znaków, waluty oraz daty. Powszechnie uważa się, iż model ten jest niewystarczający dla przyszłych aplikacji przetwarzających dane.
PostgreSQL dostarcza dodatkowych możliwości poprzez zastosowanie między innymi poniższych mechanizmów, dzięki którym użytkownicy mogą w łatwy sposób rozszerzać system:
dziedziczenie,
typy danych,
funkcje.
Pozostałe cechy zwiększające elastyczność to:
ograniczenia,
wyzwalacze,
reguły,
integralność transakcji.
Cechy powyższe czynią z PostgreSQL’a system zaliczany do kategorii obiektowo-relacyjnych. Pomimo jednak cech obiektowych, PostgreSQL jest silnie osadzony w kręgu relacyjnych baz danych.
W kolejnych podrozdziałach zostaną przybliżone najważniejsze rozszerzenia wprowadzone w systemie PostgreSQL. Pomimo, iż wprowadzone zmiany czynią z niego system obiektowo-relacyjny, nie są to zmiany tak rewolucyjne jak w przedstawionym poprzednio systemie oferowanym przez firmę Oracle.
Informacje zaprezentowane w dalszej części pracy pochodzą z opracowania [PostgreSQL].
W systemie PostgreSQL aż do wersji 7.1, wielkość wiersza w bazie danych nie mogła przekraczać wielkości strony danych. Ponieważ rozmiar strony danych wynosi 8192 bajty (wartość domyślna, która może zostać zwiększona do 32768), górny limit rozmiaru danych był więc relatywnie niski. Aby obsłużyć przechowywanie większych wartości atomowych, PostgreSQL został wyposażony w interfejs wielkich obiektów (ang. large objects). Interfejs ten udostępnia plikowo zorientowany dostęp do danych użytkownika zadeklarowanych jako wielkie obiekty.
POSTGRES 4.2, bezpośredni przodek systemu PostgreSQL, obsługiwał trzy standardowe implementacje wielkich obiektów: jako zewnętrzne pliki dla serwera POSTGRES, jako zewnętrzne pliki zarządzane przez serwer POSTGRES, bądź też jako dane przechowywane wewnątrz bazy POSTGRES. Powodowało to znaczne komplikacje dla użytkowników. W rezultacie, w systemie PostgreSQL pozostało jedynie wsparcie dla wielkich obiektów jako danych przechowywanych w obrębie bazy danych. Pomimo wolniejszego dostępu, metoda ta zwiększa integralność danych. Począwszy od wersji PostgreSQL 7.1, wszystkie wielkie obiekty są umieszczane w jednej tablicy systemowej o nazwie pg_largeobject.
PostgreSQL 7.1 wprowadził także mechanizm (nazwany „TOAST”), który pozwala aby wiersze danych były dużo większe niż pojedyncze strony danych. Czyni on interfejs wielkich obiektów częściowo przestarzałym, jednakże pozostającą zaletą interfejsu jest nadal możliwość swobodnego dostępu do danych np. istnieje możliwość odczytu i zapisu małych kawałków dużych wartości. Planowane jest dodanie tej cechy do mechanizmu TOAST w przyszłości.
JDBC jest rdzennym API Javy. Dostarcza on standardowy zbiór interfejsów do baz danych obsługiwanych przez SQL.
PostgreSQL dostarcza sterownik JDBC typu 4. Oznacza to, że został on stworzony z użyciem czystej Javy i komunikuje się wykorzystując własny protokół sieciowy bazy danych. W związku z tym, sterownik jest niezależny od platformy.
PostgreSQL dostarcza dwie różne metody przechowywania danych binarnych. Dane binarne mogą być przechowywane w tabeli wykorzystując binarny typ danych PostgreSQL’a bytea, lub też z wykorzystaniem właściwości wielkich obiektów, która pozwala na przechowywanie danych binarnych w oddzielnej tabeli o specjalnym formacie, a odwołania do tych danych odbywają się z wykorzystaniem specjalnej wartości typu OID.
W celu określenia właściwej metody do konkretnego przypadku należy zrozumieć ograniczenia każdej z nich. Typ bytea nie jest dobrze przystosowany do przechowywania bardzo dużych ilości binarnych danych. Kolumna typu bytea może pomieścić dane binarne o rozmiarze nawet 1 GB, jednakże wiąże się to z ogromnym zapotrzebowaniem na pamięć operacyjną RAM. Metoda działająca w oparciu o wielkie obiekty jest dużo lepiej przystosowana do przechowywania bardzo dużych wartości binarnych, jednakże ona także posiada wady. Usunięcie rekordu zawierającego wielki obiekt nie powoduje likwidacji tego obiektu. Likwidacja ta jest oddzielną operacją, która musi zostać wykonana dodatkowo.
Aktualna wersja PostgreSQL 7.2 po raz pierwszy wprowadza sterownik JDBC obsługujący dane typu bytea. Wprowadzenie tej funkcjonalności wiąże się z pewnymi zmianami w stosunku do poprzednich wersji systemu. Obecnie metody: getBytes(), setBytes(), getBinartStream() oraz setBinaryStream() działają na danych typu bytea. W wersji 7.1 metody te działały na typie OID, który był skojarzony z konkretnym wielkim obiektem. Istnieje możliwość przestawienia sterownika na zachowanie znane z poprzedniej wersji.
Istnieje możliwość rozszerzania języka zapytań PostgreSQL SQL poprzez dodawanie:
funkcji,
typów danych,
operatorów,
agregatów.
PostgreSQL jest rozszerzalny ponieważ jego działanie jest sterowane katalogowo (ang. catalog-driven). Standardowe relacyjne systemy baz danych przechowują informacje o bazie, tabelach, kolumnach, itp. w systemie katalogowym. Katalogi są widoczne dla użytkownika jak inne tabele, lecz system zarządzania bazą danych przechowuje w nich swoje wewnętrzne informacje. Jedną z kluczowych różnic pomiędzy systemem PostgreSQL a standardowymi systemami relacyjnymi jest to, że PostgreSQL przechowuje dużo więcej informacji w swoich katalogach. Nie tylko informacje o tabelach i kolumnach, lecz także dane o ich typach, funkcjach, metodach dostępu, itd. Tabele te mogą być modyfikowane przez użytkownika, a skoro PostgreSQL opiera swoje wewnętrzne działanie na tych tabelach, oznacza to iż może być on rozszerzany przez użytkownika. Przez porównanie, konwencjonalne systemy baz danych mogą być rozszerzane tylko przez zmianę wbudowanych w system procedur lub też poprzez ładowanie modułów napisanych specjalnie przez dostawcę systemu.
PostgreSQL w odróżnieniu od innych systemów pozwala na włączanie do serwera kodu pisanego przez użytkownika poprzez dynamiczne ładowanie. Oznacza to, iż użytkownik może określić plik, który implementuje nowy typ lub funkcję, a PostgreSQL włączy je w razie potrzeby. Zdolność modyfikowania działania „w locie” czyni z PostgreSQL’a system bardzo dobrze dostosowany do prototypowania nowych aplikacji i struktur składowania danych.
Częścią definiowania nowego typu jest definicja funkcji opisujących jego zachowanie. W rezultacie, istnieje możliwość zdefiniowania nowej funkcji bez definiowania nowego typu, jednakże działanie odwrotne nie jest możliwe.
PostgreSQL dostarcza cztery rodzaje funkcji:
funkcje języka zapytań (funkcje napisane w języku SQL),
funkcje języka proceduralnego (funkcje napisane w np. PL/Tcl lub PL/pgSQL),
funkcje wewnętrzne,
funkcje języka C.
Każdy rodzaj funkcji może pobierać typ podstawowy, zbiorowy, lub pewną ich kombinację. Dodatkowo, każdy rodzaj funkcji może zwrócić typ podstawowy lub zbiorowy.
Funkcje mogą być przeciążane, czyli może istnieć kilka funkcji o takiej samej nazwie lecz różniących się pobieranymi argumentami.
Istnieją dwa rodzaje typów w systemie PostgreSQL: typy podstawowe i typy zbiorowe. Istnieje możliwość zdefiniowania nowego typu podstawowego.
Typ zdefiniowany przez użytkownika musi zawsze posiadać funkcje wejściową i wyjściową. Określają one reprezentację typu w ciągach znakowych oraz jego organizację w pamięci.
PostgreSQL w pełni obsługuje tablice typów podstawowych. Dodatkowo obsługiwane są także tablice typów zdefiniowanych przez użytkownika. Podczas definiowania nowego typu PostgreSQL automatycznie dodaje obsługę tablic tego typu.
Jaaaakie brednie, normalnie padłem jak to poczytałem, masakra jakaś. Rozumiem, że pisali to studenci, ale w końcu oni zaraz idą do pracy, ja bym się wstydził coś takiego przedstawić.
skomentowano: 2008-10-08 19:02:29 przez: Szymon
Hej,
Moze byś napisał co jest nie tak, a nie masakra, inni by nie chcieli czytac glupot.
skomentowano: 2008-10-13 13:29:53 przez: Wacek
Szymon, buraku mógłbyś napisać co jest nie tak.
skomentowano: 2009-03-19 15:29:41 przez: :/
Szymon pseudospecjalista
skomentowano: 2011-02-10 15:19:54 przez: Maciek
Bardzo trafnie napisane wprowadzenie do PostgreSQL, choć miejscami już trochę przedawnione (jak ten czas szybko leci).
Generalnie trolli internetowych nie powinno się "karmić", na swoim blogu taki komentarz, który nie przedstawia żadnej wartości merytorycznej, a wywołuje nikomu niepotrzebne negatywne emocje po prostu nie dopuszczam na "światło dzienne".
skomentowano: 2011-05-19 04:41:17 przez: Grzesiek Sz.
Copyright © 2008-2010 EPrace oraz autorzy prac.