Use the left/right arrow keys to navigate, 's' to enable/disable scrolling.

Introduzione ai GIS Liberi


Database relazionali, PostgreSQL, SQL

Indice


Definizioni

Cenni sul modello relazionale

PostgreSQL - installazione e configurazione

Structured Query Language (SQL)

Definizioni: database


Per database si intende una collezione di dati coerenti e correlati. Più nello specifico si può parlare di database in presenza di:

  • un universo del discorso circoscritto e ben definito (ad es. il DB di una banca)
  • una collezione di dati coerenti con qualche significato intrinseco. Un assortimento di dati casuali non può rappresentare un DB.
  • un particolare ambito applicativo, con finalità predeterminate

In altre parole un database deriva da qualche sorgente di dati, è caratterizzato da un qualche grado di interazione con gli eventi dell’universo del discorso, ed è progettato e popolato per uno scopo preciso

Definizioni: DBMS


Un DBMS (Database Management System) è una collezione di programmi che permettono agli utenti di creare e manutenere uno o più database


In particolare si tratta di un software general-purpose, teso a facilitare il processo di definizione, costruzione e manipolazione di un database per le più diverse applicazioni


Nota: in generale per implementare un database non è necessario un DBMS general-purpose, tuttavia tali software rappresentano lo stato dell’arte della tecnologia in questo ambito

Database relazionali


I database relazionali rappresentano uno dei paradigmi di gestione delle informazioni più comunemente utilizzato, implementato nella maggior parte dei DBMS commerciali e open


Il modello relazionale fu teorizzato nei laboratori IBM a cavallo degli anni ‘70, dal matematico Edgard F. Codd


Si basa sulla teoria degli insiemi, sull’algebra relazionale e su un processo di modellazione detto normalizzazione, teso ad eliminare incongruenze e duplicazione dei dati


Tale modello prevede l’esistenza di un linguaggio di interrogazione dei dati, chiamato SQL (Structured Query Language)

Vantaggi di un DBMS


  • natura autodescrittiva dei dati: un DBMS oltre ai dati grezzi memorizza anche metainformazioni (tipi, struttura degli oggetti, relazioni)
  • isolamento tra dati e applicazione: il DBMS fornisce una visione astratta delle informazioni, disaccoppiandoli dala logica applicativa
  • supporto a viste multiple dei dati: utenti diversi possono interrogare il database da prospettive differenti
  • condivisione delle informazioni e transazioni: più utenti/applicazioni possono accedere agli stessi dati, il DBMS garantisce la consistenza delle operazioni in caso di concorrenza

Architettura client-server


Il modello Client/Server rappresenta uno dei paradigmi computazionali più diffusi, e consiste nel suddividere il carico di lavoro tra macchine distinte, che comunicano tra loro mediante un protocollo definito. In particolare:

  • il server è la componente che fornisce un servizio
  • il client invece quella che lo richiede

Applicazioni client/server possono risiedere su macchine distinte, e comunicare attraverso una rete, o sullo stesso sistema


La maggior parte dei DBMS sono modellati su questo paradigma

Modellazione di un database


Esistono diverse metodologie di progettazione di un database, tutte riconducibile alle seguenti macroattività:


  • analisi dei requisiti
  • modellazione concettuale
  • modellazione logica
  • modellazione fisica
  • tuning

Nota: le fasi elencate sono da considerarsi intercambiabili, ripetibili e iterabili

Modellazione concettuale


In questa fase i requisiti vengono trasformati in una schematizzazione del problema, che possa successivamente essere tradotta in un linguaggio interpretabile dal DBMS


A questo livello di astrazione si utilizzano concetti come entità, attributi e relazioni per rappresentare gli oggetti dell’universo del discorso

  • una entità mappa uno a uno l’oggetto di interesse
  • l’attributo è una qualità/proprietà di un’entità
  • una relazione rappresenta l’associazione tra due o più entità (ad es. tra libro e autore)

Il modello concettuale può essere rappresentato in modi diversi; le tecniche più note sono il diagramma entità-relazioni (ER) e l’UML

Modellazione logica


La modellazione logica tende a tradurre il modello concettuale in un DDL (Data Definition Language), più vicino alla struttura interna del DBMS


Nei database relazionali la modellazione logica si basa sul modello relazionale (Edgard F. Codd, 1970).


Il database è rappresentato come una collezione di relazioni (o tabelle) di valori. Ogni riga della tabella (tupla) corrisponde ad un insieme di dati correlati


Nota: il passaggio da modello concettuale a logico può essere realizzato in forma algoritmica, a patto che il primo sia stato normalizzato

Modellazione fisica


L’ultimo step della fase di progettazione consiste nella creazione di un modello fisico


Il modello fisico è strettamente correlato al DBMS scelto. Esso è costituito dalle descrizioni delle tabelle, dei vincoli di integrità referenziale, ed eventualmente dei behavior (triggers e stored procedures) nel linguaggio di programmazione interno al DBMS.


Per una corretta scrittura di un modello fisico occorre conoscere gli internals del sistema che si utilizza:

  • strutture di memorizzazione
  • eventuali limiti di storaging
  • tipi di dato primitivi disponibili

Caratterizzazione delle relazioni


Le relazioni possono essere classificate secondo il numero di entità coinvolte:

  • binarie: relazioni tra due entità di tipi diversi (libro/srittore)
  • ternarie: relazioni tra tre entità di tipi diversi (progetto/fornitore/componente)
  • n-arie: generalizzazione della relazione ternaria - relazioni tra n entità di tipi diversi

o secondo la loro molteplicita:

  • 1-1: relazione tra una entità a di tipo t1 ed una b di tipo t2 (Reparto/Dirigente)
  • 1-n: relazione tra una entità a di tipo t1 ed una o più entità [ b1,…, bn ] di tipo t2 (Studente/CdL)
  • n-m: relazione tra una o più entità [ a1,…, an ] di tipo t1 ed una o più entità [ b1,…, bm ] di tipo t2 (Impiegato/Progetto)

PostgreSQL


PostgreSQL è un DBMS relazionale ad oggetti, completamente libero, nato come spin-off di un progetto di ricerca dell’Università di Berkeley.


Uno dei vantaggi di PostreSQL è la definizione di tipi di dato personalizzati ereditabili (allo stesso modo della programmazione ad oggetti). Ad esempio si può definire il tipo codice_postale e su questo basare le definizioni di cap (per indirizzi italiani) e zip_code (per indirizzi USA).


PostgreSQL può essere interrogato sia in SQL, sia in un linguaggio nativo chiamato PL/pgSQL. Sono disponibili bindings per in principali linguaggi di programmazione.

Installazione di PostgreSQL


Sui sistemi Debian/Ubuntu, PostgreSQL può essere installato semplicemente utilizzando il comando


$> apt-get install postgresql

Al termine dell’installazione, è necessario effettuare alcune operazioni di postconfigurazione

Postconfigurazione


È necessario procedere alla creazione di un utente per il collegamento al DBMS. Tale operazione può essere effettuata con il seguente comando, da lanciare da una shell di root:


 $> sudo -u postgres createuser -s -l -P root

 ## creazione di un utente PostgreSQL di nome root,
 ## con caratteristiche superuser (-s) e login (-l)

PostgreSQL CLI client (1/3)


PostgreSQL è distribuito insieme ad un tool a linea di comando per l’accesso ai dati chiamato psql. Psql non è altro che un potente interprete SQL interattivo con le seguenti caratteristiche:


  • completion in fase di editing (sia del codice SQL che delle strutture dati definite dall’utente)
  • supporto a direttive DDL, DML e DCL
  • help on-line interattivo
  • history dei comandi inseriti
  • supporto integrato a diversi editor testuali (vim, pico, nano..)

PostgreSQL CLI client (2/3)


Psql è in grado di interpretare due tipologie di comandi:

  • direttive SQL: normali statement interattivi, terminati da un ; che forza l’interprete all’esecuzione
  • comandi interni: comandi di utilità non supportati dall’SQL standard ma indispensabili alla gestione del DBMS. Rientrano in questa categoria operazioni di listing di tablespace/database/tabelle/domini… Un comando interno è caratterizzato dal fatto di iniziare con un backslash e dal non poter essere suddiviso su più linee.

Uso base di psql:


  #psql -U nomeutente -W database
  psql -U root -W template1

PostgreSQL CLI client (3/3)


Principali comandi interni:


  \?                Visualizza tutti i comandi interni
  \l                Lista i database presenti
  \c [db] [user]    Si connette al database specificato con le credenziali richieste (opzionale)
  \d table          Visualizza la struttura tella tabella in argomento
  \d{t,i,s,v}       Visualizza tabelle, indici, sequenze e viste definite nel database corrente
  \df               Visualizza le funzioni definite
  \h                Help on-line SQL
  \q                Esce

Tipi di dati in PostgreSQL


PostgreSQL offre una serie di tipi di dato predefiniti, sulla base dei quali è possibile definirne degli altri da parte dell’utente. Segue una lista dei principali tipi supportati:


  integer (4 bytes)       usual choice for integer
  real (4 bytes)          variable-precision, inexact
  numeric (variable)      user-specified precision, exact
  serial (4 bytes)        autoincrementing integer
  varchar(n) (n bytes)    variable-length text with limit
  text (unlimited)        variable text with unlimited length

SQL (1/3)


L’SQL (Structured Query Language) nasce nel 1974 nei laboratori dell’IBM, come strumento per interagire con i database basati sul modello relazionale. Si tratta di un linguaggio di tipo dichiarativo, molto simile alla lingua parlata inglese


Dopo il 1983, data di rilascio di DB2 (un famoso DBMS relazionale ancora largamente in uso), l’SQL diventa uno standard de facto in ambito industriale

SQL (2/3)


L’SQL ha subito negli anni un processo di standardizzazione, sia ad opera dell’ANSI (1986, 1992, 1999, 2003, 2006) che della ISO (1987), mirato alla creazione di un linguaggio comune a tutti i DBMS relazionali; tuttavia questo obiettivo non è mai stato raggiunto


Attualmente ne esistono diverse implementazioni, che incorporano almeno in parte le operazioni standard (o almeno il sottoinsieme SQL-87), e ne incrementano le funzionalità attraverso estensioni procedurali (PL/SQL, PL/PgSQL, SQL PL…)

SQL (3/3)


L’SQL è caratterizzato da tre sottolinguaggi, ciascuno avente obiettivi differenti:


  • DDL (Data Definition Language): insieme di direttive per la descrizione delle strutture che memorizzeranno i dati. Attraverso questo sottolinguaggio può essere descritto il modello fisico di un database relazionale
  • DML (Data Manipulation Language): insieme di direttive per la manipolazione dei dati; permettono operazioni CRUD (Create, Read, Update e Delete)
  • DCL (Data Control Language): insieme di direttive per il controllo dell’accesso ai dati (creazione di utenti/gruppi, privilegi a livello di DBMS, DB, Tabella e singole colonne)

Definizione di database


Come visto in precedenza, un DBMS è un software che permette l’organizzazione e la gestione di uno o più database. In quest’ottica l’SQL deve prevedere delle istruzioni per la creazione, modifica e rimozione di questi ultimi:


# CREAZIONE:
CREATE DATABASE db_name
[create_specification [, create_specification] ...]

# MODIFICA:
ALTER DATABASE db_name
 [DEFAULT] CHARACTER SET charset_name
 | [DEFAULT] COLLATE collation_name

# CANCELLAZIONE:
DROP DATABASE nome_db

Creazione di tabelle (1/2)


Il comando CREATE TABLE ha la funzione di creare una nuova tabella (o relazione)


Il nome della tabella può essere scritto indifferentemente in MAIUSCOLO o in minuscolo (in alcuni ambienti il DBMS farà distinzione), e deve rispettare le seguenti regole:

  • Può essere formato da lettere e numeri, ma il primo carattere deve sempre essere una lettera;
  • Non può superare i 30 caratteri di lunghezza;
  • Non può avere lo stesso nome di una tabella o vista già esistente nello stesso database (o schema, se supportato)

La tabella può essere creata vuota oppure può essere creata e riempita di dati (create table mediante select); nel secondo caso la struttura della tabella è definita implicitamente dal numero di colonne (o campi) estratti dalla select

Creazione di tabelle (2/2)


SINTASSI


# Creazione mediante definizione dello schema:
CREATE TABLE nome_tabella(
 nome_colonna1 tipo_dato [vincolo (...)],
 nome_colonna2 tipo_dato [vincolo (...)],
 nome_colonna3 tipo_dato [vincolo (...)],
 ...
 nome_colonnaN tipo_dato constraint (opzionale) 
);

# Creazione mediante select:
CREATE TABLE nome_tabella AS 
SELECT ...;

Modifica di una tabella


Il comando ALTER TABLE ha la funzione di modificare la struttura della tabella


Supporta tre operatori:

  • ADD: consente di inserire una nuova colonna su una tabella esistente oppure di aggiungere dei vincoli alle colonne della tabella
  • MODIFY: consente di cambiare il tipo di dato e/o i vincoli propri di ogni colonna di una tabella
  • DROP: consente di eliminare una colonna o un vincolo proprio di colonna dalla tabella

ALTER TABLE esame ADD COLUMN voto int not null default 18;

Cancellazione di una tabella


Per eliminare una tabella da un database (cancellando di conseguenza tutti i dati in essa contenuti) si utilizza il comando:


DROP TABLE nome_tabella [CASCADE | RESTRICT]

Utilizzando l’opzione CASCADE il DBMS eliminerà anche tutte le foreign keys che si riferiscono a dati della tabella cancellata.

Algebra relazionale


In aggiunta alle direttive di definizione della struttura e dei vincoli di un database, il modello relazionale prevede un sottoinsieme di operazioni per la manipolazione dei dati detto algebra relazionale


Queste operazioni hanno sempre come operandi una o più relazioni, e producono una nuova relazione


In genere si suddivide l’algebra relazionale in due sottoinsiemi:

  • operazioni sugli insiemi (unione, intersezione, differenza, prodotto cartesiano)
  • operazioni specifiche dei db relazionali (selezione, proiezione, join)

Operatori unari


Per operatore unario si intende una funzione di R->R, (un’unica relazione in input, un’unica nuova relazione contenente le tuple risultato). L’algebra relazionale prevede i seguenti operatori unari:


  • selezione: permette di filtrare le tuple di una relazione sulla base di una o più condizioni di selezione
  • proiezione: permette di proiettare una relazione di dimensione n (n attributi) in un’altra relazione di dimensione m (con m<=n)
  • ridenominazione: permette di rinominare le colonne di una relazione, per successive rielaborazioni

Operatori binari (1/2)


Gli operatori binari dell’algebra relazionale sono funzioni di RxR->R, prendono come argomento due relazioni e ne restituiscono una nuova contenente le tuple risultato


  • Unione: dati due insiemi A e B, l’unione AuB è data dall’insieme C contenete tutti gli elementi di A e tutti gli elementi di B, con occorrenze singole in caso di elementi ripetuti
  • Intersezione: dati due insiemi A e B, l’intersezione A^B è data dall’insieme C contenete tutti gli elementi presenti sia in A che in B
  • Differenza tra insiemi: dati due insiemi A e B, la differenza A-B è data dall’insieme C contenete tutti gli elementi presenti in A e non in B

Operatori binari (2/2)


  • Prodotto cartesiano: date due relazioni A di dimensione n e cardinalità r e B di dimensione m e cardinalità s, AxB è la relazione C di dimensione n+m e cardinalità r*s data da tutte le combinazioni tra gli elementi di A e gli elementi di B
  • Join (natural e outer): simili al prodotto cartesiano, vengono scartate tutte le tuple che non soddisfano la condizione di join (logicamente equivale ad un prodotto cartesiano seguito da una selezione)

Funzioni di aggregazione


Le funzioni di aggregazione eseguono un calcolo su un set di valori e restituiscono un valore scalare. Ad eccezione della funzione COUNT, le funzioni di aggregazione ignorano i NULL value


Nota: Tutte le funzioni di aggregazione sono deterministiche. Ciò significa che restituiscono lo stesso valore ogni volta che vengono invocate sullo stesso set specifico di valori di input


Tra le più comuni funzioni di aggregazione si devono annoverare:

avg(), min(), max(), sum(), count()

DML (Data Manipulation Language)


Un DML è il sottoinsieme del linguaggio di livello fisico fornito dal DBMS per la manipolazione dei dati


L’SQL prevede una serie di direttive per il supporto alle seguenti operazioni:

  • Inserimento di dati nel DB
  • Modifica di dati precedentemente inseriti
  • Cancellazione
  • Selezione, Proiezione, Ridenominazione (Algebra relazionale)
  • Ordinamento
  • Prodotto cartesiano, join, natural join, outer join, unione, intersezione, differenza (Operazioni sugli insiemi)

Inserimento di tuple


Il comando INSERT si utilizza per inserire dati nelle tabelle


Le colonne (o campi) di destinazione dei valori possono essere o meno dichiarate nel comando. Se non vengono dichiarate, è necessario passare al comando un valore per ogni colonna della tabella, rispettando rigorosamente l’ordine delle colonne stesse.


È anche possibile indicare un sottoinsieme di colonne da inizializzare, purché non vengano violati i vincoli NOT NULL


INSERT INTO nome_tabella [(elenco dei campi interessati dall’inserimento)]
VALUES (elenco valori);

Modifica di tuple


Il comando UPDATE ha la funzione di modificare i dati delle tabelle


Il nome di ogni campo che deve essere modificato va dichiarato dopo la parola chiave SET e deve essere seguito dal simbolo ”=” (uguale) e dal nuovo valore che deve assumere


È possibile modificare più campi della stessa riga in un unico comando update, separandoli l’uno dall’altro con una virgola

Modifica di tuple


Il comando generico aggiorna tutte le righe della tabella. È possibile restringerne il numero applicando la parola chiave aggiuntiva WHERE


UPDATE nome_tabella
SET nome_campo1 = 'valore1_nuovo',
    nome_campo2 = 'valore2_nuovo'
[WHERE nome_campo3 = 'valore'];

Cancellazione di tuple


Il comando DELETE ha la funzione di cancellare i dati dalle tabelle


Come il comando update anche delete può operare in modo generico cancellando tutte le righe della tabella oppure può identificare le righe da cancellare mediante la parola chiave aggiuntiva WHERE e la condizione (o le condizioni) ad essa associata.


DELETE FROM nome_tabella
[WHERE nome_campo = 'valore'];

Nota: alcuni DBMS implementano la direttiva TRUNCATE (non standard) per la cancellazione incondizionata, che ottimizza l’operazione agendo direttamente sul file system.

Selezione


La sintassi generica di un comando di manipolazione in SQL è nella forma:


SELECT ... FROM ... WHERE

In particolare, l’operazione unaria di selezione si ottiene mediante la dichiarazione:


SELECT *
FROM tabella
WHERE espressione_condizionale

Operatori matematici e logici


Ogni condizione di selezione deve essere nella forma: colonna operatore valore, dove operatore può valere:

  • ,=,<,<=,>= (operatore di confronto)

  • IN (operatore di inclusione insiemistica)
  • LIKE/ILIKE (operatori di confronto tra stringhe)

È possibile concatenare più condizioni di selezione attraverso gli operatori logici:

  • AND (le due condizioni a dx e sx devono verificarsi contemporaneamente)
  • OR (almeno una delle condizioni deve essere vera)
  • NOT (negazione logica)

Proiezione (1/2)


L’operazione di proiezione dell’algebra relazionale può essere ottenuta in SQL in modo molto semplice, specificando gli attributi da selezionare subito dopo la clausola SELECT:


SELECT lista_attributi
FROM tabella

Proiezione (2/2)


È possibile combinare operazioni di proiezione e selezione (per la loro commutatività), specificando contemporaneamente la lista degli attributi da proiettare e le condizioni di selezione


SELECT nome, cognome, età
FROM impiegato
WHERE età > 50 and salario > 3000

Prodotto cartesiano


Il prodotto cartesiano tra due relazioni è un’operazione teoricamente corretta ma di scarsa utilità. Èsso è definito dalla seguente direttiva SQL:


SELECT * 
FROM tabella1, tabella2

Join (Natural)


La natural join tra due relazioni è implementata in SQL attraverso due sintassi differenti:


SELECT * 
FROM tabella1, tabella2
WHERE condizione_di_join

SELECT * 
FROM tabella1 JOIN tabella2
USING (condizione_di_join)

La seconda sintassi è preferibile perché più leggibile (nella prima forma, deprecata nell’SQL-99, vengono utilizzati gli operatori di selezione e proiezione)


Nota: qualora le colonne della condizione di join abbiano nomi differenti, si utilizza la clausola ON (colonna1=colonna2) al posto della USING

Outer Join


La outer join differisce dalla natural join in quanto non richiede il match della condizione di join in entrambe le tabelle coinvolte


Segue la sintassi base per le operazioni di outer join:


SELECT * 
FROM tabella1 [LEFT | RIGHT] OUTER JOIN tabella2
[USING (condizione_di_join) | ON (condizione_di_join)]

Nota: le operazioni di outer join (normale, sinistro e destro NON possono essere definite mediante operatori di selezione e proiezione)

Ordinamento


Dalla definizione del modello relazionale (logica e teoria degli insiemi), segue che data una relazione non esiste una relazione d’ordine preferenziale sulla stessa


Questo presuppone che un qualsiasi DML deve permettere la definizione di un qualche ordinamento sulle tuple. In SQL per tale scopo si utilizza la clausola ORDER BY:


SELECT attributi_di_proiezione
FROM nome_tabella
WHERE condizione_di_selezione
ORDER BY colonna1 [ASC | DESC] [, colonna2 [ASC | DESC] ...]

Copyright 2010 - Alca Soc. Coop.


http://learn.alcacoop.it - learn@alcacoop.it



released under CreativeCommons 2.5 by-nc-sa