Dbms
Come detto nel paragrafo
precedente, il database management system che si è scelto per far interagire Php con un database è PostgreSQL.
PostgreSQL è un DBMS (Data Base Management
System) relazionale esteso agli oggetti con una sintassi d?interrogazione molto
vicina agli standard ANSI SQL 1999,1992[1].
Il vantaggio notevole di
questo prodotto è dato dal fatto che è
un prodotto open source ed è disponibile
gratuitamente sul sito ?www.postgresql.org?, quindi, come Php,
non richiede costi per licenze di software commerciali.
Nasce nel 1986 da un
progetto di ricerca dell?università di Berkeley il
cui scopo era quello di realizzare un ORDBMS (Object-Relational Data Base Management System), cioè un
sistema di gestione di basi di dati che fosse relazionale ma anche ad oggetti
ed è supportato da un gruppo di sviluppatori connessi via Internet.
L?idea di introdurre il
concetto di ?classe? (della quale l?oggetto è un?istanza)
ed ?ereditarietà? in un DBMS relazionale è stata senz?altro quello più
innovativa e fortunata di tutte quelle implementate nel PostgreSQL,
tanto che è stata ripresa da moltissimi RDBMS commerciali (come, ad esempio, il
database server della Oracle)[2].
Solo nel 1995 furono
aggiunte le funzionalità SQL e dal 1996 cominciò ad
essere chiamato con il nome attuale.
Il DBMS di PostgreSQL si basa su un sistema cliente-servente, in cui il
programma che vuole interagire con una base di dati
determinata deve farlo attraverso delle richieste inviate a
un servente. In questo modo, il servizio può essere esteso
anche attraverso la rete.
L'organizzazione di PostgreSQL prevede la presenza di
un demone sempre in ascolto (può trattarsi di un socket di dominio UNIX o anche di una porta TCP, che di
solito corrisponde al numero 5432).
Quando
questo riceve una richiesta valida per iniziare una connessione, attiva una
copia del servente vero e proprio, cui affida la
connessione con il cliente.
Il demone in ascolto per
le richieste di nuove connessioni è postmaster,
mentre il servente è postgres.
Quindi postmaster è il demone
che si occupa di restare in ascolto attendendo una richiesta di connessione con
un servente postgres[3]. Quando riceve questo tipo di richiesta mette in connessione il cliente con una nuova
copia del servente postgres.
Per poter compiere il suo
lavoro, deve essere a conoscenza di alcune notizie
essenziali, tra cui in particolare: la collocazione di postgres
(se questo non è in uno dei percorsi della variabile PATH) e la directory, da
cui si dirama il sistema di file che costituisce il sistema delle varie basi di
dati.
Queste notizie possono
essere predefinite o nella configurazione usata al momento della compilazione dei sorgenti oppure possono essere indicate attraverso la
riga di comando.
Le opzioni di postmaster sono[4]:
· ?-D? Che permette di specificare la directory contenente
i dati.
· ?-i? Abilita le connessioni TCP/IP. Senza
l'indicazione di questa opzione, sono ammissibili solo
le connessioni locali attraverso socket di dominio
UNIX (UNIX domain socket).
· ?-p? Se è avviato in modo da accettare le
connessioni attraverso la rete (l'opzione -i),
specifica una porta di ascolto diversa da quella predefinita (5432).
· ?-S? Specifica che il programma deve funzionare in
modo «silenzioso», senza emettere alcuna segnalazione, dissociando postmaster dalla shell e quindi dal terminale
Prima di poter utilizzare
PostgreSQL è necessario compiere alcune funzioni di amministrazione preliminari.
Le funzioni di amministrazione vanno eseguite dall?utente postgres che è necessario creare prima di tutto.
La prima operazione che
l?amministratore del database deve compiere è l?inizializzazione
del dbms tramite il comando ?initdb?.
Le opzioni
di questo comando sono[5]:
· ?--pglib=directory_pglib?. Permette di definire la
directory all'interno della quale initdb deve cercare
gli script che servono a ricreare il sistema di basi di dati di PostgreSQL
· ?--pgdata=directory_pgdata?. Stabilisce la directory
iniziale del sistema di basi di dati di PostgreSQL che si vuole creare.
Per fare in modo che gli
utenti possano accedere al DBMS, occorre che siano
stati registrati all'interno del sistema di PostgreSQL stesso.
In pratica, può trattarsi
solo di utenti già riconosciuti nel sistema operativo,
che sono aggiunti e accettati anche da PostgreSQL.
Per l'inserimento di
questi utenti si utilizza ?createuser?.
L'eliminazione di un
utente PostgreSQL avviene in
modo simile attraverso ?destroyuser?, però
l?eliminazione di quest?ultimo comporta l'eliminazione delle basi di dati a lui appartenenti.
Una
volta aggiunti gli utenti
necessari al dbms, è possibile creare un nuovo database con il comando ?createdb nome_database?.
Nello stesso modo,
attraverso il comando ?destroydb?,
si può eliminare un'intera base di dati.
L'utente che ha creato
una base di dati è
automaticamente il suo amministratore, ovvero colui che può decidere
eventualmente di eliminarla.
PostgreSQL pone dei limiti nella scelta dei nomi delle basi di dati. Non possono
superare i 16 caratteri e il primo di questi deve essere alfabetico oppure può
essere un trattino basso[6]. Se l'utente che tenta di
creare una base di dati non è autorizzato per questo,
quello che si ottiene è un messaggio di errore.
L'accesso ad una base di dati avviene attraverso un cliente[7].
Questo si avvale generalmente della libreria LibPQ.
PostgreSQL
fornisce un programma cliente standard, ?psql?, che si comporta come una sorta di shell tra l'utente e la base di dati
stessa.
Il programma ?psql?
permette un utilizzo interattivo attraverso una serie di comandi impartiti
dall'utente su una riga di comando oppure può essere avviato in modo da
eseguire il contenuto di un file o di un solo comando fornito tra gli
argomenti.
Per quanto riguarda l'utilizzo interattivo, il modo
più semplice per avviarlo è quello dove si indica
semplicemente il nome della base di dati sulla quale
intervenire.
Una
volta entrati
nella shell , si possono far eseguire le varie
istruzioni SQL oppure utilizzare le varie opzioni che mette a
disposizione come ?-h comando_sql?, per vedere la sintassi
dell?istruzione SQL, ?-d nome_tabella?, per vedere la
definizione della tabella o ?-d?, per vedere le tabelle definite nel database,
?-l? per vedere elencate tutte le base di dati presenti nel servente, ?\?? per
elencare tutti i comandi interni di psql e infine
?\q? per uscire dalla shell.
?Psql? può funzionare in
modo interattivo, come accennato prima, o inserendo alcune opzioni
tra cui ?-f?, che gli permette di interpretare un file contenente istruzioni
SQL senza avviare così una sessione di lavoro interattiva e ?-c?, che permette
di fornire un'istruzione SQL già nella riga di comando,
ottenendone il risultato attraverso lo standard output e
facendo terminare subito dopo l'esecuzione di ?psql?.
Quest?ultima funzionalità è risultata
molto utile in quanto ha permesso di inserire nel database le coordinate dei
più importanti centri urbani d?Italia da file, scaricati da pagine internet,
contenenti tali informazioni.
Un?ultima nota su questa shell interattiva è data
dal fatto che, essendo cliente, richiede la presenza di postmaster
per instaurare una connessione con una copia del servente.
I tipi di dato gestibili da Postgresql
conformi allo standard SQL sono:
|
Tipo |
Standard |
Descrizione |
|
CHAR |
SQL92 |
Un carattere singolo. |
|
CHAR(n) |
SQL92 |
Una stringa di lunghezza fissa, di n caratteri, completata da
spazi. |
|
VARCHAR(n) |
SQL92 |
Una stringa di lunghezza variabile con un massimo di n caratteri. |
|
INTEGER |
SQL92 |
Intero (al massimo nove cifre numeriche). |
|
SMALLINT |
SQL92 |
Intero più piccolo di INTEGER. |
|
FLOAT |
SQL92 |
Numero a virgola mobile. |
|
FLOAT(n) |
SQL92 |
Numero a virgola mobile lungo n bit. |
|
REAL |
SQL92 |
Numero a virgola mobile |
|
DOUBLE PRECISION |
SQL92 |
Numero a virgola mobile (più o meno equivalente a REAL). |
|
DATE |
SQL92 |
Data, di solito nella forma mm/gg/aaaa'. |
|
TIME |
SQL92 |
Orario, nella forma hh:mm:ss |
|
TIMESTAMP |
SQL92 |
Informazione completa data-orario. |
|
INTERVAL |
SQL92 |
Intervallo di tempo. |
|
BOOLEAN |
SQL99 |
Valore logico booleano. |
Tabella 2.4.1. Elenco dei tipi di dati standard
utilizzabili con PostgreSQL, espressi nella loro
forma compatta.
Le tabelle 2.4.2 e 2.4.3 mostrano come PostgreSQL, alla maniera di altri
DBMS SQL, offra una serie di funzioni che fanno parte
dello standard SQL, assieme ad altre non standard che
però sono ampiamente diffuse e di grande utilità[8]:
|
Funzione |
Descrizione |
|
POSITION(stringa_1 IN stringa_2) |
Posizione di stringa_1 in stringa_2.
|
|
SUBSTRING(stringa [FROM n] [FOR m]) |
Sottostringa da n per m caratteri.
|
|
TRIM([LEADING|TRAILING|BOTH] ['x'] FROM [stringa]) |
Ripulisce all'inizio e alla fine del testo. |
Tabella 2.4.2. Funzioni standard
SQL riconosciute da PostgreSQL
|
Funzione |
Descrizione |
|
UPPER(stringa) |
Converte la stringa in caratteri maiuscoli. |
|
LOWER(stringa) |
Converte la stringa in caratteri minuscoli. |
|
INITCAP(stringa) |
Converte la stringa in modo che le parole
inizino con la maiuscola. |
|
SUBSTR(stringa,n,m)
|
Estrae la stringa che inizia dalla posizione n,
lunga m caratteri. |
|
LTRIM(stringa, 'x')
|
Ripulisce la stringa a sinistra (Left trim). |
|
RTRIM(stringa, 'x')
|
Ripulisce la stringa a destra (Right trim). |
Tabella 2.4.3. Alcune funzioni riconosciute dal linguaggio di PostgreSQL.
Con PostgreSQL,
quindi, si può utilizzare una sintassi SQL molto vicina agli standard, infatti si possono creare tabelle con ?CREATE TABLE?,
modificarle con ?ALTER TABLE?, eliminarle con ?DROP TABLE?.
Con la creazione delle
tabelle, oltre a definire attributi e il tipo di dato o imporre ad un attributo ?not
null? o il
valore di ?default?, è possibile determinare la
chiave primaria con ?PRIMARY KEY (attributi)?, la superchiave con ?UNIQUE (attributi)?
dove righe differenti nella tabella non possono avere
gli stessi valori e la chiave esterna con ?FOREIGN KEY (nome_attributo)
REFERENCES (tabella_referente)?.
Riferendosi a
quest?ultima chiave nel progetto sono state usate le opzioni
?ON DELETE CASCADE ON UPDATE CASCADE?, in modo che il nuovo valore
dell?attributo della tabella esterna, che deve essere chiave primaria, cui si
riferisce, è riportato su tutte le corrispondenti righe della tabella corrente.
Se vi è una cancellazione, invece, allora tutte le
righe corrispondenti saranno cancellate.
In più è possibile creare
una tabella da una ?SELECT? di un?altra tabella con il comando ?CREATE TABLE (nome_tabella) AS SELECT (lista_attributi)
FROM (nome_tabella)?.
Si possono inserire dei
dati con ?INSERT INTO? aggiornandoli con ?UPDATE? e cancellandoli con ?DELETE
FROM?.
Una caratteristica del
linguaggio SQL è il modo di esprimere le interrogazioni, che avvengono in modo
dichiarativo: si specifica l?obiettivo dell?interrogazione e non il modo con
cui ottenerlo che è invece tipico dei linguaggi di interrogazione
procedurale nei quali bisogna specificare i passi da compiere per estrarre le
informazioni dalla base di dati. Il comando ?SELECT? serve proprio a questo.
PostgreSQL in più ci permette di fare interrogazioni
simultanee su più tabelle e sub-select.
Le varie clausole di
questo comando sono: ?group by?, che permette di
raggruppare un insieme di tuple con valori omogenei
negli attributi specificati, ?order by? che permette di ordinare tuple
in base all?attributo o gli attributi che seguono a questo comando e, infine,
permette l?utilizzo degli operatori aggregati ?count?,
?sum?, ?max?, ?min?, ?avg?.
PostgreSQL permette l?utilizzo di molte altre clausole come ?having?, ?union?, ?intersect? ma qui sono state descritte solo quelle utilizzate nel progetto
[1] La standardizzazione del linguaggio SQL è avvenuta attraverso l?ANSI (?American National Standard Institute?, l?istituzione americana preposta alla promulgazione degli standard).
[2] Tratto da un articolo del
sito ITportal.it:
?MYSql, PostgreSQL e
InterBase: tre RDBMS Open Source a confronto?.
[3] Fonte:
?Appunti di informatica libera? di Daniele Giacobini
[4] Fonte ?http:\\www.postgreSQL.org?
[5] Fonte: ?PostgreSQL: introduction and
concepts?. Bruce Momjian
[6] Fonte: ?PostgreSQL
HOWTO?. Alavoor Vasudevan
[7] Front-end, secondo la documentazione
di PostgreSQL
[8] Fonte: ?PostgreSQL User's Guide?