PostgreSQL

***PostgreSQL***, bieži saukta arī vienkārši par ***Postgres***, ir bezmaksas atvērtā pirmkoda objektu relāciju datubāzes pārvaldības sistēma (DBVS).

Ir implementācijas šādām platformām: *[[Linux]], Solaris / OpenSolaris, Win32, Win x86-64, [[Mac OS X]], FreeBSD, QNX 4,25, QNX 6*.

## Standartu atbalsts, iespējas un īpatnības

PostgreSQL pamatā ir SQL valoda, un tā atbalsta daudzas funkcijas un iespējas no SQL2003 standarta (ISO / IEC 9075).

PostgreSQL 8.4.0 versijai ir šādi ierobežojumi:

 

PostgreSQL stiprās puses ir:

* Atbalsts praktiski neierobežotu datubāzes lielumu;
* Jaudīgs un uzticams transakciju un replikāciju mehānisms;
* Paplašināts programmēšanas valodu atbalsts: standarta versija atbalsta PL / pgSQL, PL / Perl, PL / Python un PL / Tcl, turklāt papildus var izmantot PL / Java, PL / PHP, PL / Py, PL / R, PL / Ruby, PL/Scheme, un PL / sh, kā arī ir C savietojamu moduļu atbalsts;
* Viegla paplašināšana.

## Vēsture
PostgreSQL ir nekomerciālās DBVS Postgres pēctecis, un ir izstrādāta Kalifornijas universitātē Berklijā. Postgres izstrādāšanā, kas sākās 1986.gadā, iesaistījās arī Michael Stonebraker, kas bija daudz agrāka projekta Ingres vadītājs. Nosaukums «Postgres» tiek atšifrēts kā «Post Ingres», attiecīgi, izstrādājot Postgres tika izmantotas jau agrāk izveidotas iestrādnes.

Stonebraker un viņa studenti izstrādāja šo jauno datu bāzu vadības sistēmu (DBVS) astoņus gadus (1986-1994.g.). Šajā laikā tā sintaksē tika ieviestas procedūras, noteikumi, lietotāja tipi un daudzas citas komponentes. Darbs nebija veltīgs – 1995.gadā izstrādne tika sadalīta vēlreiz: Stonebraker izmantoja iegūto pieredzi veidojot komerciālu DBVS Illustra, bet viņa studenti izstrādāja jaunu Postgres versiju - Postgres95, kurā vaicājumvaloda POSTQUEL - mantojums no Ingres - tika aizstāta ar SQL.

Tajā laikā Postgres95 tika izplatīta ārpus universitātes telpām un nodota entuziastu komandai. No tā laika šai DBVS tika piešķirts vārds, ar kuru mēs to pazīstam arī šobrīd – PostgreSQL.

## Galvenās iespējas
### Funkcijas
Funkcijas ir kodu bloki, kas darbojas uz servera, nevis klientu datu bāzē. Lai gan tās var būt rakstītas tīrā SQL valodā, papildu loģikas realizēšanai, piemēram, nosacītas pārejas un cilpas, ir nepieciešams iziet ārpus SQL valodas iespējām un tāpēc nepieciešams izmantot dažu valodu paplašinājumus. Funkcijas var rakstīt, izmantojot vienu no šādām valodām:

* Iebūvēto procedūru valodu PL / pgSQL, vai PL / SQL;
* Skriptu valodas - PL / Lua, PL / LOLCODE, PL / Perl, plPHP, PL / Python, PL / Ruby, PL / sh, PL / Tcl un PL / Scheme;
* Klasiskās valodas - C, C++, Java (caur PL / Java moduli);
* Statistikas valodu R (izmantojot PL / R moduli).

PostgreSQL ļauj izmantot funkciju, kas atgriež ierakstu kopu, kas pēc tam var tikt izmantota tādā pašā veidā, kā parasta pieprasījuma rezultāti.

Funkcijas var izpildīt gan ar tās radītāja privilēģijām, gan arī ar pašreizējā lietotāja tiesībām.

### Trigeri
Trigeri tiek definēti kā funkcijas, kas tiek iniciētas ar DBL operācijām. Piemēram, INSERT darbība var palaist trigeri, kurš pārbauda pievienotā ieraksta atbilstību noteiktiem nosacījumiem. Rakstot funkcijas var tikt izmantotas dažādas programmēšanas valodas (sk. iepriekš).

Trigeri ir saistīts ar tabulām. Daudzi trigeri tiek izpildīti alfabētiskā secībā.

### Noteikumi
Noteikumu mehānisms, ir mehānisms, kas tiek izmantots ne tikai lietotāju apstrādei BDL operācijās, bet arī atlases darbībās. Galvenā atšķirība no trigeru mehānisma ir tā, ka noteikumi nostrādā vaicājumu analizēšanas stadijā, pirms izvēlētās optimālās plāna izpildes un īstenošanas procesa. 

### Indeksi
PostgreSQL ir atbalsts šāda veida indeksiem: B-tree, hash, R-koks, GIST, GIN. Ja nepieciešams, ir iespējams izveidot jauna veida indeksus. PostgreSQL indeksiem ir šādas īpašības:

* Iespēja apskatīt indeksu, ne tikai tiešā, bet arī apgrieztā secībā – nav nepieciešams izveidot atsevišķu indeksu ORDER BY ... DESC konstrukcijas darbībai;
* Iespēja radīt indeksu par vairākām tabulas kolonnām, tostarp par dažādu datu tipu kolonnām;
* Indeksi var būt funkcionāli, kas ir balstīta nevis uz vērtību kopu no tabulām, bet pamatojoties uz vērtību kopu no funkciju vērtību kopas;
* Indeksi var būt daļēji, kas balstās tikai uz tabulas atsevišķu daļu, dažos gadījumos tas palīdz radīt daudz kompaktākus indeksus vai panākt labāku veiktspēju, izmantojot dažāda veida indeksus dažādām tabulas daļām;
* Pieprasījumu plānotājs var izmantot vairākus indeksus vienlaicīgi, lai veiktu sarežģītus vaicājumus.

### Daudzversiju atbalsts
PostgreSQL atbalsta vienlaicīgu vairāku lietotāju datubāzes modifikāciju, izmantojot Multiversion Concurrency Control mehānismu. Pateicoties tam, tas atbilst ACID prasībām, un praktiski novērš nepieciešamību bloķēt datubāzes lasīšanas iespējas. 

### Datu tipi
PostgreSQL atbalsta ļoti daudzus iebūvētos datu tipus:
* Skaitļu tipi:
** Veselie
** Ar fiksēto punktu
** Ar peldošo punktu
** Naudas tips (atšķiras ar īpašu izvades formātu, bet citādi līdzīgi fiksēta punkta skaitlim ar divām zīmēm aiz komata)
** Simboliskais tips ar patvaļīgu garumu
** Binārais tips (ieskaitot BLOB)
** "Datums / Laiks" tips (pilnībā atbalsta dažādus formātus, precizitāti, izvades formātus, ieskaitot nesenās izmaiņas laika zonās)
** Boolean tips
** Uzskaitījums
** Ģeometriskās primitīvas
* Tīklu tipi:
** IP un Ipv6 adreses
** CIDR formāts
** MAC adreses
* UUID identifikators
* XML dati
* Masīvi
* OID tips
* Pseidotips

Bez tam, lietotājs var pats radīt jaunus tipus un programmēt tam indeksēšanas mehānismu ar GIST palīdzību.

### Lietotāju objekti
PostgreSQL var tikt papildināts lietotāja vajadzībām gandrīz jebkurā aspektā. Ir iespējams pievienot savu:

* Tipu pārveidošanu
* Datu tipu
* Domēnu (lietotāja definētus tipus ar sākotnēji noteiktiem ierobežojumiem)
* Funkcijas
* indeksus
* Operatorus (ieskaitot jau esošo pārdefinēšanu)
* Procedūru valodas 

### Pārmantojamība
Tabulas var pārmantot citu tabulu īpašības un laukus. Turklāt dati, kas pievienoti radot jauno tabulu, automātiski piedalīsies (ja nav norādīts citādi) vaicājumos.

Šī funkcija ir pašreiz nav pilnībā pabeigta. Tomēr tā ir pieejama praktiskai izmantošanai.

## Citas iespējas
* ACID principu ievērošana.
* Atbilstība ANSI SQL-92 un SQL-99 standartiem.
* Atbalsta vaicājumus OUTER JOIN, UNION, UNION ALL, EXCEPT, INTERSECT, un apakš vaicājumus.
* Secīgums.
* Viengabalainības kontrole.
* Replicēšana.
* Kopējie tabulu un rekursīvie vaicājumi.
* Analītiskās funkcijas.
* Unicode (UTF-8) atbalsts.
* Perl atbalsts.
* Iebūvētais SSL un Kerberos atbalsts.
* Atsevišķi ielādējamie paplašinājumi, kas atbalsta SHA1, MD5, XML un citas funkcionalitātes.
* SQL koda importēšana un eksportēšana.

## Uzticamība
Saskaņā ar dažādu automatizētu programmatūru testiem uz kļūdu rašanos PostgreSQL pirmkodā konstatēja 20 problemātiskās vietas uz 775 000 koda rindām (vidēji viena kļūda uz 39 000 koda rindiņām). Salīdzinājumam: MySQL - 97 problemātiskās vietas, viena kļūda uz 4000 koda rindiņām, FreeBSD - 306 problēmas, viena kļūda uz 4000 koda rindiņām, Linux (kodols) - 950 problēmas, viena kļūda uz 10 000 koda rindiņām.

## Paplašināšana
Pamatojoties uz PostgreSQL datu bāzi, EnterpriseDB kompānija izveidoja jaudīgākas šīs datu bāzu vadības sistēmas versijas, kurus par maksu var izmantot komerciālām vajadzībām - Postgres Plus un Postgres Plus Advanced Server. Komplektā tika iekļauts arī komplekts izstrādātājiem:

* Postgres Studio - spēcīgs pgAdmin analogs;
* Postgres Plus Debugger - atkļūdotājs PL / pgSQL kodam;
* Migration Studio - līdzeklis, lai automātiski konvertētu datubāzes no MySQL / Oracle uz PostgreSQL.

## Turpmākā attīstība
9.0 .* versijai plānots datubāzes vadības sistēmā ieviest šādas funkcijas:

* Savienojumi ar ārējiem SQL / MED datu avotiem (Management of External Data).
* Piekļuve tikai indeksiem.
* Anonīmie bloki jebkurā pieejamajā glabāto procedūru valodā.
* Atlikti unikalitātes ierobežojumi.
* Vienkāršāka sintakse, lai sadalītu tabulu daļās.
* Pieprasījumu plāns JSON un XML formā.
* Trigeri, kas nostrādā, atjauninot noteiktas tabulas kolonas.

## Piezīmes