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 ( ratto da un articolo dal sittoObject-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?

Hosted by www.Geocities.ws

1