# PostgreSQL

PostgreSQL (pronuncia all'inglese Pronuncia, 5,6 kB MP3) è un completo DBMS ad oggetti pubblicato con licenza libera (stile Licenza BSD). Spesso abbreviato come "Postgres", sebbene questo sia un nome vecchio dello stesso progetto, è una reale alternativa sia rispetto ad altri prodotti liberi come MySQL, Firebird SQL e MaxDB che a quelli a codice chiuso come Oracle, IBM Informix o DB2 ed offre caratteristiche uniche nel suo genere che lo pongono per alcuni aspetti all'avanguardia nel settore delle basi di dati.

## Storia

Inizialmente il DBMS si chiamava INGRES ed era un progetto della Università di Berkeley. Nel 1982 il capo progetto, Michael Stonebraker, lasciò la Berkeley per commercializzare il prodotto, ma in seguito tornò nel contesto accademico. Nel 1985 lasciò nuovamente l'università per dare vita a un progetto post-Ingres (che prese il nome di Postgres) che superasse gli evidenti limiti dei prodotti concorrenti dell'epoca. Le basi dei sorgenti di Ingres e di Postgres erano, e sono rimaste nel tempo, ben distinte.
Il nuovo progetto puntava a fornire un supporto completo ai tipi di dati, in particolare la possibilità di definire nuovi tipi di dati, UDF (User Defined Function), User Defined Types. Vi era anche la possibilità di descrivere la relazione tra le entità (tabelle), che fino ad allora veniva lasciata completamente all'utente. Perciò non solo Postgres preservava l'integrità dei dati, ma era in grado di leggere informazioni da tabelle relazionate in modo naturale, seguendo le regole definite dall'utente.
Dal 1986 gli sviluppatori diffusero un gran numero di articoli che descrivevano il nuovo sistema e nel 1988 venne pubblicato un primo prototipo funzionante. La versione 1 venne pubblicata nel giugno del 1989 per un numero di utenti contenuto. Seguì una versione 2 nel giugno del 1990, in cui il sistema delle regole venne completamente riscritto. Nella versione 3, del 1991, questo sistema venne riscritto ancora, ma venne aggiunto anche il supporto a gestori multipli di immagazzinamento dei dati e un motore di query migliorato. Nel 1993 vi era già un numero di utenti notevole che inondava il team di sviluppo con richieste di supporto e di nuove caratteristiche. Dopo aver pubblicato la versione 4, che fu principalmente un ripulimento del codice, il progetto terminò.
Sebbene il progetto Postgres fosse ufficialmente abbandonato, la licenza BSD dava modo agli sviluppatori Open Source di ottenere una copia del software per poi migliorarlo a loro discrezione. Nel 1994 due studenti del Berkeley, Andrew Yu e Jolly Chen aggiunsero a Postgres un interprete SQL per rimpiazzare il vecchio QUEL che risaliva ai tempi di Ingres. Il nuovo software venne quindi pubblicato sul web col nome di Postgres95. Nel 1996 cambiò nome di nuovo: per evidenziare il supporto al linguaggio SQL, venne chiamato PostgreSQL.
La prima pubblicazione di PostgreSQL è stata la versione 6. Da allora ad occuparsi del progetto è una comunità di sviluppatori volontari provenienti da tutto il mondo che si coordina attraverso Internet. Alla versione 6 ne sono seguite altre, ognuna delle quali ha portato nuovi miglioramenti. Nel gennaio 2005 è stata pubblicata la 8, la prima nativa per Windows.
Sebbene la licenza permetta la commercializzazione del software, il codice di Postgres non è stato sviluppato commercialmente con la stessa rapidità di Ingres. Ad un certo punto, però, Paula Hawthorn (membro originale del team di Ingres) e Michael Stonebraker formarono una società chiamata Illustra Information Technologies per commercializzarlo.

## Descrizione

Un rapido esame di PostgreSQL potrebbe suggerire che sia simile alle altre basi di dati. PostgreSQL usa il linguaggio SQL per eseguire delle query sui dati. Questi sono conservati come una serie di tabelle con chiavi esterne che servono a collegare i dati correlati. La programmabilità di PostgreSQL è il suo principale punto di forza ed il principale vantaggio verso i suoi concorrenti: PostgreSQL rende più semplice costruire applicazioni per il mondo reale, utilizzando i dati prelevati dalla base di dati.
Le basi di dati SQL conservano dati semplici in "flat table", richiedendo che sia l'utente a prelevare e raggruppare le informazioni correlate utilizzando le query. Questo contrasta con il modo in cui sia le applicazioni che gli utenti utilizzano i dati: come ad esempio in un linguaggio di alto livello con tipi di dato complessi dove tutti i dati correlati operano come elementi completi, normalmente definiti oggetti o record (in base al linguaggio).
La conversione delle informazioni dal mondo SQL a quello della programmazione orientata agli oggetti, presenta difficoltà dovute principalmente al fatto che i due mondi utilizzano differenti modelli di organizzazione dei dati. L'industria chiama questo problema "impedance mismatch" (conflitto di impedenza): mappare i dati da un modello all'altro può assorbire fino al 40% del tempo di sviluppo di un progetto. Un certo numero di soluzioni di mappatura, normalmente dette "object-relational mapping", possono risolvere il problema, ma tendono ad essere costose e ad avere i loro problemi, causando scarse prestazioni o forzando tutti gli accessi ai dati ad aver luogo attraverso il solo linguaggio che supporta la mappatura stessa.
PostgreSQL può risolvere molti di questi problemi direttamente nella base di dati. PostgreSQL permette agli utenti di definire nuovi tipi basati sui normali tipi di dato SQL, permettendo alla base di dati stessa di comprendere dati complessi. Per esempio, si può definire un indirizzo come un insieme di diverse stringhe di testo per rappresentare il numero civico, la città, ecc. Da qui in poi si possono creare facilmente tabelle che contengono tutti i campi necessari a memorizzare un indirizzo con una sola linea di codice.
PostgreSQL, inoltre, permette l'ereditarietà dei tipi, uno dei principali concetti della programmazione orientata agli oggetti. Ad esempio, si può definire un tipo codice_postale, quindi creare un tipo cap (codice di avviamento postale) o un tipo us_zip_code basato su di esso. Gli indirizzi nella base di dati potrebbero quindi accettare entrambi i tipi, e regole specifiche potrebbero validare i dati in entrambi i casi. Nelle prime versioni di PostgreSQL, implementare nuovi tipi richiedeva scrivere estensioni in C e compilarle nel server della base di dati. Dalla versione 7.4 è diventato molto più semplice creare ed usare tipi personalizzati attraverso il comando "CREATE DOMAIN".
La programmazione della base di dati stessa può ottenere grandi vantaggi dall'uso delle funzioni. La maggior parte dei sistemi SQL permette agli utenti di scrivere una procedura, un blocco di codice SQL che le altre istruzioni SQL possono richiamare. Comunque il SQL stesso rimane inadatto come linguaggio di programmazione, pertanto gli utenti possono sperimentare grandi difficoltà nel costruire logiche complesse. Ancora peggio, il SQL stesso non supporta molti dei principali operatori di base dei linguaggi di programmazione, come le strutture di controllo di ciclo e condizionale. Pertanto ogni venditore ha scritto le sue estensioni al linguaggio SQL per aggiungere queste caratteristiche, e pertanto queste estensioni non per forza operano su diverse piattaforme di basi di dati.
In PostgreSQL i programmatori possono implementare la logica in uno dei molti linguaggi supportati.
* Un linguaggio nativo chiamato PL/pgSQL simile al linguaggio procedurale di Oracle PL/SQL, che offre particolari vantaggi nelle procedure che fanno uso intensivo di query.
* Wrapper per i più diffusi linguaggi di scripting come Perl, Python, Tcl, e Ruby che permettono di utilizzare la loro potenza nella manipolazione delle stringhe e nel link ad estese librerie di funzioni esterne.
* Le procedure che richiedono prestazioni maggiori e logiche di programmazione complesse possono utilizzare il C ed il C++.
* Inoltre è disponibile anche un interfacciamento al linguaggio R, ricco di funzioni statistiche e per il calcolo matriciale.
Il programmatore può inserire il codice sul server come funzioni, che rendono il codice riusabile come stored procedure, in modo che il codice SQL possa richiamare funzioni scritte in altri linguaggi (come il C o il Perl).
Punti di forza della programmabilità di PostgreSQL:
* Incremento delle prestazioni, in quanto la logica viene applicata direttamente dal server della base di dati in una volta, riducendo il passaggio di informazioni tra il client ed il server.
* Incremento dell'affidabilità, dovuto alla centralizzazione del codice di controllo sul server, non dovendo gestire la sincronizzazione della logica tra molteplici client e i dati memorizzati sul server.
* Inserendo livelli di astrazione dei dati direttamente sul server, il codice del client può essere più snello e semplice.
Questi vantaggi fanno di PostgreSQL, probabilmente, il più avanzato sistema base di dati dal punto di vista della programmabilità, il che aiuta a spiegarne il successo. Utilizzare PostgreSQL può ridurre il tempo totale di programmazione di molti progetti, con i vantaggi suddetti che crescono con la complessità del progetto stesso, ovviamente se utilizzato da utenti esperti nel suo utilizzo.

## Indici

Supporta gli indici GiST e GIN (Indice generalizzato invertito) usa B+-tree, hash. Si possono creare indici di espressioni con un indice del risultato di un'espressione o una funzione anziché il semplice valore di una colonna, indici parziali dove si indicizza parte di una tabella con l'espressione SQL: CREATE INDEX. È anche in grado di usare indici multipli insieme per eseguire interrogazioni complesse.

## Schemi

In PostgreSQL, tutti gli oggetti (con l'eccezione di ruoli e tablespace) sono situati in uno schema. Esso agisce effettivamente come un namespace, permettendo agli oggetti con lo stesso nome di coesistere nella stessa base di dati. Gli schemi sono analoghi alle cartelle nel sistema dei file, ad eccezione che non possono essere una dentro l'altra, e non è possibile creare collegamenti simbolici che puntano ad un altro schema o oggetto.
Le basi di dati sono create in modo predefinito con lo schema "public" (comune), ma può essere aggiunto qualsiasi altro schema addizionale e il public non è obbligatorio.
Un "percorso di ricerca" determina l'ordine in quale schema sono controllati gli oggetti non qualificati (quelli senza uno schema prefissato) che possono essere configurati sulla base di dati o sul livello di ruolo. Il "percorso di ricerca" contiene in modo predefinito il nome di schema speciale di "$user" (utente) che prima cerca uno schema con nome dell'utente connesso alla base di dati. Se non viene trovato procede a cercare il prossimo schema.

### Tipi di dati

Sono inclusi nativamente una grande varietà di tipi di dati:
* Booleani
* numerici con precisione arbitraria
* Caratteri (testo, varchar, char)
* Binari
* Data/ora (timestamp/time con/senza fusi orari, date, interval)
* Money
* Enum
* Bit strings
* Text search type
* Composite
* Arrays (lunghezza variabile e qualsiasi tipo di dato, incluso text e tipi composti) fino a 1GB.
* Primitive geometriche
* Indirizzi IPv4 e IPv6
* Blocchi CIDR e Indirizzi MAC
* XML che supporta interrogazioni XPath (dalla 8.3)
* UUID (dalla 8.3)
* JSON (dalla 9.2)

## MVCC

PostgreSQL gestisce la concorrenza attraverso un sistema conosciuto come controllo della concorrenza multiversione (MVCC) che dà ad ogni transazione un'"immagine" della base di dati, permettendo cambiamenti non visibili ad altre transazioni fino a che questi non sono eseguiti. Ciò permette di eliminare quasi sempre il bisogno di ricorrere all'utilizzo di lock di lettura (read locks) e assicura il mantenimento dei principi ACID in maniera efficiente.

## Programmi di gestione a interfaccia grafica

* phpPgAdmin – è un'applicazione PHP libera che consente di amministrare in modo semplificato, con un'interfaccia grafica basata sul web, base di dati di PostgreSQL
* pgAdmin – è un'applicazione multipiattaforma, scritta in C++, che consente di amministrare in modo semplificato, con un'interfaccia grafica, base di dati di PostgreSQL.