Questo articolo introduttivo vuole essere il primo di una serie di articoli dedicati alla scoperta di PostgreSQL e all’approfondimento delle sue innumerevoli funzionalità. Cominciamo subito con una prima introduzione al mondo di PostgreSQL.
Introduzione: La Storia di PostgreSQL
Caratteristiche Principali di PostgreSQL
PostgreSQL è noto per la sua ricchezza di funzionalità avanzate che lo rendono una scelta popolare tra sviluppatori e amministratori di database. Ecco alcune delle sue caratteristiche principali:
Supporto per Standard SQL: PostgreSQL è conforme agli standard SQL (SQL:2023), il che garantisce la compatibilità con molte applicazioni e strumenti di terze parti. E’ inoltre dotato di un suo linguaggio nativo chiamato PL/pgSQL, che permette un maggior controllo del semplice SQL, includendo l'abilità di usare cicli e strutture di controllo avanzate, molto utili nella creazione di funzioni complesse.
Estensibilità: Una delle caratteristiche distintive di PostgreSQL è la sua estensibilità. Gli utenti possono definire nuovi tipi di dati, operatori, funzioni, e persino utilizzare degli specifici linguaggi procedurali (PL/Tcl, PL/Perl, PL/Python, per funzioni che richiedono particolari prestazioni si può utilizzare C/C++). Questo permette di adattare il database a esigenze specifiche senza comprometterne le prestazioni.
Ereditarietà: PostgreSQL permette l’ereditarietà dei tipi, uno dei principali concetti della programmazione orientata agli oggetti (da qui Object RDBMS). Tale concetto di ereditarietà si può applicare a tipi di dato, ma anche a funzioni o tabelle.
Integrità dei Dati: PostgreSQL offre una robusta gestione delle transazioni con supporto ACID (Atomicità, Coerenza, Isolamento, Durabilità). Questo garantisce che le operazioni sul database siano affidabili e che i dati rimangano coerenti anche in caso di errori o interruzioni.
Multi-Version Concurrency Control (MVCC): A differenza della maggior parte degli altri sistemi di database che utilizzano lock per il controllo della concorrenza, Postgres mantiene la coerenza dei dati utilizzando un modello multi-versione. Ciò significa che durante l'interrogazione di un database ogni transazione vede un'istantanea dei dati (una versione del database) com'era qualche tempo fa, indipendentemente dallo stato attuale dei dati sottostanti. Ciò protegge la transazione dalla visualizzazione di dati incoerenti che potrebbero essere causati da (altri) aggiornamenti di transazioni simultanei sulle stesse righe di dati, fornendo l'isolamento delle transazioni per ogni sessione del database. I lock acquisiti per l'interrogazione (lettura) dei dati non entrano in conflitto con i lock acquisiti per la scrittura dei dati e quindi la lettura non blocca mai la scrittura e la scrittura non blocca mai la lettura.
Supporto per Dati Geospaziali e Time Series: Grazie all’estensione PostGIS, PostgreSQL può gestire dati geospaziali complessi, rendendolo ideale per applicazioni GIS (Geographic Information System). Tramite l’estensione TimescaleDB, PostgreSQL può gestire in modo molto performante serie temporali di dati (si pensi al mondo IoT).
Replica e Scalabilità: PostgreSQL supporta la replica sia fisica che logica, sincrona e asincrona, permettendo di distribuire i dati su più server per migliorare la disponibilità e le prestazioni. Inoltre, offre strumenti per il partizionamento dei dati, facilitando la gestione di grandi volumi di informazioni.
Sicurezza Avanzata: PostgreSQL include funzionalità di sicurezza avanzate come l’autenticazione basata su certificati SSL, il controllo degli accessi a livello di riga (RLS) e la crittografia dei dati su disco.
Supporto per JSON: Con il supporto nativo per JSON e JSONB, PostgreSQL è in grado di gestire dati semi-strutturati, rendendolo una scelta eccellente per applicazioni che richiedono flessibilità nella gestione dei dati.
Strumenti di Gestione e Monitoraggio: nell’ecosistema di PostgreSQL è possibile trovare una vasta gamma di strumenti utili per l’amministrazione e il monitoraggio del cluster. Basti pensare a pgAdmin 4 o DBeaver per la gestione tramite GU, pgBackRest per la gestione centralizzata dei backup e Point-in-time recovery, pgBouncer per la gestione efficiente delle connessioni al cluster (connection pooler), Patroni per la gestione dell’alta affidabilità (HA), pg_stat_statements per poter raccogliere informazione sulle query in esecuzione e individuare colli di bottiglia e possibili rimedi.
PostgreSQL nasce principalmente per sistemi Unix-like, è disponibile tramite codice sorgente da compilare (https://github.com/postgres/postgres/) o pacchetti precompilati per le principali distribuzioni Linux (https://www.postgresql.org/download/).
Esiste anche una versione Windows e una versione Mac distribuite da EnterpriseDB (https://www.enterprisedb.com/), ma difficilmente sono versioni che vengono utilizzate su server di produzione.
E’ disponibile online la documentazione ufficiale, che ritengo sia ben fatta e assolutamente da consultare (https://www.postgresql.org/docs/16/index.html).