CORSO GEODATABASE - Università degli Studi di Trento
Transcription
CORSO GEODATABASE - Università degli Studi di Trento
Database relazionali FOSS e GeoDatabase dott. Marco Ciolli1 ing. Fabio Zottele2 1 D.I.C.A. – Università degli Studi di Trento 2 SIG – Fondazione Mach - FEM GRASS, FREE ed OPEN SOURCE GIS e GEODATABASE Trento, 20 – 24 giugno 2011 I data base: caratteristiche principali Un significativo antenato dei database relazionali odierni per caratteristiche e struttura è la vecchia agenda telefonica. Infatti è organizzata tramite un indice (la serie di linguette sul fianco che ci permette di accedere più rapidamente a tutti i nominativi che iniziano con una certa lettera) che gestisce una tabella composta da colonne che identificano il tipo di dato sotto riportato (nome, numero di telefono, a volte indirizzo) all'interno delle registrazioni (se vogliamo chiamarle con il termine inglese le chiameremo "record") che , anche se differiscono l'una dall'altra per i dati riportati al loro interno "hanno tutti la stessa struttura", cioè riportano le stesse informazioni nella medesima maniera. Il primo tentativo per trasferire questo insieme di dati in un aggeggio gestibile dalle calcolatrici era il CSV (Comma Separated Value), file di testo (tuttora utilizzato come file di scambio) dove ogni informazione (numero di telefono di Gino, nome di Fausto, indirizzo di Franco) è separata dalle altre tramite un carattere (in genere una virgola) ed ogni record (cioè la riga della nostra agenda) è separato dagli altri tramite un altro carattere (in genere il carattere di "a capo"). Tale sistema era abbastanza scomodo, per trovare quanto si ricercava all'interno di un file così fatto un'informazione specifica era spesso necessario scorrerselo quasi tutto ed in modo poco pratico. Gino,Bartali,Via Panicale,565446<-| Fausto,Coppi,Via Panicale,<-| Franco,Bitossi,Via Tornabuoni,465453<-| dal CSV nacque l'ISAM (Indexed Sequential Access Method), che differiva dal CSV per il fatto che i record non erano messi dentro secondo l'ordine di inserimento e quindi potenzialmente a caso), bensì veniva definito un ordinamento (che nel caso dell'agenda telefonica sarebbe l' ordine alfabetico dei cognomi) Gino,Bartali,Via Panicale,565446<-| Franco,Bitossi,Via Tornabuoni,465453<-| Fausto,Coppi,Via Panicale,<-| Tale ordinamento veniva sfruttato sia in scrittura ("dove scrivo il record del telefono di Binda?" "lo inserisco tra il record di Bartali e Bitossi") sia in lettura ("dove vado a cercare il numero di telefono di Coppi?" " lettera C, tra Cinelli e Cumini") così da abbreviare significativamente i tempi di ricerca di una data informazione. Per riuscire a gestire ancora meglio il tutto si crearono anche delle specie di "archivi sussidiari", detti indici, in cui veniva registrato solo l' ordine dei vari record senza tutte le altre informazioni, il che permetteva di andare a svolgere le proprie ricerche in questo "riassunto" in modo molto più veloce (meno roba da leggere=ci metto di meno a leggerla) e poi "puntare diritti" sul database completo per leggere tutto il record una volta che si sapeva dov'era Allora parecchi matematici si misero a cercare metodi per rendere più veloce l' accesso alle informazioni sfornando sistemi di ricerca dai nomi fantasiosi come "ricerca dicotomica" o " a farfalla" (di cui non ci occupiamo qui), sviluppando così tutti quei sistemi oggi definiti "Database non relazionali" (in contrapposizione ai database relazionali) con l'evoluzione dei DB relazionali i database ebbero una notevole diffusione e quindi iniziarono a nascere richieste di affidabilità e di prestazioni sempre maggiori, con uno sviluppo teorico notevole dietro ad essi, che permetteva a questo punto di affrontare diversi problemi, di cui di seguito elenco quelli più conosciuti. Ridondanza dei dati: ma è possibile evitare di rimettere nel mio database della contabilità duemila volte l'indirizzo del mio cliente principale? Uniformità dei dati con che nome ho inserito la Cozza Vongola e Molluschi SRL l'ultima volta? CVM? C.V.M. ? C.V.M. SRL.? C.V. & M. SRL?" Indipendenza dalla piattaforma sul sistema di Pino per vedere il contenuto di una tabella faccio così su quello di Mino e Lino cosà, su quello di Addolorato e sul mio in un altro modo completamente diverso Sicurezza delle transazioni DISASTRO! stavo mettendo dentro al database tutte le fatture dell'ultimo semestre quando è andata via la corrente ed adesso non so se l'ultima me l'ha presa o no! Ed ora cosa faccio, devo ricostruire l'intera tabella delle fatture per essere certo che non ci siano valori doppi o inseriti a metà? La possibilità di gestire correttamente un ambiente multiutente sono certo di avere inserito l'ordine per le ultime tre scatole di Mandingo a nome del mio miglior cliente e quelle sono finite invece al peggior cliente di un altro commerciale? eppure Sono Sicuro di averle fermate al magazzino per primo. Per risolvere tutti questi problemi in maniera soddisfacente si è dovuto cambiare il modo di "pensare" i database, portando così alla nascita dei database relazionali come sono strutturati oggi Cos’è un Database? Un database è una raccolta di dati che è organizzata in modo tale che il suo contenuto possa essere facilmente consultato, gestito e aggiornato. Il tipo prevalente di database è quello relazionale un database tabellare in cui il dato è definito così da poter essere riorganizzato e consultato in molti modi differenti. (Molti sostengono che non esista una definizione soddisfacente) Un DB può avere una struttura di organizzazione dei dati elementare o molto complicata, in funzione dell’ambito applicativo e della quantità e tipologia delle informazioni da memorizzare Degli esempi di data base sono un’agenda personale (nomi, calendario appuntamenti), un archivio universitario (studenti, matricole, esami, docenti, insegnamenti) E’ necessario introdurre alcuni concetti di base: – tabella – record – campi Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale –chiavi – query – SQL – DBMS • tabella – è una raccolta di dati organizzati in righe e colonne – ogni tabella, in genere, rappresenta un raccolta di informazioni su uno specifico argomento o tematica – ad esempio possiamo avere una tabella per gli studenti, una per i corsi e una per i docenti • record (tupla) – è una singola riga di una tabella – ci consente di identificare un determinato insieme di dati, all’interno di tutti quelli che sono contenuti nella tabella – per esempio nella tabella Corsi degli studenti di ingegneria ci sarà il record relativo a “Pianificazione Ecologica” oppure “GIS e Cartografia Numerica” Dunque un Database è costituito da una serie di tabelle differenti • Una tabella è composta da record omogenei • Un record è composto dalle voci dei campi Campi Database Studenti Matricola 1214 1300 802 Tabella Corsi Codice 123E 125P 127I Nome Ecologia Pianificazione ecologica GIS e cartografia numerica Ore 100 50 100 Record Docenti CodiceProf 1012 1025 1050 Nome Marco Paolo Alfonso Nome Gino Fausto Franco Cognome Bianchi Rossi Verdi Cognome Bartali Coppi Bitossi Indirizzo Via Panicale Via Panicale Via Tornabuoni Indirizzo Via Bella Via Allegra Via Panoramica Telefono 365841 565862 965757 Telefono 565446 465453 CodiceCorso 123E 125P 127I • campi sono le colonne che compongono la tabella e ne definiscono la struttura; si può specificare il tipo di ciascun campo (testo, numeri, interi e floating ecc.) e si può imporre una certa serie di regole p.e. che un campo non può essere vuoto o deve avere un massimo numero di caratteri • chiave è l’insieme dei campi che permette di identificare in modo univoco ed inequivocabile un singolo record all’interno della tabella – ogni tabella può avere una o più chiavi – non si possono avere in tabella due record distinti con lo stesso valore del campo chiave – non è possibile avere chiavi contenenti valore NULL – una chiave può essere composta da uno o più campi – esempi di chiave: Matricola per “Studenti”, Codice per “Corsi”, Codiceprof per “Docenti” – è un elemento fondamentale per il collegamento con i GIS Può essere una chiave Corsi Codice 123E 125P 127I Nome Ecologia Pianificazione ecologica GIS e cartografia numerica Ore 100 50 100 Studenti Matricola 1214 1300 802 Docenti CodiceProf 1012 1025 1050 Nome Marco Paolo Alfonso Nome Gino Fausto Franco Cognome Bianchi Rossi Verdi Non può essere una chiave Cognome Bartali Coppi Bitossi Indirizzo Via Panicale Via Panicale Via Tornabuoni Indirizzo Via Bella Via Allegra Via Panoramica Telefono 365841 565862 965757 Telefono 565446 465453 CodiceCorso 123E 125P 127I • query è un’interrogazione sul Database utile per per estrarre, riorganizzare, riclassificare i dati – fornisce come risultato un insieme di dati che soddisfano le condizioni imposte in essa – normalmente negli strumenti per la gestione dei DB si ha la possibilità di creare la query sia con apposite interfacce facilitate, sia scrivendola direttamente in un linguaggio apposito • SQL SQL (Structured Query Language) è un linguaggio per la formulazione di query • Una query scritta in SQL può avere questa forma: Select-From-Where – SELECT: per indicare i campi richiesti (* per tutti) – FROM: per indicare su quali tabelle si deve effettuare la query – WHERE: per indicare i vincoli imposti • Ad esempio se volessimo estrarre il nome ed il numero di telefono dello studente la cui matricola è 1214, potremmo scrivere una query in SQL: SELECT Nome, Cognome, Telefono FROM Studenti WHERE matricola = 1214 Studenti • Il risultato sarebbe: Gino Bartali 565446 Matricola 1214 1300 802 Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Nome Gino Fausto Franco Cognome Bartali Coppi Bitossi Indirizzo Via Panicale Via Panicale Via Tornabuoni Telefono 565446 465453 • DBMS • Software che controllano l'organizzazione, l'immagazzinamento, il caricamento, la sicurezza e l'integrità di un database. Accettano richieste dall'applicazione e istruiscono il sistema operativo per trasferire i dati appropriati DBMS (Data Base Management System) sono cioè i software in grado di gestire i DB consentendo di – creare DB (strutture di tabelle, vincoli d’integrità di tupla o di dominio, …) – gestire dati (inserirli, effettuare query, definire trigger, …) – gestire accessi concorrenti, back up, roll back, … • Alcuni DBMS: – PostgreSQL, MySQL – Oracle DBMS – MicroSoft SQLServer, MicroSoft Access Database Relazionali si chiamano così perché il loro elemento base è la: relazione che è un sottoinsieme della relazione matematica tra due insiemi, detti domini della relazione, rappresentato da un insieme di tuple omogenee, fisicamente rappresentabile con una tabella costituita da righe e colonne. Ci sono anche DB gerarchici, reticolari e NOSQL (2009) ma sono meno flessibili, più complessi e richiedono maggiori conoscenze anche sulla struttura dei dati da Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale parte dell’utente Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Dal database al geodatabase Fabio Zottele – SIG – Fondazione E. Mach Marco Ciolli – DICA – Università degli Studi di Trento Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Così, per iniziare... Perchè inserire informazioni georiferite in un database? Quando nasce l'esigenza di utilizzare il DataBaseManagementSystem con un'estensione geografica? Che differenza c'è tra un GIS ed un GEODBMS? È difficile utilizzare un GEODBMS? Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Perchè inserire informazioni georiferite in un database? L'informazione georiferita è un tipo di informazione complesso, ma può essere rappresentato partendo dalla definizione di un nuovo tipo: la geometria (Geometry) Con questo approccio si utilizzeranno database di tipo relazionale ed a modello Object Oriented (ORDBMS). Ogni estensione spaziale dei DBMS sarà leggermente diversa... DBMS Spatial Extension SyBase ASE Boeing's SQS SmallWorld SmallWorld VMDS Sqlite SpatialLite IBM DB2 spatial Extender Oracle Oracle Spatial Microsoft SQLServer Microsoft SQLServer PostgreSQL PostGIS MySQL MySQL (MySpatial) I database e I DBMSs Trento, venerdì 24 giugno 2011, CORSO GEODATABASE E allora come scegliere? Per effettuare una scelta, la spesa non è il solo fattore da tenere in considerazione, ma è comunque importante ... Fonte: Wikipedia 1 I database e I DBMSs Fonte:rivenditori, costi espressi in dollari, 2007 2 Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Tanto per complicare un pò le cose... Differentemente dai database relazionali, i database NoSQL gestiscono ed immagazzinano i dati attraverso grafi o array associativi. NoSQL viene usato quando si hanno piccole transazioni di lettura/scrittura o grandi transazioni di sola lettura. Esempi di database NoSQL sono: il database di Facebook (50TB), di eBay (2PB): NoSQL è stato pensato per avere un'architettura distribuita quindi I dati sono estremamente ridondanti (in totale), ma polverizzati su un grande numero di server e sono alla base di moltissime applicazioni di Cloud Computing. Esistono moltissimi DBMS NoSQL: BigTable di Google, MongoDb, Cassandra di Apache, Dynamo di Amazon, Project Voldemort di LinkedIn DBMS NoSQL con estensione spaziale sonos Neo4j, e AllegroGraph: quest'ultimo usa il Resource Description Framework (RDF) ed usa SPARQL (Sparql Protocol and RDF Query Language) diventando di fatto un GIS semantico Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Ma cos'è l'estensione geografica... Quando un database viene “spatially extended”, vengono creati dei tipi di dati nuovi (ad esempio il tipo geometry), vengono fornite le funzioni per operare su questi tipi di dati, vengono attivate delle procedure per verificare la consistenza di questi nuovi dati nel database, e, a volte, vengono forniti delle procedure che ottimizzino l'accesso alle informazioni registrate. Ogni (R)DBMS implementerà differentemente gli oggetti di tipo spaziale. Per favorire l'interoperabilità, oggi quasi tutte le estensioni spaziali utilizzano delle definizioni comuni: Simple feature access (SFA; ISO 19125) Il punto chiave di questo standard ISO è la rappresentazione delle entità vettoriali utilizzando un formato unico: il Well-known Text (WKT) sia per gli oggetti geografici, sia per il sistema di riferimento degli stessi. Per migliorare l'esigenza di memorizzazione si utilizza anche il Well-known Binary (WKB). POINT(0 0) è la descrizione WKT di un punto 0101000020E61 è lo stesso punto in WKB Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Che tipi di primitive sono previsti dall'ISO 19125? Tipi base: POINT(0 0) ● LINESTRING(0 0,1 1,1 2) ● POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) ● MULTIPOINT(0 0,1 2) ● MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4)) ● MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1))) ● GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4))) ● Inoltre, sono previsti I tipi TIN (Triangulated Irregular Network) e POLYHEDRALSURFACE, Le coordinate possono essere 2D (x,y), 3D (x,y,z), 4D (x,y,z,m) con m che fa parte del linear referencing Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE E i sistemi di riferimento? PARAM_MT["Mercator_2SP", PARAMETER["semi_major",6370997.0], PARAMETER["semi_minor",6370997.0], PARAMETER["central_meridian",180.0], PARAMETER["false_easting",-500000.0], PARAMETER["false_northing",-1000000.0], PARAMETER["standard parallel 1",60.0]] PARAM_MT["Affine", PARAMETER["num_row",3], PARAMETER["num_col",3], PARAMETER["elt_0_1",1], PARAMETER["elt_0_2",2], PARAMETER["elt 1 2",3]] Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE ...SQL-MM Part 3 SQL Multimedia Applicatio Spatial (ISO 13249-3:2006) estende le primitive descritte precedentemente con delle curve interpolate con archi di circonferneza (tolleranza: 1E-8) CIRCULARSTRING(0 0, 1 1, 1 0) Simile alla LINESTRING COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1)) CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)) MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4)) MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10),(11 11, 11.5 11, 11 11.5, 11 11))) Il tipo COMPOUNDCURVE può contenere anche degli elementi LINESTRING. Il tipo MULTICURVE può essere un insieme di CURVE, LINESTRING, CIRCULARSTRING e COMPOUNDSTRING Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE ...ma che me ne faccio dello STANDARD? Uso gli standard quando voglio garantire l'interoperabiltà: voglio che i dati vengano visualizzati (e processati) da persone, uffici, enti (...) diversi che usano software diversi. Lo standard diventa una LINGUA FRANCA per la comunicazione delle informazioni. Se, in un database con estensione spaziale, ho dei dati in formato standard posso comunicare con questi altri geodatabase: Postgres/PostGIS, Oracle Spatial (9i,10g,11g), MySQL (4.1+), Informix (9,10,11 con Spatial datablade), Microsoft SQL Server, SpatiaLite, Teradata (6.1, 6.2, 12, 13), Ingres GeoSpatial, altibase 5.x, AUTODESK MapGuide, GDAL Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE OK, ma perchè usare RDBMS? Gli RDBMS sono nati per potere gestire ENORMI quantità di dati in maniera che si possa accedere o operare su queste informazioni in maniera veloce, e che molti utenti possano usufruire della banca dati in maniera contemporanea: Struttura client/server MySQL PostgreSQL demone mysqld postmaster configurazione my.cnf postgresql.conf autenticazione e sicurezza porta pg_hba.conf 3306 mappatura utenti superuser client Backup/restore Dal database al geodatabase 5432 pg_ident.conf root postgres mysql psql mysqldump pg_dump Trento, venerdì 24 giugno 2011, CORSO GEODATABASE 4 persone che lavorano sui MIEI dati CONTEMPORANEAMENTE? Quasi tutti I database (anche alcuni NoSQL) permettono a più client di modificare il contenuto delle tabelle in contempranea attraverso il protocollo ACID: Atomicity, Consistency, Isolation e Durability: atomicità: la transazione è indivisibile nella sua esecuzione e la sua esecuzione deve essere o totale o nulla, non sono ammesse esecuzioni intermedie; consistenza: quando inizia una transazione il database si trova in uno stato consistente e quando la transazione termina il database deve essere in uno stato consistente, ovvero non deve violare eventuali vincoli di integrità, quindi non devono verificarsi contraddizioni (inconsistency) tra i dati archiviati nel DB; isolamento: ogni transazione deve essere eseguita in modo isolato e indipendente dalle altre transazioni, l'eventuale fallimento di una transazione non deve interferire con le altre transazioni in esecuzione; durabilità: detta anche persistenza, si riferisce al fatto che una volta che una transazione ha richiesto un commit work, i cambiamenti apportati non dovranno essere più persi. Per evitare che nel lasso di tempo fra il momento in cui la base di dati si impegna a scrivere le modifiche e quello in cui li scrive effettivamente si verifichino perdite di dati dovuti a malfunzionamenti, vengono tenuti dei registri di log, dove sono annotate tutte le operazioni sul DB.. Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE …e le dimensioni contano... Quando si lavora su grandi quantità di dati (layers > 1GB) i GIS tradizionali possono diventare molto lenti. Gli RDBMS utilizzano gli indici per velocizzare la ricerca dei dati. Fondamentalmente un indice è la copia di una parte dei dati presenti in una relazione (tablle). Alcuni database permettono un'indicizzazione creata per mezzo di funzioni od espressioni (ad esempio upper(cognome) immagazzina solamente l'iniziale maiuscola del campo cognome) o per mezzo di filtri, dove l'indice immagazzina solamente i valori che rispondono a qualche espressione condizionale. Come esistono molti modi di ordinare I dati, esistono molti indici diversi: B-Trees: indici pensati per numeri, lettere (come nella rubrica telefonica), date... R-Trees: ordinano i dati in rettangoli, sotto rettangoli, sotto-sotto rettangoli... Sono usati da alcuni GIS (GRASS) e da qualche estensione spaziale (ad esempio SpatiaLite) GIST (Generalized Search Tree): “cose che stanno da una parte”, “”cose che si sovrappongono”... Usato da PostGIS . Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE ...ma quanto convengono gli indici? Esempio di ricerca di una particolare stringa all'interno di un campo di 490000 elementi circa... . SELECT fullname FROM utenti WHERE fullname LIKE '%Zottele%'; La query impiega 187ms e ritorna 8elementi: non c'è un indice sul campo fullname e quindi viene effettuata una full table scan. CREATE INDEX idx_utenti_fullname_btree_ops ON utenti USING btree (fullname varchar_pattern_ops); SELECT fullname FROM utenti WHERE fullname LIKE '%Zottele%'; La query impiega ora 13ms (14x). CREATE INDEX idx_utenti_email_btree_ops ON utenti USING btree email varchar_pattern_ops) SELECT email FROM utenti WHERE email LIKE '%@yahoo.com'; Questa query impiega 271 ms: il campo email è indicizzato, ma si effettua una full table scan poiché l'ordinamento della stringa avviene da sinistra verso destra ed il campo discriminante è “nascosto” dalla wildcard. SELECT email FROM clienti WHERE reverse(email) LIKE reverse('%@yahoo.com'); Il campo di ricerca diviene moc.oohay@% e l'indicizzazione avviene efficientemente (9ms,30x) Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE ...e per i dati geografici? Lo standard ISO prevede che in un'estensione spaziale OGC compliant sia presente il dimensionally extended nine-intersection model (DE-9IM): un modello topologico che descrive il rapporto spaziale di due geometrie in 2 dimensioni. Inoltre devono essere implementate ulteriori funzioni (buffer, distanza, lunghezza, area perimetro, linear referencing). Queste funzionalità, rese veloci dalla presenza degli indici, appositamente pensati per I dati geometrici, rendono di fatto l'estensione spaziale un vero e proprio GIS. Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE … tutti i dati di tutti su un'unico DBMS? Il pericolo di avere un'unico repository di dati è che, se questo repository non è più disponibile (salta la corrente) l'utente non può più accedere ai dati! Gli RDBMS risolvono questo problema grazie alla replicazione: il database è replicato su molte macchine e le richieste possono essere ridirezionate su un'altra macchina in caso di manutenzione o rottura di un nodo. Esistono molti tipi diversi di replicazione e la replicazione può essere costosa sia dal punto di vista dell'hardware (più computer) o del software (licenze aggiuntive). I NoSQL DBMS utilizzano invece la distribuzione di porzioni ridondanti di database su molte macchine Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE … ma è difficile utilizzare un geoDBMS? Dal punto di vista dell'utente che richiede i dati: NO se si usa un client GIS (qgis, GRASS, ArcGIS...). Basta connettersi alla base dati e analizzare le informazioni. Se però si dovesse operare direttamente sul DBMS (creare nuove tablle...) o interrogare il DBMS attraverso interfacce a basso livello (GDAL, R, MapServer) allora è necessario conoscere il linguaggio SQL. SQL (Structured Query Language) è il linguaggio utilizzato per accedere e gestire i dati di un (R)DBMS, per creare e modificare la struttura del database e per gestire l'accesso agli oggetti contenuti. Sebbene SQL sia uno standard ANSI e ISO, molti database estendono supportano estensioni al linguaggio (dialetti). La prima versione dell'SQL fu sviluppata da IBM nei primi anni '70 col nome di SEQUEL. Dal 1986, SQL è uno standard ISO, la versione attuale è SQL:2008. L'operazione più comune nell'SQL è la query: per mezzo dell'operatore SELECT vengono estratti i dati da una o più relazioni (JOIN). Il comando non ha effetti persistenti sui dati (sono persistenti INSERT,UPDATE,DELETE). Le transazioni sono delle query successive che devono essere eseguite in gruppo. Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE … ma è difficile gestire un DBMS? (1/3) NO, ma dipende dal grado di performance che si vuole fornire agli utenti. La performance può dipendere da quale DBMS si usa, da come si ottimizza il DBMS, da quanti/quali indici vengono applicati e da come gli indici vengano aggiornati. PostgreSQL vs MySQL (MyISAM vs InnoDB) sottoposti a carichi variabili (processi concorrenziali vs richieste per secondo), con due processori differenti (SUN 1.0 GHz Niagara vs dual INTEL 3.0 GHz Woodcrest) Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE … ma è difficile gestire un DBMS? (2/3) Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE … ma è difficile gestire un DBMS? (3/3) HW: HP ProLiant DL370 G6, Intel Xeon W5580-Nehalem [email protected] GHz cores. OS: Red Hat Enterprise Linux 5.4 (2.6.18-164.eI5), Windows Server Enterprise Edition R2 DB: PostgreSQL 8.4.0, SQL Server 2008 R2 Dal database al geodatabase Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Trento, venerdì 24 giugno 2011, CORSO GEODATABASE Database relazionali FOSS e GeoDatabase PostgreSQL, Data Base Open Source e GRASS Marco Ciolli, Fabio Zottele Dipartimento di Ingegneria Civile e Ambientale Universita' degli Studi di Trento GRASS, FREE ed OPEN SOURCE GIS e GEODATABASE Trento, 20 – 24 giugno 2011 Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Gestione dei Data Base in GRASS • La gestione dei DB può avvenire in GRASS seguendo differenti procedure a seconda delle versioni di GRASS utilizzate. • Le procedure non sono equivalenti e la scelta di una di esse fornisce strumenti differenti di analisi e trattamento dei dati In particolare i dati alfanumerici collegati ai dati geografici possono essere gestiti: • Direttamente dal motore di GRASS La gestione diretta dei dati da parte di GRASS non garantisce il rispetto delle principali funzioni dei DB (coerenza, ecc.) il formato dei file è dbf • Per mezzo di DataBase esterni interfacciati con GRASS in modo più o meno diretto La gestione dei dati tramite Data Base esterno è più affidabile ed aumenta significativamente le capacità di analisi e trattamento dei dati Qui si accenneranno varie procedure soffermandoci in particolare sulle versioni 6.2.x di GRASS interfacciate con PostgreSQL. Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Perché conviene utilizzare un archivio esterno a quello di GRASS La gestione diretta dei dati da parte di GRASS poteva portare a: • ridondanza dei dati e inconsistenza; • problemi di concorrenza per l’accesso ai dati contemporaneo da parte di più utenti; • perdita di integrità dei dati; • problemi di sicurezza; • problemi di efficienza dal punto di vista dei tempi di: - ricerca dei dati; - aggiornamento dei dati. Un DBMS, concepito appositamente per gestire archivi e quindi dotato di tutti gli strumenti necessari a questo scopo oltreché di caratteristiche di flessibilità ed espandibilità, permette di ottenere un approccio più mirato nella gestione dei dati. Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Due tipi di interfaccia L’interfaccia tra GRASS e PostgreSQL è stata realizzata seguendo due diversi approcci: Interfaccia diretta Interfaccia mediante ODBC GRASS GRASS Interfaccia GRASS/Postgres Interfaccia GRASS/ODBC PostgreSQL PostgreSQL Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale ODBC driver ODBCPostgreSQL http://grass.osgeo.org/grass64/manuals/html64_user/database.html GRASS può essere collegato ad uno od a molti database management systems (DBMS). Il set di comandi db.* fornisce un supporto di base SQL per la gestione degli attributi, mentre il set di comandi v.db.* opera sulle mappe vettoriali. Alcune ulteriori funzioni sono state rese disponibili recentemente * Categorie: Il numero di categoria è il vector ID. E' usato per collegare lo/gli attributi a ciascun oggetto vettoriale. Un oggetto vettoriale può avere zero, una, due o più categorie. I numeri di Categoria sono immagazzinati entrambi dentro il file della geometria ed all'interno della tavola degli attributi per ciascun oggetto vettoriale (generalmente la colonna "cat"). Usando v.category, i numeri di categoria possono essere stampati o mantenuti. Per fare in modo di collegare un oggetto vettoriale a parecchie tavole diverse, sono necessari diversi numeri di categoria per ciascun oggetto vettoriale. * Layers: E' possibile collegare gli oggetti geografici in una mappa vettoriale a una o più tabelle. Ciascun collegamento (link) a un tabella degli attributi diversa è chiamato “layer”. Un link definisce quale database driver, quale database e quale tabella deve essere usata. Ciascun numero di categoria in un file della geometria corrisponde ad una riga nella tabella degli attributi (generalmente la colonna "cat"). Usando v.db.connect i layers possono essere listati o mantenuti. I layers di GRASS non contengono oggetti geografici, ma consistono in link alle tavole degli attributi nei quali gli oggetti vettoriali possono avere zero, una o più categorie. Se un oggetto vettoriale ha zero categorie in un layer, allora non appare in quel layer. In questa maniera alcuni oggetti vettoriali possono apparire in alcuni layer ma non in altri. Il beneficio pratico di questo sistema è che permette di collocare oggetti tematicamente distinti ma topologicamente correlati in una singola mappa (per esempio foreste e laghi, o aree coltivate e bacini di raccolta idrica). Questi layers virtuali sono anche utili per collegare serie temporali di dati ad una serie di oggetti che non cambiano nel tempo. Per convenzione il primo layer è quello attivo, per esempio la prima tabella corrisponde al primo layer. Ulteriori tabelle sono collegate ai layer successivi. * SQL support: Il driver DBF fornisce un supporto molto limitato all'SQL mentre gli altri DBMS backends (come PostgreSQL, MySQL etc) forniscono un pieno supporto SQL poiché i comandi SQL sono inviati direttamente al DBMI. I comandi SQL possono essere direttamente eseguiti con db.execute, db.select e gli altri moduli db.*. Quando si crea una tabella nuova, si deve creare una tabella degli attributi e la tabella deve essere popolata con una riga per ogni categoria (usando v.to.db). Questa operazione si può realizzare anche in un solo passaggio usando v.db.addtable insieme con la definizione dei tipi di colonna della tabella. comandi db e di interazione con i db: a cosa servono comandi db • comandi per connessione db: 1. db.connect 2. db.test 3. db.drivers 4. db.login • comandi per tabelle: 1. db.columns 2. db.copy 3. db.describe 4. db.tables • comandi che consentono esecuzione query SQL (operazioni su tabelle): 5. 6. db.execute db.select db.connect - Permette la connessione ad un database tramite un interfaccia dbm db.test Effettua un test del driver db per verificarne l'operatività db.drivers - Mostra la lista dei driver db disponibili db.login - Setta user e password di un certo driver db db.columns Permette di visualizzare le colonne di una data tabella contenuta in un database Quando il database è connesso e le tabelle sono visibili è possibile però usare anche l'interfaccia grafica, più user friendly, per visualizzare le colonne di una data tabella contenuta in un database db.copy - Permette all'utente di copiare una tabella fra due database che possono anche essere connessi attraverso drivers differenti db.describe Permette di visualizzare le informazioni inerenti una tabella. Se viene usato il parametro -c si ottengono solo i nomi delle colonne invece della descrizione completa db.tables Fa la lista di tutte le tabelle contenute in un database db.execute Esegue delle stringhe SQL scritte direttamente oppure contenute in file di testo db.select - Stampa il risultato della selezione effettuata su un database a partire da una stringa SQL letta da un file di input oppure scritta nell'interfaccia I comandi db e di interazione vector-db: a cosa servono comandi v.db • comandi per connessione vector-db: 1. 2. 3. 4. 5. 6. v.db.connect v.to.db v.db.update v.db.addtable v.db.droptable v.db.reconnect.all • comandi che consentono esecuzione query SQL sui dati contenuti nelle tabelle: 1. 2. 3. 4. Display Manager d.vect v.extract v.reclass v.db.connect Stampa o setta la connessione database per un determinato vettoriale v.to.db - Permette di inserire in un database i dati provenienti da un file vettoriale v.db.update Permette di assegnare un nuovo valore ad una colonna connessa ad una certa mappa v.db.addtable - crea e aggiunge una nuova tabella degli attributi ad un layer dato di una mappa vettoriale esistente v.db.droptable – rimuove la tabella degli attributi di una mappa vettoriale esistente v.db.reconnect.all – riconnette i file vettoriali a un nuovo database db.dropcol: Elimina una colonna da una tabella degli attributi selezionata E ancora: db.in.ogr: Importa tabelle degli attributi in vari formati db.out.ogr: Exporta tabelle degli attributi in vari formati Visualizzazione di una tabella dati dal layer manager E' possibile visualizzare il contenuto di una tabella collegata al layer visualizzato Realizzazione di una query dal table manager E' possibile realizzare una query direttamente dal table manager, in questo caso tutti I SIC del Trentino con superficie maggiore 4000 ettari Realizzazione di una query dal table manager E' possibile utilizzare il query builder del table manager Realizzazione di una query dal table manager Aggiungere layers di mappe vector dal Table Manager Eliminare layers di mappe vector dal Table Manager Modificare layers di mappe vector dal Table Manager Gestire tabelle di mappe vector dal Table Manager esecuzione di una query dal d.vect si richiede la visualizzazione delle zone di censimento aventi area minore di 500000 Funziona con i monitor lanciati da d.mon esecuzione di una query dal layer manager Qui si richiede la visualizzazione dei SIC del Trentino la cui superficie sia minore di 4000 ettari esecuzione di una query dal gis.m (tcltk - old) E' possibile selezionare le modalità di visualizzazione degli oggetti, visualizzare il risultato di una query sul monitor attivo ed estrarre un nuovo vettoriale dal risultato della query qui si richiede la visualizzazione degli edifici di Trento con quota del tetto minore di 10 m esecuzione di una query dal v.extract si richiede che venga creata una nuova mappa contenente solo le strade per cui l’emissione tra le ore 8 e le 9 sia maggiore di 5000 (g CO/km) d.what.vect -help Description: Allows the user to interactively query a vector map layer at user-selected locations within the current geographic region. Usage: d.what.vect [-1txdfe] [map=name[,name,...]] Flags: -1 Identify just one location -t Terse output. For parsing by programs. -x Print information as plain text to terminal window. -d Print topological information (debugging). -f Enable flashing (slower). -e Open form in edit mode. Da terminale: Vector -> Query with mouse (Form mode, editing enabled) d.what.vect -e nomefile La vecchia interfaccia d.m è ancora attiva, si richiama da console digitando: d.m& Essa utilizza i monitor x1, x2, x3 Solo il Postmaster può far partire questo script per creare un nuovo database v.db.univar: Calcola statistica univariata sulla colonna selezionata di una tabella per una mappa vector v.db.join: Permette di fare operazioni di join (joining) fra una tabella ed una tabella di una mappa vector v.db.renamecol: Rinomina una colonna nella tabella degli attributi connessa a una data mappa vector v.db.dropcol: Elimina una colonna dalla tabella degli attributi connessa a una data mappa Confrontando l’ODBC con l’interfaccia diretta Svantaggi interfaccia GRASS-ODBC: • L’accesso è più lento, ci sono più strati software da attraversare. • Maggior occupazione di memoria. Vantaggi interfaccia GRASS-ODBC : • Indipendenza dal software DBMS utilizzato, dato che con un’unica interfaccia per ODBC, vi è una maggiore facilità nelle operazioni di upgrade del sistema: esistendo i driver ODBC per molti gestori di basi di dati è possibile passare ad un altro gestore dell’archivio senza dover riscrivere i programmi di interfaccia realizzati che, comunicando con lo strato ODBC e non direttamente con il gestore della base di dati, sono sempre validi indipendentemente dal DBMS utilizzato. Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale pgDesigner2 http://pgdesigner.sourceforge.net/it/index.html pgDesigner2 pgDesigner2 L’Open GIS Consortium, Inc. (OGC) è una organizzazione no-profit che tenta di stabilire dei criteri per favorire l’interoperabilità tra i software che trattano dati geografici. http://www.opengis.org/index.htm MapServer http://mapserver.gis.umn.edu/ http://ems-hitech.com/pgmanager/?src=overture Attenzione, questo però non è Open Source! Questa ditta rilascia il codice sorgente di alcuni suoi prodotti (per esempio Mammoth PostgreSQL Replicator per PostgreSQL 7.3.6 e 7.4+) ma tale software non è distribuibile a meno che la ditta stessa non cessi l’attività Creazione ed accesso all’archivio da console Per iniziare si deve creare un archivio: all’interno di questo verranno poi definite le diverse tabelle di dati correlati che si vorranno gestire per mezzo di PostgreSQL. % createdb nomedb nomedb è il nome del database che si vuole creare. Una volta creato il database vi si può accedere mediante il comando: % psql nomedb Esempio: % createdb grass % psql grass grass => Ho creato e aperto un archivio chiamato grass; l’ultima riga è la riga di comando dalla quale lanciare il comando SQL per lavorare sull’archivio. grass =>\q % Esco dall’archivio, ritorno alla linea di comando della shell di UNIX. Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale E’ possibile popolare il database anche creando delle tabelle vuote da riempire con dati in formato ASCII L’utente deve essere già collegato (cioè deve eseguito psql) con l’archivio nel quale vuole lavorare. Per creare una tabella è necessario definire nome e attributi che la comporranno: CREATE TABLE nometab (nomeattr tipoattr [,elenco attr]); Esempio: grass => CREATE TABLE datamap (coord box, dg float8); In questo caso creo, nella base di dati grass, una tabella chiamata datamap, con due attributi: uno nominato coord e di tipo box, l’altro nominato dg e di tipo float8. La creazione di una tabella PostgreSQL si può ottenere anche tramite l’interfaccia PGAccess in maniera più guidata e facilitata Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Importare i dati nelle tabelle PostgreSQL Definite le tabelle è possibile popolarle con i dati, caricandoli da un file ascii, con: COPY nometab FROM input USING DELIMITERS ‘separatore’; nometab è il nome della tabella in cui si vogliono copiare i dati; input è il nome del file con i dati da inserire; separatore è il carattere scelto per separare i diversi campi di un record (non usate il tab). Es.: COPY datamap FROM ‘/home/alf/dati.csv’ USING DELIMITERS ‘;’; In questo esempio copio nella tabella datamap, creata prima, i dati contenuti nel file dati.csv; in questo file gli attributi di ogni record saranno separati dal simbolo ;. E’ indispensabile che i dati da importare abbiano la stessa struttura della tabella Se il file ha più colonne della tabella nella quale lo si vuole copiare, quelle in eccedenza vengono ignorate da PostgreSQL e un messaggio ci avvisa di questo. Per inserire pochi valori si può usare il comando INSERT INTO nometabella VALUES (seriedivalori); La stessa operazione ottenuta col comando COPY si può realizzare con PGAccess Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Formato dei file ascii Nel file ascii che si vuole utilizzare come fonte per i dati da inserire nelle tabelle gestite da PosgreSQL è necessario: • inserire un record per ogni riga; • separare gli attributi che compongono un record con un carattere separatore a cui poi si dovrà fare riferimento quando si darà il comando copy oppure nel field delimiter della finestra di PGAccess; • indicare il termine dell’elenco con la seguente sequenza di caratteri: \. Esempio: (6.000000,36.000000),(6.000000,36.000000)|10.3400 (6.050000,36.000000),(6.050000,36.000000)|11.3600 (6.100000,36.000000),(6.100000,36.000000)|12.3900 (6.150000,36.000000),(6.150000,36.000000)|12.0800 \. Un file ascii costruito in questo modo permette di popolare la tabella datamap, definita in precedenza, con l’elenco dei dati posto nel file. Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale pgAdminIII http://www.pgadmin.org/ http://www.pgadmin.org/ http://www.pgadmin.org/ PgAccess è un'interfaccia grafica per PostgreSQL scritta in Tcl/Tk, che permette di gestire facilmente l'archivio: operazioni sulle tabelle, interrogazioni,..., senza dover ricorrere ai comandi in linea e può essere visualizzata in contemporanea con GRASS. Questo consente un rapido accesso alle tabelle e di poter effettuare al di fuori di GRASS tutte quelle elaborazioni che non sono direttamente vincolate alla geometria degli oggetti risparmiando tempo e risorse. Purtroppo lo sviluppo è apparentemente fermo da qualche anno. Lo sforzo che era stato fatto era quello di trasformarlo in uno strumento per scrivere applicazioni che lavorano in una struttura distribuita client-server model (un database centrale PostgreSQL e dei remote clients). E’ disponibile per Linux,Unix, MacOS, Windows. Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale http://sourceforge.net/projects/pgaccess http://rpmfind.net/linux/rpm2html/search.php?query=pgaccess Tabella - apertura di tabelle multiple per la visualizzazione, con massimo numero di records (modificabile dal menù preferences) - ridimensionamento colonne, con il drag della linea di griglia verticale - text wrap in cells - layout salvato per ogni tabella - import/export a file esterni (SDF,CSV) - filter capabilities (enter filter like (price>3.14) - sort order capabilities (enter manually the sort field(s)) - editing in place - migliorato il table generator assistant - migliorato il field editing Queries - define, edit and stores "user defined queries" - salva le queries come views (viste) - esecuzione di queries con parametri opzionali dell’utente ( select * from invoices where year=[parameter "Year of selection"] ) - viewing of select type queries result - query deleting and renaming - visual query builder with drag & drop capabilities. For any of you who had installed the Tcl/Tk plugin for Netscape Nav. Sequences - defines sequences, delete them and inspect them Functions - define, inspect and delete functions in SQL, plpgsql and pgtcl languages Reports - design and display simple reports from tables - fields and labels, font changing, style and size - saves and loads report description from database - show report previews, sample postscript output file Forms - open user defined forms - form design module available - query widget available, controls bound to query results Scripts - define, modify and call user defined scripts Users - define and modify user information Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Finestra di PGAccess per la creazione di una nuova query (Query Builder): si scrivono le operazioni in linguaggio SQL nell’apposito spazio (in cui è abilitato il copia ed incolla da clipboard) e successivamente si può salvare la query attribuendole un nome, in modo da poterla eseguire tutte le volte che è necessario. CREATE VIEW [nome view] AS… SELECT * FROM [nome view] Quindi schiacciando il tasto “Esegui Query” appare la finestra : Finestra che segnala che si sta eseguendo una query d’azione che porta alla creazione di una “View”, una tabella per la visualizzazione dei risultati della query stessa. Cliccando su “Yes”, PostgreSQL esegue le operazioni immesse nella finestra “Query Builder”, e se queste sono state scritte correttamente, apparirà un’altra finestra di dialogo. Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale La view crea una sorta di interrogazione permanente che acquista la personalità di una tabella normale. Finestre in cui si visualizzano le query e le view salvate. La figura di sinistra mostra le query (in questo caso sono tutte query d’azione) e la figura di destra mostra le corrispondenti view. Per visualizzare una di queste, è sufficiente fare un doppio clic sul nome, o selezionare la view desiderata e premere il pulsante “Apri”. Finestra in cui si visualizzano le view, richiamabile doppiocliccando sul nome delle view nella finestra visualizzata sopra. La View visualizzata è quella denominata “coemissioni”, e dunque relativa alle emissioni totali di CO di ogni strada Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale DBdesigner4 DBdesigner4 un tool per progettare facilmente i data base (supporta MySQL ma, per ora, non PostgreSQL) DB-Designer Fork DB Designer Fork is a fork of the fabFORCE DBDesigner 4. It integrates entity relationship design,front-end (you can run queries) and SQL exporting. DB Designer Fork generates SQL scripts for Oracle, SQL Server, MySQL, FireBird, SQLite and PostgreSQL. phpPgAdmin phpPgAdmin http://grass.osgeo.org/wiki/Openoffice.org_with_SQL_Databases http://dba.openoffice.org/ http://mdbtools.sourceforge.net/ Bibliografia • AA.VV.: "PostgreSQL Programmer's Guide", Regent of the University of California, 1995. • AA.VV.: "PostgreSQL User's Guide", Regent of the University of California, 1995. • V.S. Subrahmanian: “Principles of multimedia database system”, Morgan Kaufmann, 1998 • M. A. Brovelli, M. Negretti, C. Saldarini: “GRASS interfacing with DBMSs”, Geomatics Workbooks • Indexing tree methods and spatial ordering for maps and geographic data: an overview and application to the geodetic gis project, atti del congresso ISPRS - WG VI/3 "International cooperation and technology transfert", Parma, 15-19 febbraio 1999 L. Biagi, M. A. Brovelli, M. Negretti and C. Saldarini; • Nuove metodologie GIS per la stima e l’aggiornamento del geoide, pp.123-165, tesi di Laurea svolta presso il Politecnico di Milano, 1999, M. Negretti, C.Saldarini. • Ciolli M. Dispense del Corso GRASS e OPEN SOURCE GIS teoria ed applicazioni 1a edizione - anno 2003, 2a edizione - anno 2004, 3a edizione - anno 2005, 4a edizione - Roma anno 2006, 5a edizione Trento anno 2006, 6a edizione Trento anno 2007. • File sorgenti e manuali di PostgreSQL: http://www.postgresql.org e http://techdocs.postgresql.org/ • Interfaccia grafica PgAccess: http://www.flex.ro/pgaccess/ e www.pgaccess.org • File sorgenti e manuali di GRASS: http://grass.itc.it/ • http://www.html.it/sql •Suffritti P., Appunti sui DataBase Relazionali e sul linguaggio SQL. http://www.suffritti.it/SQLTutorial.htm • L.Biagi, M.A.Brovelli, M.Negretti, Caratteristiche di PostgreSQL http://www.geo.unipr.it/~gis/TUTORIALS/POSTGRESINTRO/postgres.pdf •M. Zanoni, Implementazione di un sistema integrato gis–database per la gestione dei dati di traffico e produzione di mappe delle emissioni. applicazione alla città di Trento. Tesi di Laurea Ingegneria Trento 2003 •C. Modena, Analisi e delimitazione delle aree forestali con particolare funzione protettiva in Trentino tramite tecniche GIS. Tesi di Laurea Ingegneria Trento 2003 •A. Daloli, Strutturazione e sviluppo di un Database in Postgresql per l’analisi dei dati di traffico Tesi di Laurea, Ingegneria Trento 2002 •Alla presente lista si aggiungano tutte le fonti web citate nei lucidi. Marco Ciolli, Dipartimento di Ingegneria Civile e Ambientale