Prova Scritta di Modelli dei Dati di Nuova Generazione

Transcript

Prova Scritta di Modelli dei Dati di Nuova Generazione
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
1
2
3
Totale
Punti
previsti
15
10
8
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, numSerieApparecchio, data, tecnico, importoTot)
Voce(codRRiparazione, 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.
5.
ogni tratta della rete di distribuzione deve essere contenuta totalmente nella regione Liguria
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, nodoPNodo, nodoANodo)
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