Prova Scritta di Modelli dei Dati di Nuova Generazione 2 Luglio 2008 NOME: COGNOME: Si prega di risolvere gli esercizi direttamente sui fogli del testo, utilizzando protocolli solo nel caso di mancanza di spazio. Esercizio Punti previsti 1 15 2 10 3 8 Totale 33 Punti assegnati 1
Esercizio 1 Si vuole realizzare un applicazione di basi di dati per la gestione di un campeggio. Il campeggio dispone di un certo numero di piazzole, ognuna identificata da un numero ed appartenente ad un certo settore. Alcune piazzole sono raggiungibili in macchina (e quindi utilizzabili da tende, roulotte e camper) altre solo a piedi (e quindi utilizzabili solo da tende). Nelle prime viene alloggiata un unica tenda/roulotte/camper mentre le seconde possono ospitare piu` tende. Delle piazzole raggiungibili in macchina si vuole memorizzare se dotate di presa per l elettricita` e di rubinetto per l acqua potabile, oltre alla superficie in metri quadrati. Delle piazzole raggiungibili a piedi interessa memorizzare il numero massimo di tende ospitabili nella piazzola. I clienti del campeggio effettuano dei soggiorni con una certa data di inizio e di fine (presunta, nel caso di soggiorni ancora in corso), durante i quali viene loro assegnata una piazzola. Si noti che poiche vengono mantenute anche le informazioni su soggiorni conclusi, un cliente puo` visitare piu` volte il campeggio. Di ogni cliente interessa memorizzare codice fiscale, nome, cognome, indirizzo, data di nascita, estremi del documento di identita` (tipo, numero, ente che l ha rilasciato, data di rilascio). In ogni suo soggiorno il cliente potra` avere un certo numero di accompagnatori, dei quali si vuole memorizzare nome e cognome e, se di eta` inferiore a 12 anni, data di nascita, e disporra` di una certa attrezzatura. Per ogni soggiorno, si vuole memorizzare il tipo di attrezzatura utilizzata dal cliente per il soggiorno (tenda, roulotte, ) e, nel caso il cliente disponga di un veicolo, il tipo, il modello e il numero di targa del veicolo. Si vogliono infine memorizzare le piazzole assegnate ai clienti in ogni loro soggiorno e se e stato richiesto l utilizzo della presa di elettricita`. Si richiede di: 1. Progettare uno schema ER per il dominio applicativo precedente, motivando le scelte effettuate Vincoli: Non ci possono essere soggiorni contemporanei (cioe` che si sovrappongono temporalmente) dello stesso cliente In ogni piazzola in ogni data ci deve essere un numero di soggiorni <= alla sua capacita` (1 nel caso di piazzole raggiungibili in macchina, numtende per le piazzole raggiungibili a piedi) I soggiorni nelle piazzole raggiungibili a piedi devono avere come tipo_attr tenda In un soggiorno puo` essere utilizzata l elettricita` solo se la piazzola corrispondente e` dotata di presa per l`elettricita` 2
2. Presentare gli statement di creazione dello schema logico in SQL-2003, motivando le scelte effettuate. Traducendo Soggiorno come tabella tipata, ogni soggiorno sara` identificato dal suo identificatore e il vincolo di identificazione verra` incluso nel controllo che non ci siano soggiorni dello stesso cliente che si sovrappongono temporalmente. Per tale motivo, l identificazione esterna non verra` tradotta in vincoli FK-PK. Si decide di tradurre ogni entita` come tipo e tabella tipata. Per quanto riguarda le associazioni: In viene tradotta inserendo un riferimento (di tipo multiinsieme) agli accompagnatori nel soggiorno Assegn viene tradotta inserendo un riferimento alla piazzola nel soggiorno Tenendo conto anche di considerazione precedente sull identificazione, Fa viene tradotta inserendo un riferimento al cliente nel soggiorno. CREATE TYPE t_cliente AS (codfisc CHAR(16), nome VARCHAR(20), cognome VARCHAR(20), indirizzo VARCHAR(50), datan DATE, documento ROW(tipo CHAR, num VARCHAR(10), rilda VARCHAR(20), rilil DATE) ) NOT FINAL; CREATE TYPE t_accompagnatore AS (nome VARCHAR(20), cognome VARCHAR(20), datan DATE) NOT FINAL; CREATE TYPE t_piazzola AS (num DECIMAL(4), settore CHAR) NOT FINAL NOT INSTANTIABLE; CREATE TYPE t_pp UNDER t_piazzola AS (numtende DECIMAL(2)) NOT FINAL; CREATE TYPE t_pm UNDER t_piazzola AS (elettricita BOOLEAN, acqua BOOLEAN, mq DECIMAL(3,1)) NOT FINAL; CREATE TYPE t_soggiorno AS (cliente REF(t_cliente), datain DATE, datafine DATE, piazzola REF(t_piazzola), accompagnatori REF(t_accompagnatore) MULTISET SCOPE Accompagnatori, tipoattr CHAR, veicolo ROW(modello VARCHAR(30), targa CHAR(10))) NOT FINAL; 3
CREATE TABLE Clienti OF t_cliente (REF IS idc, PRIMARY KEY (codfisc) CHECK (documento.tipo IN ( c, p, g, e ))); CREATE TABLE Accompagnatori OF t_accompagnatore (REF IS ida, UNIQUE(nome, cognome,datan)); CREATE TABLE Piazzole OF t_piazzola (REF IS idp, PRIMARY KEY (num)): CREATE TABLE PP OF t_pp UNDER Piazzole; CREATE TABLE PM OF t_pm UNDER Piazzole; CREATE TABLE Soggiorni OF t_soggiorno (REF IS ids, cliente WITH OPTIONS SCOPE Clienti, piazzola WITH OPTIONS SCOPE Piazzole CHECK (tipoattr IN ( r, t, c ))); Nota: ci vorrebbero i vincoli di NOT NULL per gli attributi (non su datan in Accompagnatori e per veicolo in Soggiorno) 4
3. Presentare gli statement SQL per le seguenti operazioni: a) Inserire le informazioni relative ad un nuovo soggiorno effettuato dal cliente con carta di identita` AZ302456 rilasciata il 16 ottobre 2005 dal comune di Genova, con inizio 1 Luglio 2008 e termine 2 Luglio 2008 senza accompagnatori e con unica attrezzatura una tenda singola. INSERT INTO Soggiorni SELECT idc, DATE 01-Lug-08, DATE 02-Lug-08, NULL, MULTISET[], t, NULL FROM ClientI WHERE documento.tipo= c AND documento.num= AZ302456 AND documento.rilda= comune di Genova AND documento.rilil = DATE 16-Ott-05 ; b) Determinare il nome proprio dei bambini di eta` inferiore ad un anno che hanno effettuato (come accompagnatori) soggiorni in piazzole raggiungibili solo a piedi di durata superiore a tre giorni nell ultimo mese. SELECT E->nome FROM Soggiorni s, UNNEST(s.accompagnatori) T(E) WHERE s.piazzola IS OF t_pp AND CURRENT_DATE datain > INTERVAL 30 DAYS AND datafine datain > > INTERVAL 3 DAYS; Oppure SELECT E->nome FROM Soggiorni s, UNNEST(s.accompagnatori) T(E) WHERE s.piazzola IN (SELECT idp FROM PP) AND CURRENT_DATE datain > INTERVAL 30 DAYS AND datafine datain > > INTERVAL 3 DAYS; c) Determinare, per ogni cliente che ha effettuato piu di un soggiorno nel campeggio, il numero di soggiorni effettuati, il numero medio di accompagnatori e la durata del soggiorno piu` lungo che ha effettuato. SELECT cliente->codf, COUNT(*) AS nums, AVG(CARDINALITY(accompagnatori)) AS numma, MAX((dataFine datain) DAYS) AS maxd FROM Soggiorni GROUP BY cliente HAVING COUNT(*) >=2; 5
Esercizio 2 Si consideri il seguente schema relazionale Apparecchio(numSerie, marca, modello, anno, nomeprop, telprop) Riparazione(codR, numserie Apparecchio, data, tecnico, importotot) Voce(codR Riparazione, codguasto, descrguasto, importo) Gli apici rappresentano le relazioni riferite dalle chiavi esterne. Gli attributi sottolineati costituiscono chiavi primarie quelli in italico chiavi alternative. Il pedice O denota un attributo opzionale. Scrivere in SQL:2003 uno o più trigger per ottenere i seguenti comportamenti. Per ciascun trigger, scegliere una modalità di esecuzione appropriata e fornirne una giustificazione (almeno uno dei trigger progettati deve essere di tipo FOR EACH STATEMENT). 1. Assicurare che il valore contenuto nell attributo importotot della relazione Riparazione corrisponda alla somma degli importi delle singole voci relative a tale riparazione. CREATE TRIGGER CheckImporto AFTER INSERT ON Voce REFERENCES NEW TABLE AS NT FOR EACH STATEMENT UPDATE Riparazione R SET importotot = (SELECT SUM(importo) FROM Voce WHERE codr=r.codr) WHERE codr IN (SELECT codr FROM NT) AND importotot <> (SELECT SUM(importo) FROM Voce WHERE codr=r.codr) Trigger analoghi per DELETE ON Voce, UPDATE ON Voce, UPDATE OF importotot 2. Garantire che la data di una riparazione sia successiva al primo gennaio dell anno di produzione dell apparecchio. (Evitando il rollback della transazione). CREATE TRIGGER dataok AFTER INSERT ON Riparazione REFERENCES NEW ROW AS R FOR EACH ROW WHEN YEAR(R.data) < (SELECT anno FROM Apparecchio WHERE numserie = R.numSerie) DELETE FROM Riparazione WHERE codr=r.codr Trigger analoghi per UPDATE OF anno ON Apparecchio, UPDATE OF data ON Riparazione 6
3. Impedire che a voci di riparazioni effettuate nella stessa data su apparecchi della stessa marca e modello siano assegnati importi differenti. CREATE TRIGGER stessoimporto AFTER INSERT ON Voce REFERENCES NEW ROW AS R FOR EACH ROW WHEN EXISTS (SELECT * FROM Voce NATURAL JOIN Riparazione NATURAL JOIN Apparecchio WHERE importo <> R.importo AND data = R.data AND (marca, modello) = (SELECT marca, modello FROM Riparazione NATURAL JOIN Apparecchio WHERE codr= R.codR )) DELETE FROM Riparazione WHERE codr=r.codr Trigger analogo per UPDATE ON Voce,UPDATE ON Riparazione, UPDATE ON Apparecchio 4. Impedire che siano inserite più riparazioni per lo stesso apparecchio nella stessa data. (Evitando il rollback della transazione). CREATE TRIGGER no2rip AFTER INSERT ON Riparazione REFERENCES NEW ROW AS R FOR EACH ROW WHEN EXISTS (SELECT * FROM Riparazione WHERE numserie = R.numSerie AND data = R.data AND codr<>r.codr) DELETE FROM Riparazione WHERE codr=r.codr Discutere le eventuali interazioni tra i trigger progettati.. 7
Esercizio 3 Si consideri una base di dati spaziale che contiene alcune informazioni relative alla rete di distribuzione del gas metano di un azienda municipalizzata della Liguria: Il territorio viene classificato in area stradale, area edificata, area verde e area servizi (ciascuna con estensione poligonale). L area servizi si classifica ulteriormente in: stazione ferroviaria, scuola, università, ospedale, teatro e ufficio pubblico. La classificazione partiziona tutta la regione Liguria. La rete di distribuzione è suddivisa in tratte, identificate da un codice e descritte dai seguenti attributi: lunghezza, pressione a regime e pressione massima. Si memorizza inoltre il nodo di partenza, il nodo di arrivo della tratta e il tracciato tra i due nodi. Si memorizzano inoltre i nodi della rete di cui si conosce la posizione sul territorio e la tipologia, che puo` essere diramazione, stazione di pompaggio o contatore. Per i contatori si memorizza inoltre il numero del contatore, l indirizzo e il cognome e nome dell utente. Si rappresentino inoltre i seguenti vincoli: un nodo diramazione o stazione di pompaggio deve essere ubicato in un area stradale, un nodo di tipo contatore deve essere invece ubicato in un area edificata. Infine, ogni tratta della rete di distribuzione deve essere contenuta totalmente nella regione Liguria. a) Si progetti lo schema concettuale ER per la base di dati sopra descritta, indicando anche i vincoli di integrita non esprimibili nello schema. Vincoli spaziali principali -------------------------------- 1. La classificazione delle aree partiziona tutta la regione Liguria. 2. un nodo diramazione o stazione di pompaggio deve essere ubicato in un area stradale, 3. un nodo di tipo contatore deve essere invece ubicato in un area edificata. 4. ogni tratta della rete di distribuzione deve essere contenuta totalmente nella regione Liguria 5. La localizzazione dei nodi di partenza e arrivo di una tratta devono corrispondere ai punti di partenza e arrivo del tracciato della tratta 8
Ristrutturazione -------------------- Si ristruttura l entita` area Area Cod Estensione Tipo Tipo_servizi (0,1) b) Si progetti lo schema logico nel modello logico basato su Simple Feature Specification di OGC per la base di dati sopra descritta. Si presenti inoltre lo statement SQL per la creazione della porzione di schema relativa alle tratte della rete di distribuzione, inclusi eventuali vincoli di tipo CHECK. Area(Cod, estensione:polygon, tipo, tipo_servizi_0) Tratta(Cod, tracciato: LINESTRING, lun, pr, pm, nodop Nodo, nodoa Nodo ) Nodo(Cod, loc: POINT, tipo, ind, nome, cognome) CREATE TABLE tratta (cod VARCHAR(5), tracciato LINESTRING CHECK (tracciato.within(liguria)) lung NUMERIC(6,2), pr NUMERIC(6,2), pm NUMERIC(6,2), nonop VARCHAR(5) REFERENCES Nodo, nonoa VARCHAR(5) REFERENCES Nodo); Nel codice precedente assumo che Liguria sia una costante contenente la descrizione geometrica dell estensione ligure. c) Si presenti lo statement SQL per determinare il codice delle coppie di tratte tra loro adiacenti, insieme al punto di adiacenza (inteso come geometria). SELECT T1.Cod, T2.Cod,T1.tracciato.intersection(T2.tracciato) FROM Tratta T1, Tratta T2 WHERE T1.tracciato.touches(T2.tracciato) ; 9
10
SINTASSI SQL 2003 CREATE TYPE Nome AS ( Dichiarazioni_attributi) [INSTANTIABLE NOT INSTANTIABLE] [FINAL NOT FINAL]; CREATE TYPE Nome UNDER Nome_superclasse ( Dichiarazioni_attributi) [FINAL NOT FINAL]; CREATE TABLE Nome OF Nome_Tipo [( [<opzioni attributi>] [<vincoli a livello tabella>] [<identificazione>] )] <identificazione> := REF IS <nome colonna tabella> <opzioni attributi> := <nome attributo> WITH OPTIONS <opzione> <opzione> := <clausola default> <vincolo per attributo> Funzioni - Dereferenziazione DEREF - Riferimento - Trigger SQL-2003 CREATE TRIGGER Nome {BEFORE AFTER} Evento ON Relazione [REFERENCING {OLD AS Var NEW AS Var OLD AS Var NEW AS Var}] [FOR EACH {ROW STATEMENT}] [WHEN Condizione ] Comandi SQL con Evento: INSERT, DELETE, UPDATE [OF Lista Attributi] Condizione: clausola WHERE SQL Se l azione comprende piu di un comando: BEGIN ATOMIC END; 11
CLASSI CON METODI SIMPLE FEATURE SPECIFICATION OGC 12