UNIVERSITÀ DEGLI STUDI DI UDINE Dipartimento di Scienze Agrarie CORSO DI LAUREA IN SCIENZE E TECNOLOGIE DELL’AMBIENTE E DEL TERRITORIO Caso di Studio: ANAGRAFE AZIENDE AGRICOLE 1 Descrizione del dominio applicativo Si vuole gestire l’anagrafica delle aziende agricole della regione Friuli Venezia Giulia. Per ogni azienda si vuole mantener traccia del Codice Univoco di identificazione delle Aziende Agricole1 , della denominazione, dei proprietari (per ognuno nome, cognome, codice fiscale), della sede legale (via, civico, comune e provincia), di uno o più numeri di telefono e delle diverse sedi in cui viene svolta l’attività. Per ogni sede di attività si vuole gestire i riferimenti della particella catastale (con mappale catastale e superficie). Per le particelle su cui viene svolta l’attività di coltivazione si vuole tener traccia del tipo di irrigazione disponibile (nessuno, a pioggia o a scorrimento), delle colture coltivate e se la coltivazione è gestita in rotazione2 o meno. Nel caso in cui la particella sia coltivata fuori rotazione si vuole l’indicazione sulla percentuale di terreno coltivata per ogni coltura. Nel caso di particelle gestite in rotazione si vuole l’informazione relativa all’ordine di gestione delle diverse colture. Per le particelle su cui viene svolta l’attività di allevamento si vuole tener traccia del numero di animali gestiti per specie (suini, bovini, equini, etc.) 1 Il CUAA, corrispondente al codice fiscale, è il numero identificativo da utilizzarsi in tutti i rapporti con la pubblica amministrazione, ai sensi dell’art. 1, comma 2, del D.P.R. 503/99. 2 La rotazione delle colture o avvicendamento colturale è una tecnica adottata in agricoltura e giardinaggio che prevede la variazione, da un ciclo produttivo all’altro, della specie agraria coltivata nello stesso appezzamento, al fine di migliorare o mantenere la fertilità del terreno agrario e garantire, a parità di condizioni, una maggiore resa. Si contrappone alla tecnica della monosuccessione, che consiste nella ripetizione sullo stesso appezzamento della coltura effettuata nel ciclo precedente. 1 e tipo di stabulazione utilizzato (a terra, box su lattiera, recinti individuali, etc.). Tenere presente che non tutti i tipi di stabulazione possono essere associati a tutte le specie animale. Inoltre, per ogni particella si vuole memorizzare informazioni relative al tipo di stoccaggio dei residui prodotti (vasca scoperta, platea per solidi, platea scoperta, platea coperta, etc.) con il relativo volume. 2 Progettazione Concettuale Lo schema risultante dalla progettazione concettuale rappresentato in Figura 1. Figura 1: Schema CGG. Note: - entità ATTIVITA: l’attributo tipo indica il tipo di attività svolta (coltivazione o allevamento, supponendo che possa essere o l’una o l’altra, non entrambe); 2 - relazione SU: l’attributo diritto indica la modalità con cui viene svolta l’attività sulla particella (proprietà, affitto, ...); 3 Progettazione logica Il primo passo della progettazione concettuale consiste nella ristrutturazione dello schema concettuale che, a partire dallo schema rappresentato in Figura 1, considererà i seguenti punti: 1. attributo multivalore telefono dell’entità AZIENDA: si introduce un’entità TELEFONO che viene legata all’entità AZIENDA mediante una relazione di tipo uno a molti; 2. attributo composto indirizzo dell’entità PARTICELLA: l’attributo composto mappale viene eliminato e sono mantenuti i singoli attributi semplici che lo compongono; 3. attributo composto indirizzo della relazione SEDELEGALE: l’attributo composto indirizzo viene eliminato e sono mantenuti i singoli attributi semplici che lo compongono; 4. specializzazione dell’entità ATTIVITÀ: supponendo che le attività (particelle su cui si svolge l’attività) vengano accedute per tipo di attività si decide di eliminare le entità padre e mantenere solo le figlie della specializzazione. Questa ristrutturazione porta a duplicare le relazioni su e svolge con relativi attributi. L’attributo tipo dell’entità attività perde poi di significato e può essere eliminato. Note: si perdono alcuni vincoli 1) il fatto che ogni azienda deve avere almeno un’attività sia essa di coltivazione o di allevamento 2) ogni particella ha associato un’unica attività (coltivazione o allevamento, non entrambe); 5. specializzazione dell’entità COLTIVAZIONE: supponendo che si sia interessati alle colture coltivate sulle diverse particelle, indipendentemente dal tipo di coltivazione (rotazione o fuori rotazione) si decide di eliminare le entità figlie della specializzazione. Note: si perde il vincolo secondo cui ogni attività di coltivazione deve aver associato almeno una coltura; 6. accorpamento di relazioni: le due relazioni coltiva (nate dalla ristrutturazione della specializzazione dell’entità COLTIVAZIONE) sono stae accorpate in un’unica relazione inglobando i due attributi che a questo punto diventano opzionali. Note: si riesce cosı̀ a vincolare ogni coltivazione ad essere associata ad almeno una coltura ma bisogna tener presente che almeno uno due 3 attributi (non entrambi) deve essere popolato. La popolazione di tali attributi deve essere anche uniforme rispetto al tipo di coltivazione definito. Lo schema CGG ristrutturato risulta quindi essere quello rappresentato in Figura 2. Figura 2: Schema CGG ristrutturato. Si può quindi procedere con traduzione vera e propria dello schema CGG ristrutturato sul modello logico relazionale esteso per il trattamento dei dati spaziali (gli attributi con nome the geom avranno infatti associato un dominio di tipo spaziale). 1. Procedendo con ordine, andiamo prima a tradurre tutte le entità: ST OCCAGGIO(codice, descrizione) descrizione NOT NULL ST ABU LAZION E(codice, descrizione) descrizione NOT NULL 4 AN IM ALE(codice, specie) specie NOT NULL COLT U RA(codice, nome) nome NOT NULL IRRIGAZION E(codice, descrizione) descrizione NOT NULL P ROV IN CIA(codiceistat, nome, the geom) nome NOT NULL COM U N E(codiceistat, provincia, nome, the geom) nome NOT NULL P ART ICELLA(provincia, comune, sezione, f oglio, numero, superf icie, the geom) superficie NOT NULL AZIEN DA(CU AA, denominazione, dataf ondazione, the geom) denominazione NOT NULL P ROP RIET ARIO(codicef iscale, nome, cognome, datanascita) nome, cognome, datanascita NOT NULL T ELEF ON O(azienda, numero) T IP OALLEV AM EN T O(stabulazione, animale) ALLEV AM EN T O(provincia, comune, sezione, f oglio, particella) COLT IV AZION E(provincia, comune, sezione, f oglio, particella) 2. Quindi, consideriamo le relazioni di tipo uno a molti che apporteranno delle modifiche ad alcune delle precedenti tabelle: relazione sede legale: AZIEN DA(CU AA, denominazione, dataf ondazione, the geom, provincia, comune, via, civico, cap) denominazione, provincia, comune, via, civico, cap NOT NULL 5 fk (provincia,comune) references COMUNE(provincia,codiceistat) relazione ha: T ELEF ON O(azienda, numero) azienda NOT NULL fk (azienda) references AZIENDA(CUAA) relazioni svolgeA e suA ALLEV AM EN T O(provincia, comune, sezione, f oglio, particella, azienda, diritto) azienda, diritto NOT NULL fk (azienda) references AZIENDA(CUAA) fk (provincia,comune,sezione,foglio,particella) references PARTICELLA(provincia,comune,sezione,foglio,numero) relazione svolgeC e suC COLT IV AZION E(provincia, comune, sezione, f oglio, particella, azienda, diritto) azienda, diritto NOT NULL fk (azienda) references AZIENDA(CUAA) fk (provincia,comune,sezione,foglio,particella) references PARTICELLA(provincia,comune,sezione,foglio,numero) relazione irriga COLT IV AZION E(provincia, comune, sezione, f oglio, particella, azienda, diritto, irriga) azienda, diritto, irriga NOT NULL fk (azienda) references AZIENDA(CUAA) fk (provincia,comune,sezione,foglio,particella) references PARTICELLA(provincia,comune,sezione,foglio,numero) fk (irriga) references IRRIGAZIONE(codice) 3. Infine, introduciamo le tabelle necessarie per la traduzione delle relazioni molti a molti: relazione proprieta: P ROP RIET A(azienda, proprietario) fk (azienda) references AZIENDA(CUAA) fk (proprietario) references PROPRIETARIO(codicefiscale) relazione dispone: DISP ON E(provincia, comune, sezione, f oglio, particella, stoccaggio, 6 Figura 3: Schema logico relazionale. volume) volume NOT NULL fk (provincia,comune,sezione,foglio,particella) references ALLEVAMENTO(provincia,comune,sezione,foglio,particella) fk (stoccaggio) references STOCCAGGIO(codice) relazione alleva: ALLEV A(provincia, comune, sezione, f oglio, particella, stabulazione, animale, quantita) quiantita NOT NULL fk (provincia,comune,sezione,foglio,particella) references ALLEVAMENTO(provincia,comune,sezione,foglio,particella) fk (stabulazione, animale) references TIPOALLEVAMENTO(stabulazione, animale) relazione coltiva: COLT IV A(provincia, comune, sezione, f oglio, particella, coltura, ordine, percentuale) check (ordine IS NOT NULL or percentuale IS NOT NULL) check (ordine IS NULL or percentuale IS NULL) fk (provincia,comune,sezione,foglio,particella) references COLTIVAZIONE(provincia,comune,sezione,foglio,particella) fk (coltura) references COLTURA(codice) 7 Lo schema logico relazionale finale risulterà essere quindi quello rappresentato in Figura 3. 4 4.1 Linguaggio SQL Creazione della base di dati CREATE TABLE STOCCAGGIO ( codice CHAR( 2 ) PRIMARY KEY , d e s c r i z i o n e VARCHAR( 3 0 ) NOT NULL UNIQUE ); CREATE TABLE STABULAZIONE ( codice CHAR( 2 ) PRIMARY KEY , d e s c r i z i o n e VARCHAR( 3 0 ) NOT NULL UNIQUE ); CREATE TABLE ANIMALE ( codice CHAR( 2 ) PRIMARY KEY , s p e c i e VARCHAR( 3 0 ) NOT NULL UNIQUE ); CREATE TABLE COLTURA ( codice CHAR( 2 ) PRIMARY KEY , nome VARCHAR( 3 0 ) NOT NULL UNIQUE ); CREATE TABLE IRRIGAZIONE ( codice CHAR( 2 ) PRIMARY KEY , d e s c r i z i o n e VARCHAR( 3 0 ) NOT NULL UNIQUE ); CREATE TABLE PROVINCIA ( c o d i c e i s t a t CHAR( 3 ) PRIMARY KEY , nome VARCHAR( 3 0 ) NOT NULL ); SELECT AddGeometryColumn ( ’ ’ , ’ p r o v i n c i a ’ , ’ the geom ’ , 4 3 2 6 , ’MULTIPOLYGON ’ ,2) ; CREATE INDEX i d x g i s t p r o v i n c i a ON p r o v i n c i a USING g i s t ( the geom ) ; CREATE TABLE COMUNE ( p r o v i n c i a CHAR( 3 ) REFERENCES PROVINCIA( c o d i c e i s t a t ) ON UPDATE CASCADE , c o d i c e i s t a t CHAR( 3 ) , nome VARCHAR( 3 0 ) NOT NULL , PRIMARY KEY ( p r o v i n c i a , c o d i c e i s t a t ) ); SELECT AddGeometryColumn ( ’ ’ , ’ comune ’ , ’ the geom ’ , 4 3 2 6 , ’MULTIPOLYGON ’ ,2) ; CREATE INDEX i d x g i s t c o m u n e ON comune USING g i s t ( the geom ) ; CREATE TABLE PARTICELLA ( p r o v i n c i a CHAR( 3 ) , comune CHAR( 3 ) , sezione CHAR( 1 ) , foglio INTEGER , numero INTEGER , s u p e r f i c i e NUMERIC( 1 0 , 2 ) NOT NULL , PRIMARY KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero ) 8 , FOREIGN KEY ( p r o v i n c i a , comune ) REFERENCES COMUNE( p r o v i n c i a , c o d i c e i s t a t ) ON UPDATE CASCADE ); SELECT AddGeometryColumn ( ’ ’ , ’ p a r t i c e l l a ’ , ’ the geom ’ , 4 3 2 6 , ’POLYGON ’ , 2 ) ; CREATE INDEX i d x g i s t p a r t i c e l l a ON p a r t i c e l l a USING g i s t ( the geom ) ; CREATE TABLE AZIENDA ( CUAA VARCHAR( 1 6 ) PRIMARY KEY , d e n o m i n a z i o n e VARCHAR( 3 0 ) NOT NULL , d a t a f o n d a z i o n e DATE , provincia CHAR( 3 ) NOT NULL , comune CHAR( 3 ) NOT NULL , via VARCHAR( 3 0 ) NOT NULL , civico VARCHAR( 5 ) NOT NULL , cap NUMERIC( 5 , 0 ) NOT NULL , FOREIGN KEY ( p r o v i n c i a , comune ) REFERENCES COMUNE( p r o v i n c i a , c o d i c e i s t a t ) ON UPDATE CASCADE ); SELECT AddGeometryColumn ( ’ ’ , ’ a z i e n d a ’ , ’ the geom ’ , 4 3 2 6 , ’POINT ’ , 2 ) ; CREATE INDEX i d x g i s t a z i e n d a ON a z i e n d a USING g i s t ( the geom ) ; CREATE TABLE PROPRIETARIO ( c o d i c e f i s c a l e CHAR( 1 6 ) PRIMARY KEY , nome VARCHAR( 3 0 ) NOT NULL , cognome VARCHAR( 3 0 ) NOT NULL , d a t a n a s c i t a DATE NOT NULL ); CREATE TABLE TELEFONO ( azienda VARCHAR( 1 6 ) REFERENCES AZIENDA(CUAA) ON DELETE CASCADE , numero VARCHAR( 1 0 ) , PRIMARY KEY ( a z i e n d a , numero ) ); ON UPDATE CASCADE CREATE TABLE TIPOALLEVAMENTO ( s t a b u l a z i o n e CHAR( 2 ) REFERENCES STABULAZIONE( c o d i c e ) ON UPDATE CASCADE , animale CHAR( 2 ) REFERENCES ANIMALE( c o d i c e ) ON UPDATE CASCADE , PRIMARY KEY ( s t a b u l a z i o n e , a n i m a l e ) ); CREATE TABLE ALLEVAMENTO ( p r o v i n c i a CHAR( 3 ) , comune CHAR( 3 ) , sezione CHAR( 1 ) , foglio INTEGER , p a r t i c e l l a INTEGER , PRIMARY KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ) , azienda VARCHAR( 1 6 ) REFERENCES AZIENDA(CUAA) , FOREIGN KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ) REFERENCES PARTICELLA( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero ) ON UPDATE CASCADE ); CREATE TABLE COLTIVAZIONE ( p r o v i n c i a CHAR( 3 ) , comune CHAR( 3 ) , sezione CHAR( 1 ) , foglio INTEGER 9 , p a r t i c e l l a INTEGER , PRIMARY KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ) , azienda VARCHAR( 1 6 ) REFERENCES AZIENDA(CUAA) ON UPDATE CASCADE , FOREIGN KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ) REFERENCES PARTICELLA( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero ) , i r r i g a CHAR( 2 ) REFERENCES IRRIGAZIONE( c o d i c e ) ON UPDATE CASCADE ); CREATE TABLE PROPRIETA ( azienda VARCHAR( 1 6 ) REFERENCES AZIENDA(CUAA) ON UPDATE CASCADE , p r o p r i e t a r i o CHAR( 1 6 ) REFERENCES PROPRIETARIO( c o d i c e f i s c a l e ) ON UPDATE CASCADE , PRIMARY KEY ( a z i e n d a , p r o p r i e t a r i o ) ); CREATE TABLE DISPONE ( p r o v i n c i a CHAR( 3 ) , comune CHAR( 3 ) , sezione CHAR( 1 ) , foglio INTEGER , p a r t i c e l l a INTEGER , FOREIGN KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ) REFERENCES PARTICELLA( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero ) ON UPDATE CASCADE , s t o c c a g g i o CHAR( 2 ) REFERENCES STOCCAGGIO( c o d i c e ) ON UPDATE CASCADE , volume NUMERIC( 5 , 2 ) NOT NULL , PRIMARY KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , stoccaggio ) ); CREATE TABLE ALLEVA ( p r o v i n c i a CHAR( 3 ) , comune CHAR( 3 ) , sezione CHAR( 1 ) , foglio INTEGER , p a r t i c e l l a INTEGER , FOREIGN KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ) REFERENCES PARTICELLA( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero ) ON UPDATE CASCADE , s t a b u l a z i o n e CHAR( 2 ) , animale CHAR( 2 ) , FOREIGN KEY ( s t a b u l a z i o n e , a n i m a l e ) REFERENCES TIPOALLEVAMENTO( s t a b u l a z i o n e , a n i m a l e ) ON UPDATE CASCADE , quantita INTEGER NOT NULL , PRIMARY KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , stabulazione , animale ) ); CREATE TABLE COLTIVA ( provincia CHAR( 3 ) , comune CHAR( 3 ) , sezione CHAR( 1 ) , foglio INTEGER , particella INTEGER , FOREIGN KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ) REFERENCES PARTICELLA( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero ) ON UPDATE CASCADE , coltura CHAR( 2 ) REFERENCES COLTURA( c o d i c e ) ON UPDATE CASCADE 10 Figura 4: Interfaccia per l’importazione di file shape , , , percentuale NUMERIC( 3 ) ordine NUMERIC( 1 ) PRIMARY KEY ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , coltura ) , CHECK ( o r d i n e I S NOT NULL o r p e r c e n t u a l e I S NOT NULL) , CHECK ( o r d i n e I S NULL o r p e r c e n t u a l e I S NULL) ); 4.2 Popolamento della base di dati Si suppone di aver caricato lo shape file dei comuni in una tabella ausiliaria COMUNI geoportalenazionale prima di procedere al caricamento delle geometrie relative alle province e ai comuni attraverso la funzionalità messa a disposizione da PostGIS (Figura 4). INSERT INTO STOCCAGGIO COPERTA ’ ) ; INSERT INTO STOCCAGGIO SOLIDI ’ ) ; INSERT INTO STOCCAGGIO SCOPERTA ’ ) ; INSERT INTO STOCCAGGIO COPERTA ’ ) ; ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’PC ’ , ’PLATEA ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’PP ’ , ’PLATEA PER ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’ PS ’ , ’PLATEA ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’VC ’ , ’VASCA INSERT INTO STABULAZIONE ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’BL ’ , ’BOX SU LATTIERA ’ ) ; 11 INSERT INTO STABULAZIONE ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’ RI ’ , ’RECINTI INDIVIDUALI ’ ) ; INSERT INTO STABULAZIONE ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’TE ’ , ’A TERRA ’ ); INSERT INTO ANIMALE ( c o d i c e , s p e c i e ) VALUES ( ’BO ’ , ’BOVINIO ’ ) ; INSERT INTO ANIMALE ( c o d i c e , s p e c i e ) VALUES ( ’EQ ’ , ’ EQUINI ’ ) ; INSERT INTO ANIMALE ( c o d i c e , s p e c i e ) VALUES ( ’SU ’ , ’SUINO ’ ) ; INSERT ); INSERT ); INSERT ); INSERT ); INTO TIPOALLEVAMENTO ( s t a b u l a z i o n e , a n i m a l e ) VALUES ( ’ RI ’ , ’BO ’ INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO TIPOALLEVAMENTO ( s t a b u l a z i o n e , a n i m a l e ) VALUES ( ’ RI ’ , ’EQ ’ INTO TIPOALLEVAMENTO ( s t a b u l a z i o n e , a n i m a l e ) VALUES ( ’TE ’ , ’BO ’ INTO TIPOALLEVAMENTO ( s t a b u l a z i o n e , a n i m a l e ) VALUES ( ’TE ’ , ’SU ’ COLTURA COLTURA COLTURA COLTURA COLTURA ( codice ( codice ( codice ( codice ( codice , nome ) , nome ) , nome ) , nome ) , nome ) VALUES VALUES VALUES VALUES VALUES ( ( ( ( ( ’AV ’ ’FA ’ ’MA’ ’ PI ’ ’SO ’ , , , , , ’AVENA ’ ) ; ’FAGIOLO ’ ) ; ’MAIS ’ ) ; ’ PISELLO ’ ) ; ’ SOIA ’ ) ; INSERT INTO IRRIGAZIONE ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’NS ’ , ’NESSUNA ’ ) ; INSERT INTO IRRIGAZIONE ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’PG ’ , ’PIOGGIA ’ ) ; INSERT INTO IRRIGAZIONE ( c o d i c e , d e s c r i z i o n e ) VALUES ( ’SC ’ , ’ SCORRIMENTO ’ ) ; INSERT INSERT INSERT INSERT INTO INTO INTO INTO PROVINCIA PROVINCIA PROVINCIA PROVINCIA ( codiceistat ( codiceistat ( codiceistat ( codiceistat , nome ) , nome ) , nome ) , nome ) VALUES VALUES VALUES VALUES ( ( ( ( ’ 030 ’ 031 ’ 032 ’ 093 ’ ’ ’ ’ , , , , ’UDINE ’ ) ; ’GORIZIA ’ ) ; ’TRIESTE ’ ) ; ’PORDENONE ’ ) ; UPDATE PROVINCIA a s P SET the geom = (SELECT ST Multi ( s t u n i o n ( the geom ) ) FROM ” COMUNI geoportalenazionale ” a s GP WHERE GP. c o d p r o v i n=P . c o d i c e i s t a t ) ; INSERT INTO COMUNE ( p r o v i n c i a , c o d i c e i s t a t , nome ) VALUES ( ’ 030 ’ , ’ 068 ’ , ’PAGNACCO’ ) ; INSERT INTO COMUNE ( p r o v i n c i a , c o d i c e i s t a t , nome ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’TAVAGNACCO’ ) ; INSERT INTO COMUNE ( p r o v i n c i a , c o d i c e i s t a t , nome ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’UDINE ’ ) ; UPDATE COMUNE a s C SET the geom = (SELECT the geom FROM ” COMUNI geoportalenazionale ” a s GP WHERE GP. c o d p r o v i n=C . p r o v i n c i a and GP. cod comune=C . codiceistat ) ; INSERT INTO AZIENDA (CUAA, denominazione , d a t a f o n d a z i o n e , p r o v i n c i a , comune , v i a , c i v i c o , cap ) VALUES ( ’ 00111333555 ’ , ’TENUTA UDINESE ’ , NULL, ’ 030 ’ , ’ 068 ’ , ’VIA UDINE ’ , ’ 45/A ’ , 3 3 0 3 0 ) ; INSERT INTO AZIENDA (CUAA, denominazione , p r o v i n c i a , comune , v i a , c i v i c o , cap ) VALUES ( ’ 00123456789 ’ , ’AZIENDA AGRICOLA UDINESE ’ , ’ 030 ’ , ’ 129 ’ , ’VIA ROMA’ , ’ 11/3 ’ , 3 3 1 0 0 ) ; INSERT INTO AZIENDA (CUAA, denominazione , p r o v i n c i a , comune , v i a , c i v i c o , cap , d a t a f o n d a z i o n e ) VALUES ( ’ 00987654321 ’ , ’COLTIVAZIONI 12 BIOLOGICHE ’ , ’ 030 ’ , ’ 129 ’ , ’VIA DELLE SCIENZE ’ , ’ 100 ’ , 3 3 1 0 0 , ’ 2000−01−01 ’ ) ; UPDATE AZIENDA SET the geom=ST PointFromText ( ’POINT( 1 3 . 1 8 0 0 4 6 . 1 2 0 0 ) ’ , 4 3 2 6 ) WHERE CUAA= ’ 00111333555 ’ ; −− PAGNACCO UPDATE AZIENDA SET the geom=ST PointFromText ( ’POINT( 1 3 . 2 4 0 0 4 6 . 0 6 0 0 ) ’ , 4 3 2 6 ) WHERE CUAA= ’ 00123456789 ’ ; −− UDINE UPDATE AZIENDA SET the geom=ST PointFromText ( ’POINT( 1 3 . 2 5 7 4 4 6 . 0 8 3 2 ) ’ , 4 3 2 6 ) WHERE CUAA= ’ 00987654321 ’ ; −− UDINE INSERT INTO TELEFONO ( a z i e n d a , numero ) VALUES ( ’ 00111333555 ’ , ’ 0432767676 ’ ) ; INSERT INTO TELEFONO ( a z i e n d a , numero ) VALUES ( ’ 00111333555 ’ , ’ 3476767677 ’ ) ; INSERT INTO TELEFONO ( a z i e n d a , numero ) VALUES ( ’ 00123456789 ’ , ’ 0432666666 ’ ) ; INSERT INTO VALUES ( INSERT INTO VALUES ( INSERT INTO VALUES ( INSERT INTO VALUES ( PROPRIETARIO ( c o d i c e f i s c a l e , nome , cognome , d a t a n a s c i t a ) ’BNCMRA85Y66T656A ’ , ’MARIA ’ , ’BIANCHI ’ , ’ 1985−05−05 ’ ) ; PROPRIETARIO ( c o d i c e f i s c a l e , nome , cognome , d a t a n a s c i t a ) ’ RSSANT80X88R765X ’ , ’ANTONIO ’ , ’ ROSSI ’ , ’ 1980−10−05 ’ ) ; PROPRIETARIO ( c o d i c e f i s c a l e , nome , cognome , d a t a n a s c i t a ) ’RSSMRA85X56T789M ’ , ’MARIO ’ , ’ ROSSI ’ , ’ 1985−10−10 ’ ) ; PROPRIETARIO ( c o d i c e f i s c a l e , nome , cognome , d a t a n a s c i t a ) ’VRDMRA84X58T789M ’ , ’MARIO ’ , ’VERDI ’ , ’ 1984−10−10 ’ ) ; INSERT INTO PROPRIETA RSSANT80X88R765X ’ ) ; INSERT INTO PROPRIETA BNCMRA85Y66T656A ’ ) ; INSERT INTO PROPRIETA RSSMRA85X56T789M ’ ) ; INSERT INTO PROPRIETA RSSMRA85X56T789M ’ ) ; INSERT INTO PROPRIETA VRDMRA84X58T789M ’ ) ; ( a z i e n d a , p r o p r i e t a r i o ) VALUES ( ’ 00111333555 ’ , ’ ( a z i e n d a , p r o p r i e t a r i o ) VALUES ( ’ 00123456789 ’ , ’ ( a z i e n d a , p r o p r i e t a r i o ) VALUES ( ’ 00123456789 ’ , ’ ( a z i e n d a , p r o p r i e t a r i o ) VALUES ( ’ 00987654321 ’ , ’ ( a z i e n d a , p r o p r i e t a r i o ) VALUES ( ’ 00987654321 ’ , ’ INSERT INTO PARTICELLA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero , s u p e r f i c i e ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 1 ’ , 9 0 0 0 ) ; INSERT INTO PARTICELLA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero , s u p e r f i c i e ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 2 ’ , 7 0 0 0 ) ; INSERT INTO PARTICELLA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero , s u p e r f i c i e ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 11 ’ , ’ 1 ’ , 6 0 0 0 ) ; INSERT INTO PARTICELLA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero , s u p e r f i c i e ) VALUES ( ’ 030 ’ , ’ 068 ’ , ’ ’ , ’ 12 ’ , ’ 1 ’ , 4 0 0 0 ) ; INSERT INTO PARTICELLA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero , s u p e r f i c i e ) VALUES ( ’ 030 ’ , ’ 068 ’ , ’ ’ , ’ 12 ’ , ’ 2 ’ , 6 5 0 0 ) ; INSERT INTO PARTICELLA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero , s u p e r f i c i e ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ ’ , ’ 55 ’ , ’ 1 ’ , 7 5 0 0 ) ; INSERT INTO PARTICELLA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero , s u p e r f i c i e ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ ’ , ’ 55 ’ , ’ 3 ’ , 6 0 0 0 ) ; UPDATE PARTICELLA SET the geom=ST PolygonFromText ( ’POLYGON( ( 1 3 . 2 3 2 9 4 6 . 1 1 6 1 , 1 3 . 2 3 4 1 46.1154 ,13.2351 46.1161 ,13.2364 46.1184 ,13.2329 46.1161) ) ’ ,4326) WHERE p r o v i n c i a= ’ 030 ’ AND comune= ’ 118 ’ AND s e z i o n e= ’ ’ AND f o g l i o= ’ 10 ’ AND numero= ’ 1 ’ ; −− t a v a g n a c c o UPDATE PARTICELLA SET the geom=ST PolygonFromText ( ’POLYGON( ( 1 3 . 2 3 1 8 4 6 . 1 1 6 7 , 1 3 . 2 3 2 9 46.1161 ,13.2364 46.1184 ,13.2352 46.1191 ,13.2318 46.1167) ) ’ ,4326) WHERE p r o v i n c i a= ’ 030 ’ AND comune= ’ 118 ’ AND s e z i o n e= ’ ’ AND f o g l i o= ’ 10 ’ AND numero= ’ 2 ’ ; −− t a v a g n a c c o UPDATE PARTICELLA SET the geom=ST PolygonFromText ( ’POLYGON( ( 1 3 . 2 4 1 8 4 6 . 1 0 6 7 , 1 3 . 2 4 2 9 13 46.1061 ,13.2464 46.1084 ,13.2452 46.1091 ,13.2418 46.1067) ) ’ ,4326) WHERE p r o v i n c i a= ’ 030 ’ AND comune= ’ 118 ’ AND s e z i o n e= ’ ’ AND f o g l i o= ’ 11 ’ and numero= ’ 1 ’ ; −− t a v a g n a c c o UPDATE PARTICELLA SET the geom=ST PolygonFromText ( ’POLYGON( ( 1 3 . 1 6 5 8 4 6 . 1 2 7 5 , 1 3 . 1 6 5 8 46.1267 , 13.1675 46.1267 , 13.1675 46.1275 , 13.1658 46.1275) ) ’ ,4326) WHERE p r o v i n c i a= ’ 030 ’ AND comune= ’ 068 ’ AND s e z i o n e= ’ ’ AND f o g l i o= ’ 12 ’ and numero= ’ 1 ’ ; −− p a g n a c c o UPDATE PARTICELLA SET the geom=ST PolygonFromText ( ’POLYGON( ( 1 3 . 1 6 5 8 4 6 . 1 2 6 7 , 1 3 . 1 6 5 8 46.1255 , 13.1675 46.1255 , 13.1675 46.1267 , 13.1658 46.1267) ) ’ ,4326) WHERE p r o v i n c i a= ’ 030 ’ AND comune= ’ 068 ’ AND s e z i o n e= ’ ’ AND f o g l i o= ’ 12 ’ and numero= ’ 2 ’ ; −− p a g n a c c o UPDATE PARTICELLA SET the geom=ST PolygonFromText ( ’POLYGON( ( 1 3 . 2 6 2 6 4 6 . 1 1 0 0 , 1 3 . 2 6 2 6 46.1090 , 13.2690 46.1090 , 13.2690 46.1100 , 13.2626 46.1100) ) ’ ,4326) WHERE p r o v i n c i a= ’ 030 ’ AND comune= ’ 129 ’ AND s e z i o n e= ’ ’ AND f o g l i o= ’ 55 ’ and numero= ’ 1 ’ ; −− u d i n e UPDATE PARTICELLA SET the geom=ST PolygonFromText ( ’POLYGON( ( 1 3 . 2 6 2 6 4 6 . 1 1 0 0 , 1 3 . 2 6 6 0 46.1100 , 13.2660 46.1115 , 13.2626 46.1115 , 13.2626 46.1100) ) ’ ,4326) WHERE p r o v i n c i a= ’ 030 ’ AND comune= ’ 129 ’ AND s e z i o n e= ’ ’ AND f o g l i o= ’ 55 ’ AND numero= ’ 3 ’ ; −− u d i n e INSERT INTO PARTICELLA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , numero , s u p e r f i c i e , the geom ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ ’ , ’ 10 ’ , ’ 1 ’ , 9 0 0 0 , ST PolygonFromText ( ’POLYGON ((13.2374 46.0260 , 13.2400 46.0260 , 13.2400 46.0280 , 13.2374 4 6 . 0 2 8 0 , 1 3 . 2 3 7 4 4 6 . 0 2 6 0 ) ) ’ , 4 3 2 6 ) ) ; −− u d i n e −− d a t i a l l e v a m e n t i INSERT INTO ALLEVAMENTO ( p r o v i n c i a a z i e n d a ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ INSERT INTO ALLEVAMENTO ( p r o v i n c i a a z i e n d a ) VALUES ( ’ 030 ’ , ’ 068 ’ , ’ INSERT INTO ALLEVAMENTO ( p r o v i n c i a a z i e n d a ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ INSERT INTO ALLEVAMENTO ( p r o v i n c i a a z i e n d a ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ’ , ’ 10 ’ , ’ 1 ’ , ’ 00111333555 ’ ) ; , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ’ , ’ 12 ’ , ’ 1 ’ , ’ 00111333555 ’ ) ; , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ’ , ’ 55 ’ , ’ 1 ’ , ’ 00111333555 ’ ) ; , comune , s e z i o n e , f o g l i o , p a r t i c e l l a ’ , ’ 55 ’ , ’ 3 ’ , ’ 00123456789 ’ ) ; , , , , INSERT INTO DISPONE ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t o c c a g g i o , volume ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 1 ’ , ’PC ’ , 5 0 0 ) ; INSERT INTO DISPONE ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t o c c a g g i o , volume ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 1 ’ , ’PP ’ , 2 0 0 ) ; INSERT INTO DISPONE ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t o c c a g g i o , volume ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ ’ , ’ 55 ’ , ’ 1 ’ , ’PC ’ , 3 0 0 ) ; INSERT INTO DISPONE ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t o c c a g g i o , volume ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ ’ , ’ 55 ’ , ’ 3 ’ , ’VC ’ , 6 0 0 ) ; INSERT INTO ALLEVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t a b u l a z i o n e , animale , q u a n t i t a ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 1 ’ , ’ TE ’ , ’BO ’ , 1 0 0 0 ) ; INSERT INTO ALLEVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t a b u l a z i o n e , animale , q u a n t i t a ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 1 ’ , ’ TE ’ , ’SU ’ , 8 0 0 ) ; INSERT INTO ALLEVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t a b u l a z i o n e , animale , q u a n t i t a ) VALUES ( ’ 030 ’ , ’ 068 ’ , ’ ’ , ’ 12 ’ , ’ 1 ’ , ’ TE ’ , ’BO ’ , 2 0 0 ) ; 14 Figura 5: Rappresentazione dei dati spaziali inseriti (comuni, particelle e aziende) INSERT INTO ALLEVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t a b u l a z i o n e , animale , q u a n t i t a ) VALUES ( ’ 030 ’ , ’ 068 ’ , ’ ’ , ’ 12 ’ , ’ 1 ’ , ’ RI ’ , ’BO ’ , 8 0 0 ) ; INSERT INTO ALLEVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t a b u l a z i o n e , animale , q u a n t i t a ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ ’ , ’ 55 ’ , ’ 1 ’ , ’ RI ’ , ’EQ ’ , 1 5 0 0 ) ; INSERT INTO ALLEVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t a b u l a z i o n e , animale , q u a n t i t a ) VALUES ( ’ 030 ’ , ’ 129 ’ , ’ ’ , ’ 55 ’ , ’ 3 ’ , ’ RI ’ , ’BO ’ , 1 8 0 0 ) ; −− d a t i coltivazioni INSERT INTO COLTIVAZIONE ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , a z i e n d a , i r r i g a ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 2 ’ , ’ 00987654321 ’ , ’ NS ’ ) ; INSERT INTO COLTIVAZIONE ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , a z i e n d a , i r r i g a ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 11 ’ , ’ 1 ’ , ’ 00987654321 ’ , ’ PG ’ ) ; INSERT INTO COLTIVAZIONE ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , a z i e n d a , i r r i g a ) VALUES ( ’ 030 ’ , ’ 068 ’ , ’ ’ , ’ 12 ’ , ’ 2 ’ , ’ 00123456789 ’ , ’ PG ’ ) ; INSERT INTO COLTIVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , p e r c e n t u a l e , o r d i n e , c o l t u r a ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 2 ’ ,NULL , 1 , ’MA’ ) ; INSERT INTO COLTIVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , c o l t u r a , o r d i n e ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 10 ’ , ’ 2 ’ , ’SO ’ , 2 ) ; INSERT INTO COLTIVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , c o l t u r a , p e r c e n t u a l e ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 11 ’ , ’ 1 ’ , ’SO ’ , 5 0 ) ; INSERT INTO COLTIVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , c o l t u r a , p e r c e n t u a l e ) VALUES ( ’ 030 ’ , ’ 118 ’ , ’ ’ , ’ 11 ’ , ’ 1 ’ , ’FA ’ , 5 0 ) ; INSERT INTO COLTIVA ( p r o v i n c i a , comune , s e z i o n e , f o g l i o , p a r t i c e l l a , c o l t u r a , p e r c e n t u a l e ) VALUES ( ’ 030 ’ , ’ 068 ’ , ’ ’ , ’ 12 ’ , ’ 2 ’ , ’MA’ , 1 0 0 ) ; I dati spaziali cosı̀ inseriti sono rappresentati in Figura 5). 15 4.3 Interrogazione dei dati Determinare il codice e il nome di tutte le province: SELECT c o d i c e i s t a t , nome FROM PROVINCIA ; Determinare i nomi (distinti) dei proprietari: SELECT DISTINCT nome FROM PROPRIETARIO ; Determinare la denomione delle aziende di cui non si conosce la data di fondazione: SELECT d e n o m i n a z i o n e FROM AZIENDA WHERE a n n o f o n d a z i o n e I S NULL; Determinare il nome dei comuni associati ai nomi delle corrispondenti province: SELECT C . nome a s comune , P . nome a s p r o v i n c i a FROM COMUNE a s C, PROVINCIA a s P WHERE p r o v i n c i a = P . c o d i c e i s t a t ; SELECT C . nome a s comune , P . nome a s p r o v i n c i a FROM COMUNE a s C JOIN PROVINCIA a s P ON p r o v i n c i a = P . c o d i c e i s t a t ; Determinare per ogni azienda cuaa, denominazione, comune (nome), via, civico e cap. SELECT cuaa , denominazione , nome , v i a , c i v i c o , cap FROM AZIENDA, COMUNE WHERE AZIENDA . p r o v i n c i a=COMUNE. p r o v i n c i a AND comune=c o d i c e i s t a t ; SELECT cuaa , denominazione , nome , v i a , c i v i c o , cap FROM AZIENDA JOIN COMUNE ON AZIENDA . p r o v i n c i a=COMUNE. p r o v i n c i a AND comune=c o d i c e i s t a t ; Determinare per ogni azienda del comune di Udine cuaa, denominazione, via, civico e cap. SELECT cuaa , denominazione , v i a , c i v i c o , cap FROM AZIENDA, COMUNE WHERE AZIENDA . p r o v i n c i a=COMUNE. p r o v i n c i a AND comune=c o d i c e i s t a t AND nome= ’UDINE ’ ; SELECT cuaa , denominazione , v i a , c i v i c o , cap FROM AZIENDA JOIN COMUNE ON AZIENDA . p r o v i n c i a=COMUNE. p r o v i n c i a AND comune=c o d i c e i s t a t AND nome= ’UDINE ’ ; Determinare per ogni azienda cuaa, denominazione, comune (nome), via, civico e cap. 16 SELECT cuaa , denominazione , PROVINCIA . nome , COMUNE. nome v i a , c i v i c o , cap FROM AZIENDA, COMUNE, PROVINCIA WHERE AZIENDA . p r o v i n c i a=COMUNE. p r o v i n c i a AND comune=COMUNE. codiceistat AND PROVINCIA . c o d i c e i s t a t=COMUNE. p r o v i n c i a ; SELECT cuaa , denominazione , nome , v i a , c i v i c o , cap FROM AZIENDA JOIN COMUNE ON AZIENDA . p r o v i n c i a=COMUNE. p r o v i n c i a AND comune=c o d i c e i s t a t JOIN PROVINCIA ON PROVINCIA . c o d i c e i s t a t= COMUNE. p r o v i n c i a ; Determinare il nome dei proprietari omonimi (stesso nome): SELECT DISTINCT nome FROM PROPRIETARIO AS P1 , PROPRIETARIO AS P2 WHERE P1 . nome=P2 . nome AND P1 . c o d i c e f i s c a l e <P2 . c o d i c e f i s c a l e ; SELECT nome FROM PROPRIETARIO GROUP BY nome HAVING COUNT( ∗ ) >1; Determinare l’insieme delle colture (nome) coltivate in rotazione: SELECT DISTINCT nome FROM COLTIVA JOIN COLTURA ON c o l t u r a=c o d i c e WHERE o r d i n e I S NOT NULL; Determinare le colture coltivate sia in rotazione che fuori rotazione: SELECT DISTINCT nome FROM COLTIVA JOIN COLTURA ON c o l t u r a=c o d i c e WHERE o r d i n e I S NOT NULL INTERSECT SELECT DISTINCT nome FROM COLTIVA JOIN COLTURA ON c o l t u r a=c o d i c e WHER p e r c e n t u a l e I S NOT NULL; Determinare le colture coltivate solo in rotazione, non fuori rotazione: SELECT DISTINCT nome FROM COLTIVA JOIN COLTURA ON c o l t u r a=c o d i c e WHERE o r d i n e I S NOT NULL EXCEPT SELECT DISTINCT nome FROM COLTIVA JOIN COLTURA ON c o l t u r a=c o d i c e WHER p e r c e n t u a l e I S NOT NULL; Determinare la denominazione delle aziende che allevano bovini e hanno dispongono di vasche scoperte con un volume superiore di 200. SELECT A. d e n o m i n a z i o n e FROM AZIENDA AS A JOIN ALLEVAMENTO AS AL JOIN ALLEVA AS AE ON A. cuaa=AL . a z i e n d a ON AL . p r o v i n c i a=AE. p r o v i n c i a AND AL . comune=AE. comune 17 AND AL . s e z i o n e=AE. s e z i o n e AND AL . f o g l i o=AE. f o g l i o AND AL . p a r t i c e l l a=AE. p a r t i c e l l a JOIN TIPOALLEVAMENTO AS TA ON AE. s t a b u l a z i o n e=TA. s t a b u l a z i o n e AND AE. a n i m a l e=TA. a n i m a l e JOIN ANIMALE AS AN ON TA. a n i m a l e=AN. c o d i c e JOIN DISPONE AS DI ON AL . p r o v i n c i a=DI . p r o v i n c i a AND AL . comune=DI . comune AND AL . s e z i o n e=DI . s e z i o n e AND AL . f o g l i o=DI . f o g l i o AND AL . p a r t i c e l l a=DI . p a r t i c e l l a JOIN STOCCAGGIO AS ST ON DI . s t o c c a g g i o=ST . c o d i c e WHERE ST . d e s c r i z i o n e= ’VASCA COPERTA ’ AND DI . volume >200 AND AN. s p e c i e= ’BOVINO ’ ; SELECT A. d e n o m i n a z i o n e FROM AZIENDA AS A JOIN ALLEVAMENTO AS AL JOIN ALLEVA AS AE ON A. cuaa=AL . a z i e n d a ON AL . p r o v i n c i a=AE. p r o v i n c i a AND AL . comune=AE. comune AND AL . s e z i o n e=AE. s e z i o n e AND AL . f o g l i o=AE. f o g l i o AND AL . p a r t i c e l l a=AE. p a r t i c e l l a JOIN TIPOALLEVAMENTO AS TA ON AE. s t a b u l a z i o n e=TA. s t a b u l a z i o n e AND AE. a n i m a l e=TA. a n i m a l e JOIN ANIMALE AS AN ON TA. a n i m a l e=AN. c o d i c e WHERE AN. s p e c i e= ’BOVINO ’ INTERSECT SELECT A. d e n o m i n a z i o n e FROM AZIENDA AS A JOIN ALLEVAMENTO AS AL JOIN DISPONE AS DI ON A. cuaa=AL . a z i e n d a ON AL . p r o v i n c i a=DI . p r o v i n c i a AND AL . comune=DI . comune AND AL . s e z i o n e=DI . s e z i o n e AND AL . f o g l i o=DI . f o g l i o AND AL . p a r t i c e l l a=DI . p a r t i c e l l a JOIN STOCCAGGIO AS ST ON DI . s t o c c a g g i o=ST . c o d i c e WHERE ST . d e s c r i z i o n e= ’VASCA COPERTA ’ AND DI . volume >200; SELECT A. d e n o m i n a z i o n e FROM AZIENDA AS A WHERE cuaa IN ( SELECT a z i e n d a FROM ALLEVAMENTO AS AL JOIN ALLEVA AS AE ON AL . p r o v i n c i a=AE. p r o v i n c i a AND AL . comune=AE. comune AND AL . s e z i o n e=AE. s e z i o n e AND AL . f o g l i o=AE. f o g l i o AND AL . p a r t i c e l l a=AE. p a r t i c e l l a JOIN TIPOALLEVAMENTO AS TA ON AE. s t a b u l a z i o n e=TA. s t a b u l a z i o n e AND AE. a n i m a l e=TA. a n i m a l e JOIN ANIMALE AS AN ON TA. a n i m a l e=AN. c o d i c e WHERE AN. s p e c i e= ’BOVINO ’ ) AND cuaa IN (SELECT a z i e n d a FROM ALLEVAMENTO AS AL JOIN DISPONE AS DI ON AL . p r o v i n c i a=DI . p r o v i n c i a 18 AND AL . comune=DI . comune AND AL . s e z i o n e=DI . s e z i o n e AND AL . f o g l i o=DI . f o g l i o AND AL . p a r t i c e l l a=DI . p a r t i c e l l a JOIN STOCCAGGIO AS ST ON DI . s t o c c a g g i o=ST . c o d i c e WHERE ST . d e s c r i z i o n e= ’VASCA COPERTA ’ AND DI . volume >200) ; SELECT A. d e n o m i n a z i o n e FROM AZIENDA AS A WHERE EXISTS ( SELECT ∗ FROM ALLEVAMENTO AS AL JOIN ALLEVA AS AE ON AL . p r o v i n c i a=AE. p r o v i n c i a AND AL . comune=AE. comune AND AL . s e z i o n e=AE. s e z i o n e AND AL . f o g l i o=AE. f o g l i o AND AL . p a r t i c e l l a=AE. p a r t i c e l l a JOIN TIPOALLEVAMENTO AS TA ON AE. s t a b u l a z i o n e=TA. s t a b u l a z i o n e AND AE. a n i m a l e=TA. a n i m a l e JOIN ANIMALE AS AN ON TA. a n i m a l e=AN. c o d i c e WHERE AN. s p e c i e= ’BOVINIO ’ AND A. cuaa=AL . a z i e n d a ) AND EXISTS (SELECT ∗ FROM ALLEVAMENTO AS AL JOIN DISPONE AS DI ON AL . p r o v i n c i a=DI . p r o v i n c i a AND AL . comune=DI . comune AND AL . s e z i o n e=DI . s e z i o n e AND AL . f o g l i o=DI . f o g l i o AND AL . p a r t i c e l l a=DI . p a r t i c e l l a JOIN STOCCAGGIO AS ST ON DI . s t o c c a g g i o=ST . c o d i c e WHERE ST . d e s c r i z i o n e= ’VASCA COPERTA ’ AND DI . volume >200 AND A. cuaa =AL . a z i e n d a ) ; Determinare il numero di particelle coltivate per azienda∗ : SELECT a z i e n d a , COUNT( ∗ ) FROM COLTIVAZIONE GROUP BY a z i e n d a ; Determinare il numero di animali complessivi allevati per azienda∗ : SELECT a z i e n d a , SUM( q u a n t i t a ) FROM ALLEVAMENTO a s A1 JOIN ALLEVA a s A2 ON A1 . p r o v i n c i a=A2 . p r o v i n c i a AND A1 . comune=A2 . comune AND A1 . s e z i o n e =A2 . s e z i o n e AND A1 . f o g l i o=A2 . f o g l i o AND A1 . p a r t i c e l l a=A2 . particella GROUP BY a z i e n d a ; Determinare l’area delle diverse particelle, e confrontarle con le superfici precedentemente inserite: SELECT comune , s e z i o n e , f o g l i o , p a r t i c e l l a , s t a r e a ( ST Transform ( the geom , 3 0 0 4 ) ) , s u p e r f i c i e FROM PARTICELLA ; Aggiornare quindi le superfici con i dati corretti: UPDATE PARTICELLA SET s u p e r f i c i e = s t a r e a ( ST Transform ( the geom , 3 0 0 4 ) ) ; 19 Determinare l’area complessiva delle particelle coltivate (a partire dalle geometrie): SELECT SUM( s t a r e a ( ST Transform ( the geom , 3 0 0 4 ) ) ) FROM PARTICELLA a s P JOIN ALLEVAMENTO AS A ON P . p r o v i n c i a=A. p r o v i n c i a AND P . comune=A. comune AND P . s e z i o n e=A. s e z i o n e AND P . f o g l i o=A. f o g l i o AND P . numero=A. p a r t i c e l l a ; SELECT s t a r e a (ST UNION( ST Transform ( the geom , 3 0 0 4 ) ) ) FROM PARTICELLA a s P JOIN ALLEVAMENTO AS A ON P . p r o v i n c i a=A. p r o v i n c i a AND P . comune=A. comune AND P . s e z i o n e=A. s e z i o n e AND P . f o g l i o=A. f o g l i o AND P . numero=A. p a r t i c e l l a ; Determinare per ogni comune il numero di aziende che hanno sede in esso: [ c a s o con i s o l i comuni che hanno a z i e n d e ] SELECT C . p r o v i n c i a | | C . c o d i c e i s t a t a s c o d i c e , C . nome AS comune , COUNT( ∗ ) a s numeroSedi FROM COMUNE AS C JOIN AZIENDA AS A ON C . p r o v i n c i a=A. p r o v i n c i a AND C . c o d i c e i s t a t=A. comune GROUP BY C . p r o v i n c i a , C . c o d i c e i s t a t , C . nome ; [ c a s o con t u t t i i comuni ] SELECT C . p r o v i n c i a | | C . c o d i c e i s t a t a s c o d i c e , C . nome AS comune , COUNT(A.CUAA) a s numeroSedi FROM COMUNE AS C LEFT OUTER JOIN AZIENDA AS A ON C . p r o v i n c i a=A. p r o v i n c i a AND C . c o d i c e i s t a t=A. comune GROUP BY C . p r o v i n c i a , C . c o d i c e i s t a t , C . nome ; Determinare la distanza fra le diverse aziende (sedi): SELECT s 1 . cuaa , s 1 . denominazione , s 2 . cuaa , s 2 . denominazione , S T D i s t a n c e ( ST Transform ( s 1 . the geom , 3 0 0 4 ) , ST Transform ( s 2 . the geom , 3 0 0 4 ) ) AS d i s t a n z a FROM a z i e n d a a s s1 , a z i e n d a a s s 2 WHERE s 1 . cuaa<s 2 . cuaa ; Determinare per ogni comune le particelle in esso coltivate (sfruttando le geometrie): SELECT c . nome , p . f o g l i o , p . numero FROM comune a s c , p a r t i c e l l a a s p JOIN c o l t i v a z i o n e a s co ON p . p r o v i n c i a=co . p r o v i n c i a AND p . comune=co . comune AND p . f o g l i o=co . f o g l i o AND p . s e z i o n e=co . s e z i o n e AND p . numero=co . p a r t i c e l l a WHERE s t c o n t a i n s ( c . the geom , p . the geom ) ; Determinare per ogni comune il totale delle superfici delle particelle coltivate (sfruttando le geometrie): SELECT c . nome , SUM( s t a r e a ( s t t r a n s f o r m ( p . the geom , 3 0 0 4 ) ) ) areaColtivata FROM comune a s c , p a r t i c e l l a a s p JOIN c o l t i v a z i o n e a s co ON p . p r o v i n c i a=co . p r o v i n c i a AND p . comune=co . comune AND p . f o g l i o=co . f o g l i o AND p . s e z i o n e=co . s e z i o n e AND p . numero=co . p a r t i c e l l a WHERE s t c o n t a i n s ( c . the geom , p . the geom ) GROUP BY c . p r o v i n c i a , c . c o d i c e i s t a t , c . nome ; 20 Determinare il buffer di 1000 metri rispetto alle aziende e determinare se le particelle su cui lavorano svolgono attività di allevamento sono in esso incluse o meno: SELECT a . denominazione , a l . p r o v i n c i a , a l . comune , a l . f o g l i o , a l . p a r t i c e l l a , s t c o n t a i n s ( s t b u f f e r ( s t t r a n s f o r m ( a . the geom , 3 0 0 4 ) , 1 0 0 0 ) , s t t r a n s f o r m ( p . the geom , 3 0 0 4 ) ) a s i n c l u s a I n B u f f e r FROM p a r t i c e l l a a s p JOIN a l l e v a m e n t o a s a l ON p . p r o v i n c i a=a l . p r o v i n c i a AND p . comune=a l . comune AND p . f o g l i o=a l . f o g l i o AND p . s e z i o n e=a l . s e z i o n e AND p . numero=a l . p a r t i c e l l a JOIN a z i e n d a a ON a l . a z i e n d a=a . cuaa ; Determinare per ogni azienda il numero di particelle su cui svolgono coltivazione e il numero di quelle su cui svolgono allevamento: SELECT a . cuaa , a . denominazione , COUNT( c . p a r t i c e l l a ) a s n u m e r o P a r t i c e l l e C o l t i v a t e , COUNT( a l . p a r t i c e l l a ) a s numeroParticelleAllevate FROM a z i e n d a a s a LEFT OUTER JOIN c o l t i v a z i o n e a s c ON a . cuaa=c . azienda LEFT OUTER JOIN a l l e v a m e n t o a s a l ON a . cuaa=a l . a z i e n d a GROUP BY a . cuaa , a . d e n o m i n a z i o n e ; 4.4 Trigger In fase di progettazione sono stati indicati alcuni vincoli non gestibili attraverso il puro modello logico relazionale ma, come si era accennato, è necessario l’inserimento di alcuni trigger. Si riportano di seguito alcuni esempi. Un primo trigger ha il compito di settare/modificare il valore dell’attributo area associata alla particella in base alla geometria della particella stessa3 . CREATE OR REPLACE FUNCTION f p a r t i c e l l a a r e a ( ) RETURNS t r i g g e r AS $BODY$ BEGIN new . s u p e r f i c i e = s t a r e a ( ST Transform ( new . the geom , 3 0 0 4 ) ) ; RETURN new ; END; $BODY$ LANGUAGE ’ p l p g s q l ’ ; CREATE TRIGGER t p a r t i c e l l a a r e a BEFORE INSERT OR UPDATE ON p a r t i c e l l a FOR EACH ROW EXECUTE PROCEDURE f p a r t i c e l l a a r e a ( ) ; Per la verifica il precedente trigger è sufficiente riaggiornare le geometrie associate alle particelle. Sono necessari dei trigger per la gestione dei vincoli spaziali imposti dalla relazione spaziale come ad esempio l’inclusione delle sedi delle aziende nei comuni in cui stanno. Si riporta a scopo esemplificativo l’esempio relativo 3 Nota: tenere presente che nella realtà l’area da considerare è quella data dall’agenzia del territorio. 21 al trigger che in fase di inserimento/modifica di un’azienda verifica che la sua geometria sia contenuta nel rispettivo comune: CREATE OR REPLACE FUNCTION a z i e n d a i n c o m u n e ( ) RETURNS t r i g g e r AS $BODY$ DECLARE num i n t e g e r ; BEGIN SELECT COUNT( ∗ ) INTO num FROM COMUNE AS C WHERE new . p r o v i n c i a=C . p r o v i n c i a AND new . comune=C . c o d i c e i s t a t AND s t c o n t a i n s (C . the geom , new . the geom ) ; IF num=0 THEN RAISE EXCEPTION ’ V i n c o l o s p a z i a l e non s o d d i s f a t t o ( s e d e non i n c l u s a n e l comune ) ’ ; ELSE RETURN new ; END IF ; END; $BODY$ LANGUAGE ’ p l p g s q l ’ ; CREATE TRIGGER t a z i e n d a i n c o m u n e BEFORE INSERT OR UPDATE ON a z i e n d a FOR EACH ROW EXECUTE PROCEDURE a z i e n d a i n c o m u n e ( ) ; Per verificare il precedente trigger è sufficiente eseguire i seguenti aggiornamenti. Nel primo caso i vincoli spaziali non sono soddisfatti ed il trigger blocca l’aggiornamento, nel secondo caso l’inserimento viene eseguito vista la soddisfazione del vincolo: INSERT INTO AZIENDA (CUAA, denominazione , d a t a f o n d a z i o n e , p r o v i n c i a , comune , v i a , c i v i c o , cap , the geom ) VALUES ( ’ 00222333555 ’ , ’AZIENDA DI PAGNACCO’ ,NULL, ’ 030 ’ , ’ 068 ’ , ’VIA ROMA’ , ’ 4/A ’ , 3 3 0 3 0 , ST PointFromText ( ’POINT( 1 3 . 2 4 0 0 4 6 . 0 6 0 0 ) ’ , 4 3 2 6 ) ) ; −− UDINE INSERT INTO AZIENDA (CUAA, denominazione , d a t a f o n d a z i o n e , p r o v i n c i a , comune , v i a , c i v i c o , cap , the geom ) VALUES ( ’ 00222333555 ’ , ’AZIENDA DI PAGNACCO’ ,NULL, ’ 030 ’ , ’ 068 ’ , ’VIA ROMA’ , ’ 4/A ’ , 3 3 0 3 0 , ST PointFromText ( ’POINT( 1 3 . 1 8 0 0 4 6 . 1 2 0 0 ) ’ , 4 3 2 6 ) ) ; −− PAGNACCO 4.5 Viste Creare una vista che restituisce l’elenco delle aziende con tutte le informazioni ad essa associate, in particolare il nome del comune e della provincia in cui si trovano: c r e a t e v i e w AZIENDA INFO AS SELECT A.CUAA a s CUAA, A. d e n o m i n a z i o n e AS denominazione , A. d a t a f o n d a z i o n e , C . nome AS comune , P . nome a s p r o v i n c i a , A. the geom a s the geom FROM COMUNE AS C JOIN AZIENDA AS A ON C . p r o v i n c i a=A. p r o v i n c i a AND C . c o d i c e i s t a t=A. comune JOIN PROVINCIA AS P ON C . p r o v i n c i a=P . c o d i c e i s t a t ; INSERT INTO g e o m e t r y c o l u m n s ( f t a b l e c a t a l o g , f t a b l e s c h e m a , f table name , f geometry column , coord dimension , s r i d , type ) VALUES ( ’ ’ , ’ p u b l i c ’ , ’ a z i e n d a i n f o ’ , ’ the geom ’ , 2 , 4 3 2 6 , ’POINT ’ ) ; 22 Creare una vista che associa ad ogni comune il numero di sedi di aziende in esso contenute: c r e a t e v i e w COMUNE SEDI AS SELECT C . p r o v i n c i a | | C . c o d i c e i s t a t a s c o d i c e , C . nome AS comune , COUNT (A.CUAA) a s numeroSedi , C . the geom a s the geom FROM COMUNE AS C LEFT OUTER JOIN AZIENDA AS A ON C . p r o v i n c i a=A. p r o v i n c i a AND C . c o d i c e i s t a t=A. comune GROUP BY C . p r o v i n c i a , C . c o d i c e i s t a t , C . nome , C . the geom ; INSERT INTO g e o m e t r y c o l u m n s ( f t a b l e c a t a l o g , f t a b l e s c h e m a , f table name , f geometry column , coord dimension , s r i d , type ) VALUES ( ’ ’ , ’ p u b l i c ’ , ’ c o m u n i s e d i ’ , ’ the geom ’ , 2 , 4 3 2 6 , ’ MULTIPOLYGON ’ ) ; Nota: l’inserimento della riga nella tabella delle geometrie non è necessaria nella nuova versione di PostGIS in cui la tabella geometry columns è diventata una vista. Inoltre, per poter poi utilizzare la vista da vecchie versioni di qGIS è necessario avere un attributo numerico che possa essere utilizzato come identificatore. Bisogna quindi aggiungere un attributo quale: • to number(A.CUAA,’99999999999’)::int as id nella prima vista e • to number(C.provincia||C.codiceistat,’999999’)::int as id per la seconda. 5 Interfacciamento con i GIS Molti sistemi GIS utilizzano come sorgente dati le basi di dati spaziali e permettono quindi la visualizzazione dei dati in esse contenuti, oltre che tutta una serie di operazioni. Sfruttando il sistema QGIS si possono creare delle viste analoghe a quelle rappresentate in Figura 6 in cui è stato visualizzato un layer vettoriali per ogni tabella spaziale della nostra base di dati. Sfruttando le viste precedentemente create si possono aggiungere ulteriori e più completi strati informativi: 23 Figura 6: Visualizzazione dei dati contenuti nelle tabelle spaziali da qGIS. Figura 7: Visualizzazione delle viste da qGIS. 24