# PostgreSQL

PostgreSQL és un programari lliure que implementa un sistema de gestió de bases de dades relacional, distribuït amb la llicència PostgreSQL License.
Ofereix una alternativa a altres sistemes de gestió de base de dades (com ara MySQL, Firebird, i MaxDB), i de sistemes de programari propietari com Oracle, Sybase, DB2 d'IBM i Microsoft SQL Server.
PostgreSQL no té un sistema de seguiment d'errors, el que fa bastant difícil saber l'estat dels errors.

## Nom del producte

L'ús de caràcters en majúscula en el nom PostgreSQL pot confondre a algunes persones a primera vista. Les diferents pronunciacions de "SQL" poden portar a confusió. Els desenvolupadors de PostgreSQL ho pronuncien (en anglès) /ˈpoʊstɡrɛs ˌkjuː ˈɛl/, és a dir, Postgres cu ela. És també comú referir-s'hi com a simplement "Postgres", el que fou el seu nom original. A causa del seu suport de l'estàndard SQL, comú entre la major part de bases de dades relacionals, la comunitat va considerar canviar el nom a l'anterior Postgres. No obstant això, el PostgreSQL Core Team va anunciar en 2007 que el producte seguiria dient-se PostgreSQL. El nom fa referència als orígens del projecte com la base de dades "post-Ingres", i els autors originals també van desenvolupar la base de dades Ingres.

## Història

PostgreSQL ha tingut una llarga evolució, la qual s'inicià el 1982 amb el projecte Ingres a la Universitat de Berkeley. Aquest projecte, liderat per Michael Stonebraker, va ser un dels primers intents d'implementar un motor de base de dades relacional. Després d'haver treballat força temps desenvolupant l'Ingres i d'haver-hi tingut una experiència comercial, Michael va decidir tornar a la Universitat el 1985 per treballar en un nou projecte basat en l'experiència d'Ingres. Aquest projecte va ser anomenat post-ingres o simplement POSTGRES.
El projecte post-ingres pretenia resoldre els problemes amb el model de base de dades relacional que havien estat aclarits al començament dels anys 1980. El principal d'aquests problemes era la incapacitat del model relacional de comprendre "tipus", és a dir, combinacions de dades simples que conformen una única unitat. Actualment, i quan s'hi afegeixen mètodes que n'encapsulen la funcionalitat, s'anomenen objectes. Es van esforçar a introduir la menor quantitat possible de funcionalitats per completar el suport de tipus. Aquestes funcionalitats incloïen l'habilitat de definir tipus, però també l'habilitat de descriure relacions - les quals fins a aquest moment eren àmpliament utilitzades però mantingudes completament per l'usuari. A Postgres la base de dades «comprenia» les relacions i podia obtenir informació de taules relacionades utilitzant regles. Postgres va usar moltes idees d'Ingres però no el seu codi.
La següent llista mostra les fites més importants en la vida del projecte Postgres.
* 1986: es van publicar diversos papers que descrivien les bases del sistema.
* 1988: ja es comptava amb una versió utilitzable.
* 1989: el grup publicava la versió 1 per a una petita comunitat d'usuaris.
* 1990: es publicava la versió 2 la qual tenia pràcticament reescrit el sistema de regles.
* 1991: publicació de la versió 3, aquesta afegia la capacitat de múltiples motors d'emmagatzematge.
* 1993: creixement important de la comunitat d'usuaris, la qual demandava més característiques.
* 1994: després de la publicació de la versió 4, el projecte va acabar i el grup es va dissoldre.
Després que el projecte POSTGRES acabés, dos graduats de la universitat, Andrew Yu i Jolly Chen, van començar a treballar sobre el codi de POSTGRES, això va ser possible atès que POSTGRES estava llicenciat sota la BSD, i el primer que van fer va ser afegir suport per al llenguatge SQL a POSTGRES, atès que anteriorment comptava amb un intèrpret del llenguatge de consultes QUEL (basat en Ingres), creant així el sistema al qual van anominar Postgres95.
Cap al 1996 es van unir al projecte persones alienes a la Universitat com Marc Fournier de Hub.Org Networking Services, Bruce Momjian i Vadim B. Mikheev els quals van proporcionar el primer servidor de desenvolupament no universitari per a l'esforç de desenvolupament de codi obert i van començar a treballar per tal d'estabilitzar el codi de Postgres95.
L'any 1996 van decidir canviar el nom de Postgres95 de tal manera que reflectís la característica del llenguatge SQL i van acabar anomenant-lo PostgreSQL, la primera versió del qual de codi obert va ser publicada el 8 de juliol de 1996. La primera versió formal de PostgreSQL (6.0) va ser publicada el gener de 1997. Des de llavors, molts desenvolupadors entusiastes dels motors de base de dades s'han unit al projecte, s'han coordinat via Internet i entre tots han anat incorporant moltes característiques al motor.
Tot i que la llicència permetia la comercialització de PostgreSQL, el codi no es va desenvolupar en principi amb finalitats comercials; cosa sorprenent considerant els avantatges que oferia. La principal derivació es va originar quan Paula Hawthtorn (un membre de l'equip original d'Ingres que es va passar a Postgres) i Michael Stonebraker van fundar Illustra Information Technologies per comercialitzar Postgres.
El 2000, ex inversors de Red Hat van crear l'empresa Great Bridge per a comercialitzar PostgreSQL i competir contra proveïdors comercials de bases de dades. Great Bridge va afavorir a diversos desenvolupadors de PostgreSQL i va fer, en contrapartida, donació de recursos a la comunitat. No obstant això, a finals de 2001 va tancar a causa de la dura competència d'empreses com a Red Hat i les difícils condicions del mercat.
El 2001, Command Prompt, Inc. va publicar Mammonth PostgreSQL, la més antiga distribució comercial de PostgreSQL. Continua donant suport a la comunitat PostgreSQL a través del patrocini de desenvolupadors i projectes, incloent-hi PL/Perl, PL/php i l'allotjament de projectes de comunitats com PostgreSQL Build Farm.
El gener de 2005, PostgreSQL va rebre suport del proveïdor de base de dades Pervasive Software, conegut pel seu producte Btrieve que es feia servir a la plataforma Novell Netware, Pervasive va anunciar suport comercial i participació comunitària i va aconseguir una mica d'èxit. No obstant això, al juliol de 2006 va deixar el mercat de suport de PostgreSQL.
A mitjan 2005 dues companyies més van anunciar plans per comercialitzar PostgreSQL, fent èmfasi en nínxols separats de mercats. EnterpriseDB va afegir funcionalitats que permetien que les aplicacions escrites per treballar amb Oracle fossin fàcils d'adapatar per a la seva execució amb PostgreSQL. Greenplum va contribuir millores directament orientades a aplicacions de Data Warehouse i intel·ligència de negocis, incloent-hi el projecte BizGres.
A l'octubre de 2005, John Loiacono, vicepresident executiu de programari a Sun Microsystems va comentar: "No pretenem ser revenedors de Microsoft, però estem fixant-nos en PostgreSQL", sense entrar en detalls. Cap al novembre de 2005, Sun Solaris 10 (versió 6/06) incloïa PostgreSQL.
L'agost de 2007 EnterpriseDB va anunciar el Postgres Resource Center i EnterpriseDB Postgres, dissenyats per ser una distribució de PostgreSQL completament configurada amb molts mòduls contribuïts i agregats. EnterpriseDB Postgres va canviar el seu nom per Postgres Plus al març de 2008.
El projecte PostgreSQL continua publicant versions principals anualment i versions menors de correcció d'errades (bugs), totes disponibles sota la llicència BSD, i basades en contribucions de proveïdors comercials, empreses que hi donen suport i programadors de codi obert majorment.

## Característiques

Algunes de les principals caractéristiques del PostgreSQL són, entre altres:

### Alta concurrència

Mitjançant un sistema denominat MVCC (Accés concurrent multiversió, per les seves sigles en anglès) PostgreSQL permet a un procés escriure en una taula, mentre d'altres hi accedeixen, sense bloquejar-se mútuament. Cada usuari obté una visió consistent de les últimes dades que han estat confirmades (commit). Aquesta estratègia es considera millor que l'ús de bloquejos per taula o per files, comuna en altres bases. S'elimina la necessitat de l'ús de bloquejos explícits.

### Àmplia varietat de tipus natius

PostgreSQL suporta nadiuament:
* Nombres de precisió arbitrària.
* Text de llargada il·limitada.
* Figures geomètriques (amb una varietat de funcions associades)
* Adreces IP (IPv4 i IPv6).
* Blocs d'adreces estil CIDR.
* Adreces MAC.
* Vectors.
A més a més, els usuaris poden crear els seus propis tipus de dades, que poden ser indexables mercès a la infraestructura GiST de PostgreSQL. Alguns exemples són els tipus de dades d'informació geogràfica (GIS) creats pel projecte PostGIS.

### Altres característiques

* Claus foranes també denominades Claus alienes (foreign keys).
* Disparadors (triggers): Un disparador o trigger es defineix com una acció específica basada en algun esdeveniment a la base de dades. En el cas del PostgreSQL això significa l'execució d'un procediment emmagatzemat després que es dugui a terme una determinada acció, o quan s'avisa que aquesta acció està a punt de dur-se a terme (i abans que es dugui a terme), sobre una o diverses files d'una taula específica. Els disparadors es defineixen per sis característiques:
** El nom del disparador o trigger
** El moment en què el disparador ha d'activar-se (abans o després d'una certa acció)
** L'esdeveniment concret que activarà el disparador (el fet que s'afegeixin o modifiquin dades d'una fila d'una relació, per exemple)
** La taula on el disparador s'activarà
** La freqüència de l'execució (un cop per cada fila, o un cop per cada relació, per exemple)
** La funció que ha de ser cridada
Combinant aquestes sis característiques, el PostgreSQL permet crear una àmplia funcionalitat a través del seu sistema de disparadors:
* Vistes.
* Integritat transaccional i relacional.
* Herència de taules.
* Tipus de dades i operacions geomètriques.
* Suport per a transaccions distribuïdes. Permet a PostgreSQL integrar-se en un sistema distribuït format per diversos recursos (p.e., una base de dades PostgreSQL, una altra Oracle, una cua de missatges IBM MQ JMS i un ERP SAP) gestionat per un servidor d'aplicacions on l'èxit ("commit") de la transacció global és el resultat de l'èxit de les transaccions locals.

### Funcions

Blocs de codi que s'executen en el servidor. Poden ser escrits en diversos llenguatges, amb la potència que cadascun d'ells dona, des de les operacions bàsiques de programació, com ara bifurcacions i bucles, fins a les complexitats de la programació orientada a objectes o la programació funcional.
Els disparadors (triggers en anglès) són funcions enllaçades a operacions sobre les dades.
Alguns dels llenguatges que es poden usar són els següents:
* Un llenguatge propi anomenat PL/PgSQL (similar al PL/SQL d'Oracle).
* C.
* C++.
* Java PL/Java web Arxivat 2005-08-27 a Wayback Machine..
* PL/Perl.
* plPHP Arxivat 2005-04-04 a Wayback Machine..
* PL/Python.
* PL/Ruby Arxivat 2007-01-15 a Wayback Machine..
* PL/sh Arxivat 2009-01-11 a Wayback Machine..
* PL/Tcl.
* PL/Scheme Arxivat 2007-07-12 a Wayback Machine..
* Llenguatge per a aplicacions estadístiques R per mitjà de PL/R.
PostgreSQL permet funcions que retornin "files". Els valors retornats per aquestes funcions es tracten de la mateixa manera que una fila retornada per una consulta.
Les funcions poden ser definides per executar-se amb els drets de l'usuari executor o amb els drets d'un usuari prèviament definit. Allò que el PostgreSQL anomena "funcions", en altres sistemes de bases de dades, s'anomena sovint "procediments emmagatzemats" (stored procedures en anglès).

## Historial de versions

| Versió | Primera publicació | Darrera versió | Darrera publicació | Novetats |
| Una versió antiga, sense suport: 0.01 | 01-05-1995 | 0.03 | 21-07-1995 | Primera publicació com Postgres95 |
| Una versió antiga, sense suport: 1.0 | 05-09-1995 | 1.09 | 04-11-1996 | Es canvia el copyright cap a una llicéncia més oberta |
| Una versió antiga, sense suport: 6.0 | 29-01-1997 | − | | Canvi de nom de Postgres95 a PostgreSQL, índexs unique, utilitat pg_dumpall, autenticació ident. |
| Una versió antiga, sense suport: 6.1 | 08-06-1997 | 6.1.1 | 22-07-1997 | Índexs Multi-columna, seqüències, tipus de dada money, GEQO (GEnetic Query Optimizer). |
| Una versió antiga, sense suport: 6.2 | 02-10-1997 | 6.2.1 | 17-10-1997 | interfície JDBC, triggers, interfície de programació de servidors, restriccions. |
| Una versió antiga, sense suport: 6.3 | 01-03-1998 | 6.3.2 | 07-04-1998 | compatibilitat subselect de SQL92, PL/pgTCL |
| Una versió antiga, sense suport: 6.4 | 30-10-1998 | 6.4.2 | 20-12-1998 | VIEW i RULE, PL/pgSQL |
| Una versió antiga, sense suport: 6.5 | 09-06-1999 | 6.5.3 | 13-10-1999 | MVCC, taules temporals, suport a més sentències d'SQL (CASE, INTERSECT i EXCEPT) |
| Una versió antiga, sense suport: 7.0 | 08-05-2000 | 7.0.3 | 11-11-2000 | Claus foranes, sintaxi SQL92 per als joins |
| Una versió antiga, sense suport: 7.1 | 13-04-2001 | 7.1.3 | 15-08-2001 | Write-ahead log, Outer joins |
| Una versió antiga, sense suport: 7.2 | 04-02-2002 | 7.2.8 | 09-05-2005 | PL/Python, ja no són necessaris OIDs, Internacionalització de missatges |
| Una versió antiga, sense suport: 7.3 | 27-11-2002 | 7.3.21 | 07-01-2008 | Schema, Internacionalització |
| Una versió antiga, sense suport: 7.4 | 17-11-2003 | 7.4.30 | 04-10-2010 | Optimització all-round |
| Una versió antiga, sense suport: 8.0 | 19-01-2005 | 8.0.26 | 04-10-2010 | Servidor natiu en Microsoft Windows, savepoints, tablespaces, gestió d'excepcions en funcions, point-in-time recovery |
| Una versió antiga, sense suport: 8.1 | 08-11-2005 | 8.1.23 | 16-12-2010 | Millores de rendiment, two-phase commit, particionament de taules, index bitmap scan, shared row locking, roles |
| Una versió antiga, sense suport: 8.2 | 05-12-2006 | 8.2.23 | 26-09-2011 | Millores de rendiment, construcció d'índexs en línia, bloquejos d'advertència, en espera activa |
| Una versió antiga, sense suport: 8.3 | 04-02-2008 | 8.3.23 | 07-02-2013 | Heap-only tuples, cerques de text complet, tipus de dades SQL/XML, ENUM i UUID |
| Una versió antiga, sense suport: 8.4 | 01-07-2009 | 8.4.21 | 20-03-2014 | Funcioms de finestres, pàrametres default i variadic per a les funcion, permisos a nivell de columna, restauració de la base de dades amb paral·lelització, col·lació per bases de dades, common table expressions i consultes recursives |
| Una versió antiga, sense suport: 9.0 | 20-09-2010 | 9.0.17 | 20-03-2014 | Built-in binary streaming replication, Hot standby, 64-bit Windows, per-column triggers and conditional trigger execution, restriccions exclusives, anonymous code blocks, named parameter, regles per a les contranssenyes |
| Una versió antiga, sense suport: 9.1 | 12-09-2011 | 9.1.13 | 20-03-2014 | Replicació síncrona, per-column collations, unlogged tables, k-nearest neighbors (k-NN) indexing, serializable snapshot isolation, writeable common table expressions, integració amb SE-Linux, extensions, SQL/MED attached tables (Foreign Data Wrappers), triggers on views |
| Una versió antiga, sense suport: 9.2 | 10-09-2012 | 9.2.8 | 20-03-2014 | Cascading streaming replication, index-only scans, suport natiu JSON, millora en la gestió de bloquejos, tipus range, eina pg_receivexlog, índexs GiST separats amb espais |
| Una versió antiga, sense suport: 9.3 | 09-09-2013 | 9.3.4 | 20-03-2014 | Custom background workers, checksums de dades, operadors JSON dedicats, LATERAL JOIN, pg_dump més ràpid, nova eina de monitoratge de servidors pg_isready, trigger features, view features, taules foranes que es poden escriure, materialized views, millores en la replicació |
| Una versió antiga, encara amb suport: 9.4 | 18-12-2014 | 9.4.7 | 31-03-2016 | JSONB data type, ALTER SYSTEM statement for changing config values, refresh materialized views without blocking reads, dynamic registration/start/stop of background worker processes, Logical Decoding API, GiN index improvements, Linux huge page support, database cache reloading via pg_prewarm |
| Una versió antiga, encara amb suport: 9.5 | 07-01-2016 | 9.5.3 | 12-05-2016 | UPSERT, row level security, JSONB-modifying operators/functions, IMPORT FOREIGN SCHEMA, TABLESAMPLE, CUBE/ROLLUP, grouping sets, foreign table inheritance, pg_rewind tool, index-only scans for GiST indexes and new BRIN (Block Range Indexes) index to speed up queries on very large tables |
| Una versió antiga, encara amb suport: 9.6 | 29-09-2016 | 9.6.14 | 20-06-2019 | Suport consultes paral·leles, millores en la gestió de l'ordenació i relació de taules a través de PostgreSQL foreign data wrapper (FDW), múltiples rèpliques síncrones, vacuum més ràpid en taules grans |
| Una versió antiga, encara amb suport: 10 | 05-10-2017 | 10.9 | 20-06-2019 | Replicació lògica, particionat declaratiu de taules, millores en les consultes paral·leles |
| La darrera versió estable: 11 | 18-10-2018 | 11.4 | 20-06-2019 | Augmenta l'estabilitat i rendiment del particionat, suport de transaccions en els procediments emmagatzemats, millores en les consultes paral·leles, compilació d'expressions just-in-time (JIT) |
| Llegenda:Versió antigaVersió antiga, amb suportDarrera versióDarrera versió preliminarProper llançament |

## Productes al voltant de PostgreSQL

El PGDG solament desenvolupa el Motor de Dades i un nombre petit d'utilitats, per potenciar el treball amb PostgreSQL sol ser necessari afegir utilitats externes creades especialment per a aquest motor, algunes d'aquestes eines són:

### Alternatives Comercials

Gràcies a la seva llicència BSD, es permet la utilització del codi per ser comercialitzat. Un dels casos exemple és la d'Enterprise DB (Postgresql Plus), la qual inclou diversos agregats i una interfície de desenvolupament basada en Java. Entre les empreses que comercialitzen productes derivats del PostgreSQL, es troba CyberTech (Alemanya), amb el seu producte CyberCluster.

### GIS
#### PostGIS

    Extensió que afegeix suport d'objectes geogràfics a PostgreSQL i permet realitzar anàlisis mitjançant consultes SQL espacials o mitjançant connexió a aplicacions GIS (Sistemes d'Informació Geogràfica).

### Replicació
#### PgCluster

    Replicació multi mestre.

#### Slony-I

    Replicació mestre esclau.

#### PyReplica

    Replicació mestre esclau i multi mestre asincrónica.

### Eines d'administració
#### PgAdmin3

    Entorn visual d'administració de la base de dades.

#### PgAccess

    Entorn visual d'administració de la base de dades.

#### PhpPgAdmin

    Ajust web.

#### psql

    Client de consola.

#### Database Master

    Entorn d'escriptori visual.

### Recerca de text
#### Full text search

    Inclòs en el nucli a partir de la versió 8.3.
    Via Tsearch2 i OpenFTS per a versions anteriors a la 8.3.

### XML
#### Suport de XML/XSLT

    Via XPath extensions en la secció contrib Arxivat 2007-05-28 a Wayback Machine.. Afegit al nucli a la versió 8.3 (com a mínim).

## Usuaris destacats

* .org, .info, .mobi i .aero registres de dominis per Afilies.
* Societat Química Americana.
* BASF.
* IMDb.
* Skype.
* TiVo.
* Penny Arcade.
* Sony Online.
* O.S. Departament de Treball.
* USPS.
* VeriSign.
* Pictiger.com
* Wisconsin Circuit Court Access amb 6 * 180GB DBs replicats en temps real.
* OpenACS i .LRN.

## Premis

PostgreSQL ha rebut els següents reconeixements:
* 1999 LinuxWorld Editor's Choice Award for Best
Database * 2000 Linux Journal Editors' Choice Awards for Best Database * 2002 Linux New Mitjana Editors Choice Award for Best Database * 2003 Linux Journal Editors' Choice Awards for Best Database * 2004 Linux New Mitjana Award For Best Database * 2004 Linux Journal Editors' Choice Awards for Best Database * 2004 ArsTechnica Best Server Application Award
* 2005 Linux Journal Editors' Choice Awards for Best
Database * 2006 Linux Journal Editors' Choice Awards for Best Database * 2008 Developer.com Product of the Year, Database Tool

## Referències

* 1 2 «Happy Birthday, PostgreSQL!». PostgreSQL Global Development Group, 08-07-2008. [Consulta: 9 abril 2016].
* ↑ «License» (en anglès). Postgresql.org. [Consulta: 9 abril 2016].
* ↑ A bug tracker for PostgreSQL?
* ↑ «BRIN: Block Range Indexes», 07-11-2014. [Consulta: 9 novembre 2014].
* ↑ PostgreSQL affiliates.ORG domain
* ↑ «Sony Online opts for open-source database over Oracle». Arxivat de l'original el 2007-10-13. [Consulta: 4 maig 2010].
* ↑ «PostgreSQL, Award Winning Programari». postgresql.org, 19-01-2008. Arxivat de l'original el 2018-02-12. [Consulta: 31 gener 2008].

## Enllaços externs

* Web de PostgreSQL (anglès)
* Assistència tècnica professional per a PostgreSQL