PostgreSQL

**PostgreSQL** je voľne šíriteľný objektovo-relačný databázový systém (systém riadenia báz dát), uvoľnený pod flexibilnou licenciou BSD. Ponúka alternatívu k ostatným voľne šíriteľným databázovým systémom (ako sú MySQL, Firebird, MaxDB a iné), ako aj k proprietárnym (akými sú napr. Oracle, DB2 od IBM či Microsoft SQL Server). Podľa mnohých databázových odborníkov je v súčasnosti PostgreSQL najvyspelejší a najsofistikovanejší voľne šíriteľný systém riadenia báz dát.

Samotní vývojári čítajú slovo PostgreSQL ako „postgreskjúel“ ().

## História

PostgreSQL prešiel dlhým vývojom, začínajúc ako projekt Ingres na univerzite Berkeley. Vedúci projektu, Michael Stonebraker, odišiel z Berkeley v roku 1982, aby sa pokúsil presadiť Ingres na komerčnom trhu, ale nakoniec sa vrátil na akademickú pôdu. Po návrate do Berkeley v roku 1985 Stonebraker začal projekt post-Ingres, v ktorom chcel riešiť problémy vtedajších databázových systémov, ktoré sa stále vo väčšej miere ukazovali už od začiatku osemdesiatych rokov dvadsiateho storočia. Základy zdrojových kódov projektov Postgres a Ingres sú (a od začiatku boli) úplne oddelené.

Výsledný projekt, pomenovaný ako **Postgres**, mal ako cieľ uviesť za čo najmenšej námahy úplnú podporu pre typy tak, aby bolo možné nielen definovať nové typy, ale aj aby bolo možné plne popísať vzťahy – dovtedy často využívanú schopnosť, ale o ktorú sa musel starať používateľ. V systéme Postgres samotná databáza "chápala" vzťahy a mohla získavať informácie z tabuliek v relácii prirodzeným spôsobom použitím "pravidiel".

Od svojho počiatku v roku 1986 tím napísal mnoho článkov, ktoré popisujú základy systému a v roku 1988 sa podarilo vytvoriť prototyp systému, ktorý bežal a uspokojivo fungoval. Tím uvoľnil verziu 1 malému počtu používateľov v júni 1989, za ktorou nasledovala verzia 2 s nanovo napísaným systémom pravidiel v júni 1990. Verzia 3 z roku 1991 mala opäť prepísaný systém pravidiel, ale súčasne pridala podporu pre viacero správcov ukladania a mala aj zdokonalený procesor dotazov. Už v roku 1993 mal databázový systém Postgres obrovský počet používateľov, ktorých požiadavky začali zaplavovať projekt a ľudí na ňom pracujúcich. Po uvoľnení verzie 4, ktorá bola mienená hlavne ako upratanie, projekt skončil.

Aj keď oficiálne projekt Postgres skončil, licencia BSD, pod ktorou bol uvoľnený, umožňovala vývojárom získať kópie zdrojových kódov a vyvíjať ho ďalej. V roku 1994 dvaja doktorandskí študenti Univerzity Berkeley, Andrew Yu a Jolly Chen, pridali procesor jazyka SQL, ktorým nahradili pôvodný QUEL, čím vytvorili Postgres95. Celý zdrojový kód bol opäť zverejnený na internete. Rok 1996 sa niesol v znamení zmeny mena: z projektu Postgres95 sa stal **PostgreSQL**, čím bol naznačený dôraz v zmene použitého dotazovacieho jazyka.

Prvé uvoľnenie systému PostgreSQL bolo označené verziou 6.0. Odvtedy skupina databázových vývojárov a dobrovoľníkov z celého sveta, komunikujúcich prostredníctvom siete internet, sa stará o tento softvér. Od verzie 6.0 sa objavilo niekoľko ďalších verzií s množstvom rôznych vylepšení; súčasná verzia (august 2004) má označenie 7.4, pričom verzia 8.0 je vo fáze beta testovania.

Napriek tomu, že licencia dovoľuje komercionalizáciu systému Postgres, nikdy sa zdrojový kód nevyvíjal komerčne tak rapídne ako napr. Ingres, čo je prekvapujúci fakt v porovnaní s výhodami, ktoré Postgres ponúka. Najväčší posun nastal, keď Paula Hawthorn (pôvodná členka tímu Ingres, ktorá prešla k Postgres) a Michael Stonebraker založili Illustra Information Technologies na komercionalizáciu systému Postgres.

## Opis

Povrchný pohľad na PostgreSQL môže naznačovať veľkú podobnosť s ostatnými relačnými databázovými systémami. PostgreSQL používa dotazovací jazyk SQL pre výber a modifikáciu údajov. Dáta sú reprezentované ako množina tabuliek, ktoré spájajú cudzie kľúče. Jedna z charakteristík oproti jeho (hlavne voľne šíriteľným) konkurentom je *programovateľnosť*: PostgreSQL umožňuje oveľa jednoduchšiu tvorbu aplikácií z reálneho sveta využívajúcich údaje z databázy.

Relačné databázy ukladajú údaje jednoduchých dátových typov v "plochých tabuľkách", čo vyžaduje, aby používateľ vytvoril takú formu údajov, akú potrebuje, prostredníctvom dotazovacieho jazyka. Toto je v protiklade s tým, ako sa väčšinou údaje používajú hlavne v jazykoch vyššej úrovne s bohatými dátovými typmi (záznamami a objektami).

Konverzia údajov zo sveta relačných databáz do objektovo orientovaného programovania prináša ťažkosti, pretože tieto svety majú veľmi rozdielnu organizáciu dát. Tento problém sa niekedy nazýva ako impedančná nezhoda. Zobrazovanie z jedného modelu do druhého môže neraz zabrať až 40% celého času určeného na vývoj projektu. Na riešenie bolo vyvinutých veľa postupov, ktoré sa typicky označujú ako objektovo-relačné mapovanie, ale väčšina z nich je náročná a má vlastné problémy, čo spôsobuje slabý výkon alebo nutnosť prístupu k údajom z jediného jazyka, ktoré mapovanie podporuje.

PostgreSQL sa vie vysporiadať s mnohými problémami na úrovni databázy. Dovoľuje používateľovi definovať nové typy založené na normálnych SQL typoch, čo dovoľuje databáze používať komplexné dáta. Napríklad, môžete definovať typ `adresa`, ktorý pozostáva z niekoľkých reťazcov, napr. pre číslo ulice, mesto a krajinu. Z tohto pohľadu je možné vytvoriť tabuľku obsahujúcu všetky polia potrebné pre adresu v jednom riadku.

PostgreSQL taktiež dovoľuje využívať dedičnosť typov, jeden z dôležitých konceptov objektovo orientovaného programovania. Napríklad, je možné definovať typ `PSČ` a vzápätí vytvoriť `americké_PSČ` a `slovenské_PSČ`, obe založené na pôvodnom type. Adresy v databáze tak môžu byť bude v americkom alebo slovenskom formáte a špecializované pravidlá sa postarajú o validáciu správnej formy. V skorých verziách PostgreSQL vyžadovala implementácia nových typov písanie kódu v C a jeho následnú kompiláciu a pričlenenie k databázovému serveru, vo verzii 7.4 sa celá procedúra značne zjednodušila a je teraz možné vytvárať nové typy priamo v SQL pomocou `CREATE DOMAIN` príkazu.

Programovanie databázy samotnej je jednoduché prostredníctvom použitia konceptu *funkcíí*. Väčšina SQL systémov dovoľuje používateľom napísať tzv. uložené procedúry, bloky kódu SQL väčšinou predkompilovaných na serveri, ktoré potom môžu volať ostatné SQL príkazy. Ale väčšina používateľov zvyknutých na imperatívne programovacie jazyky (ako sú napr. C/C++, Pascal či Basic) má problémy myslieť a vyjadrovať sa vo vyššom jazyku SQL, zvlášť, keď je potrebné vytvoriť komplexnejšiu logiku.

Programovanie databázy samotnej môže veľmi profitovať z používania funkcií. Väčšina SQL systémov povoľuje uživateľom písať uloženú procedúru, blok SQL kódu, ktorý môžu volať ostatné SQL údaje. Žial SQL ostáva nevhodné ako programovací jazyk a programátori používajúci SQL môžu naraziť na ťažkosti pri vytváraní komplexnej logiky. A čo je horšie, SQL ako také, nepodporuje veľa základných operácií ako napríklad vetvenie, alebo slučkovanie. Namiesto toho, si každý predajca pridal svoje vlastné rozšírenia pre jazyk SQL, aby umožnili tieto operácie. Tieto rozšírenia však nemusia v zásade fungovať na všetkých databázových platformách.

V PostgreSQL, môžu programátori vytvárať takúto logiku v hociktorom z veľkého výberu podporovaných jazykov.
* Vstavaný jazyk nazývaný PL/PgSQL sa podobá na Oraclov jazyk uložených procedúr PL/SQL a je veľmi užitočný pri zaoberaní sa with query-intensive procedures.
* Wrappers pre populárne skriptovacie jazyky ako napr. Perl, Python, Tcl a Ruby umožňujú využiť ich schopnosti v spracúvaní reťazcov a v priraďovaní k rozsiahlym knižniciam externých funkcií.
* Procedúry vyžadujúce vysoký výkon poskytovaný kompilovaním komplexnej logiky do strojového kódu môžu využiť C alebo C++.
* Na druhej strane, obslužný program pre R štatistický jazyk umožňuje databázovým blokom využívať jeho širokú škálu štatistických funkcií.

Programátor môže takto vložiť kód na server ako funkciu, malý wrapper ktorý spôsobí, že kód bude pripomínať uloženú procedúru. Takto môže SQL volať C kód a naopak. Výkon sa tak zvyšuje, lebo databázový engine vyvoláva všetku logiku naraz na jednom mieste a tým zmenšuje počet interakcií medzi klientom a servrom. Spoľahlivosť je taktiež vylepšená vďaka centralizácií kódu na preskúšanie (potvrdenie) dát na jednom mieste na serveri, bez spoliehania sa na synchronizáciu logík vo viacerých klientských aplikáciách, prípadne viacerých programovacích jazykoch. Pridávaním užitočných výňatkov kódu na server, sa môže klientský kód výrazne skrátiť a zjednodušiť.

Tieto výhody prispievajú k skutočnosti, že PostgreSQL je bezpochyby najvyspelejší databázový systém z programovacieho hľadiska, čo vysvetľuje aj úspech Illustry. Používanie PostgreSQL môže dramaticky skrátiť programovací čas pri mnohých projektoch, pričom jeho výhody stúpajú, so zložitosťou projektu.

## Funkcie

Niektoré funkcie PostgreSQL zriedka nájdené v iných relačných databázach obsahujú:

* Uživateľom definované typy
* Uživateľom definované operátory
* Dostupnosť viacerých uložených procedúr jazykov, vrátane C, SQL, Perl, Python, Tcl, Ruby, Parrot, shell script, alebo vlastný PL/PgSQL
* Podpora pre geografické objekty cez PostGIS
* Správa súbežnosti cez Multi-Version Concurrency Control (MVCC) dizajn, ktorá zaručuje výborný výkon aj za podmienok silno zbiehavého prístupu
* Tabulková dedičnosť
* Pravidlá – spôsob implementácie logiky na serveri, ktorý umožňuje aplikačnému vývojárovi modifikovať strom prichádzajúceho dotazu
* Výrazové indexy – indexy vytvorené na výsledku výrazov (a nie iba na hodnoty jedného stĺpca)
* Čiastočné indexy – indexy vytvorené iba na časť tabuľky. Takéto indexy znižujú náročnosť na diskový priestor a zvyšujú výkonnosť v prípadoch, keď iba časť tabuľky vyžaduje index.

Navyše PostgreSQL podpruje takmer všetky konštrukcie, ktoré sa očakávajú od veľkej podnikovej databázy, vrátane:

* Referenčnej integrity vrátane cudzích kľúčov, stĺpcových ohraničení a row checkov,
* Spúšťače (triggery)
* Pohľady
* Vonkajšie spojenia
* Vnorené selecty
* Transakcie
* Silnú kompatibilitu so štandardmi (SQL92, SQL1999)
* Zakódované pripojenia cez SSL
* Uloženie veľkých binárnych a textových objektov
* Online zálohovanie
* Domény

## Nedostatky

Nedostatky PostgreSQL môžeme zjednodušene zhrnúť do týchto bodov:
* nedostatok niektorých pokročilých funkcií
* formálne črty, ktoré majú nežiaduce vedľajšie účinky

PostgreSQL napríklad nemá dostatočne doriešenú replikáciu. Existujú však externé balíčky, ktoré tento problém riešia. Túto funkciu využívajú systémy v prípadoch, že jeden databázový server nezvláda zadanú úlohu, alebo keď je potrebné minimalizovať čas spracúvania.

Zistené menej dôležité nedostatky zahŕňajú point-in-time obnovu a včlenené transakcie. (PostgreSQL 8.0 bude už obsahovať podporu pre point-in-time obnovu a včlenené transakcie)

PostgreSQL momentálne chýba schopnosť automaticky vyvodzovať smernice na vytváranie views support aktualizácií. Zatial si vývojári musia tieto smernice písať sami.

V druhej skupine problémov by sme mali spomenúť nutnosť pravidelného vysávania (en. VACUUMing). Kvôli MVCC, keď nejaká transakcia aktualizuje, alebo vymaže riadok, stará verzia toho riadku ostáva v databáze, keďže iná transakcia môže z neho stále potrebovať dáta, prípadne sa k nej transakcia zodpovedná za zmeny bude potrebovať vrátiť. Toto ponúka výhodu v tom, že databáza zvyčajne nepotrebuje uzamykať celé riadky, aj keď jedna transakcia môže potrebovať permanentný náhľad na stav databázy a iné postupne aktualizujú dátá. Proces VACUUMing-u označuje tie dáta, ktoré DBMS určite už nepotrebuje. Staré verzie PostgreSQL potrebovali uzamknutie bloku (matice) (table) aby mohlo dôjsť k VACUUMing-u, no novšie verzie môžu túto funkciu vykonávať súčasne s normálnym prístupom do databázy, čo výrazne znižuje dopad VACUUMing-u na iné aktivity databázy. Treba však povedať, že je dobré plánovať VACUUMing na dobu, keď je databáza využívaná menej. Pri nepravidelnom VACUUMing-u môže nastať problém s prílišným zapĺňaním miesta na disku (keďže staré verzie riadkov nemôžu byť znovu použité, kým neprebehne proces VACUUMing-u) a úpadkom výkonu (pretože procesy musia preskakovať staré verzie riadkov pri výkone úlohy). A k tomu všetkému, celá databáza musí podstúpiť proces VACUUMing-u aspoň raz za každú miliardu transakcií, lebo ináč nebudú môcť bežať žiadne nové transakcie.

Štandardné súhrnné (sčítacie) funkcie, ako je COUNT si vedú veľmi zle v porovnaní s inými databázovými systémami v prípadoch kedy query zhŕňa (sčítava) celú maticu. Konkrétne, niektoré databázy efektívne využijú indexy, alebo systémové metadáta pre spracovanie požiadavky ako SELECT COUNT (*) FROM table. Keďže indexové záznamy neobsahujú MVCC informácie, PostgreSQL nemôže zvýšiť výkon jednoduchým prečítaním indexu. Musí preskúmať všetky dvojice, aby určil, ktorá je viditeľná pre práve bežiacu transakciu.

Takisto existuje značný dopyt po vlastnom porte pre Microsoft Windows. PostgreSQL síce už môže bežať pod Windowsom za použitia Cygwin Unix emulačnej knižnice, ale ponúka nižší ako optimálny výkon a vyžaduje komplikovanú inštaláciu. Verzia 8.0, momentálne len beta verzia, už však obsahuje vlastný Win32 port.

## Referencie

## Pozri aj
* MySQL
* Databáza
* Databázový systém

## Externé odkazy
* PostgreSQL Website
* PostgreSQL Documentation
* Annotated postgresql.conf and Global User Configuration (GUC) Guide 
* PostgreSQL vs MySQL: Which is better?  by Ian Gilfillan
* Open Source Databases: As The Tables Turn  by Tim Perdue
* PostgreSQL and XML 

Kategória:Databázové systémy
Kategória:Slobodný softvér