Prova Scritta di Basi di Dati 4 Giugno 2007 COGNOME: NOME: MATRICOLA: Si prega di risolvere gli esercizi direttamente sui fogli del testo, negli spazi indicati. Usare il foglio protocollo solo per la brutta copia. Esercizio Punti previsti 1 11 2 8 3 8 4 6 Totale 33 Punti assegnati
Esercizio 1 Si vuole progettare una base di dati per la gestione delle prenotazioni delle navi della compagnia In Mezzo al Mar. Ogni nave della flotta è identificata da un nome proprio ed è caratterizzata dalle sue dimensioni, capacità, intesa come numero massimo di persone, velocità e km percorsi. Ogni nave offre dei posti in poltrona, cabine di diverse tipologie e posti auto/moto. Nel caso di un posto in poltrona si vuole sapere il numero identificativo ad essa assegnato ed il nome della sala in cui la poltrona si trova. Nel caso di una cabina, la base di dati deve memorizzare il numero identificativo, il nome del ponte in cui si trova, il numero di posti letto, se è dotata di servizi interni e se è presente un oblò. Inoltre, per ogni posto auto si tiene traccia del livello in cui si trova e del numero identificativo ad esso assegnato. In generale, per ogni posto (poltrona, cabina, o posto auto) si vuole sapere lo stato (se disponibile per prenotazione) ed il costo. Inoltre, il numero assegnato a ciascuna sistemazione (cabina, poltrona, posto autom/moto) e` unico all interno di ogni nave. Le navi della compagnia In Mezzo al Mar coprono diverse tratte. Ogni tratta è caratterizzata dal porto di partenza, d arrivo ed il corrispondente chilometraggio. La base di dati deve memorizzare gli orari di partenza ed arrivo con cui le navi percorrono le tratte ed il giorno della settimana in cui la percorrono. Si assume che una nave possa percorrere una tratta una sola volta alla settimana. I clienti che effettuano le prenotazioni sono caratterizzati dal codice fiscale, nome, cognome, ed uno o più numeri di telefono. Ogni prenotazione e` identificata da un codice alfanumerico. Per ogni prenotazione si vogliono memorizzare il cliente che l ha effettuata, la data di prenotazione, la data del viaggio, i posti assegnati al cliente in una certa nave (anche piu` di uno), la tratta di interesse e l importo totale dovuto dal cliente. Per ogni posto prenotato, il cliente deve fornire codice fiscale, nome e cognome, ed età del passeggero che occuperà il posto. Inoltre, nel caso di prenotazione di un posto auto è necessario fornire il modello e la targa dell automobile o motocicletta. Un posto può essere prenotato solo se disponibile. Si richiede di: a) Definire uno schema ER per la situazione sopra descritta (ristrutturare le specifiche se necessario). Precisare la cardinalità delle associazioni e degli attributi (se diversa da quella di default) ed i vincoli di identificazioni.
Assumo che la disponibilità` di un posto indichi se un posto e` agibile (quindi utilizzabile). La disponibilità` non dipende quindi dallo specifico viaggio.
b) Fornire, come documentazione aggiuntiva allo schema ER, il tipo delle eventuali generalizzazioni presenti nello schema e l elenco dei vincoli di integrità non rappresentabili nello schema ER proposto. Generalizzazione su Posto: totale, esclusiva Vincoli: Non indico i vincoli di dominio perche` in genere nella progettazione concettuale vengono specificati a parte. 1. I km percorsi da una nave devono essere superiori o uguali al chilometraggio di almeno una tratta coperta dalla nave 2. In Tratta: orap < oraa 3. In Prenotazione: datap <= datav, imptot >= somma costi dei posti prenotati nel contesto della prenotazione, la tratta corrispondente deve essere coperta dalla nave di cui vengono prenotati i posti 4. + vincoli banali (ad esempio eta >0, costo >0) c) Generare lo schema ristrutturato corrispondente allo schema ER definito al punto a), e presentare l insieme dei vincoli di integrita per lo schema ristrutturato. Ci sono due costrutti da ristrutturare: tel in Cliente generalizzazione di Posto Presento solo i costrutti ristrutturati, tutto il resto rimane uguale. Nuovi vincoli: 5. In Posto, Sala <> NULL sse tipo = Poltrona, Ponte, Nletto, Servizi, Oblo <> NULL sses tipo = cabina, livello <> NULL sse tipo = auto/moto
CLIENTE (1,n) rispondea (1,n) TELEFONO Num Disponibile costo numero POSTO Tipo Sala (0,1) Ponte (0,1) NLetto Servizi Oblo livello (0,1) (0,1) (0,1) (0,1) d) Realizzare uno schema relazionale corrispondente allo schema ristrutturato definito al punto c), indicando le chiavi, primarie ed alternative, le chiavi esterne, gli attributi che possono essere nulli ed i vincoli di integrita per tale schema, indicando la tipologia di ciascuno di essi. Nave(Nome, Dim, Capacita, Vel, Km) Tratta(portoP, PortoA, Km) Posto(NomeNave Nave, Num, Disponibile, Costo, Tipo, Sala 0, Ponte 0, NLetto 0, Servizi 0, Oblo 0, Livello 0 ) Cliente(CF, Nome, Cogn) Prenotazione(Cod, DataP, DataV, ImpTot, Cliente Cliente, portop Tratta, portoa Tratta, km Tratta ) Copre(NomeNave Nave, portop Tratta, portoa Tratta, km Tratta, orap, oraa, giorno) RelativaA(codPren Prenotazione, NomeNave Posto, numposto Posto, CF, nome, cogn, eta, targa 0, modello 0 ) Telefono(numero) RispondeA(Cliente Cliente, numero Telefono) VINCOLI 1. asserzione 2. check su tupla 3. check su tupla, asserzione, asserzione 4. check su attributo 5. asserzione e) Discutere eventuali ottimizzazioni allo schema Aggiungere un codice identificativo alle tratte ridurrebbe la ridondanza (poiche esistono chiavi esterne su tratte). Telefono si puo` eliminare
Esercizio 2 Si consideri il seguente schema relazionale, relativo alle proiezioni cinematografiche effettuate presso il cinema Odeon: La relazione Sala mantiene le informazioni relative alle sale di proiezione; ognuna di esse ha un nome ed è caratterizzata da un certo numero di posti a sedere. La relazione Film contiene i dati dei film. Ogni film è identificato da un codice, ha un titolo, un regista, un anno di uscita nelle sale cinematografiche (che può non essere noto) e una durata espressa in minuti. Inoltre, per ogni film si vuole mantenere il relativo genere (ad esempio: commedia, animazione, fantascienza). La relazione Proietta mantiene le informazioni riguardo la programmazione del cinema, con le indicazioni della data e dell orario di proiezione dei film nelle diverse sale. La relazione Personale mantiene i dati anagrafici dei dipendenti del cinema. Infine, la relazione AssisteProiez contiene i dati del personale che ha assistito una determinata proiezione di un film e l indicazione del ruolo, ovvero la mansione (ad esempio: maschera, assistente alla sicurezza, cassiere) ricoperto dall addetto durante la proiezione. Si richiede di formulare le seguenti interrogazioni, in algebra relazionale: a) Trovare i titoli ed il genere dei film proiettati nella sala Corallo a dicembre 2007 nella fascia serale (ovvero fra le 20 e le 24). JOIN indica l operazione di theta-join, per semplicita di scrittura (ma voi dovete utilizzare il simbolo corretto nelle prove scritte!) Π titolo, genere (σ nomes= Corallo orainizio >= 20 data >= 1/1/07 data <= 31/12/07 (Film JOIN codfilm = Film Proietta)) b) Trovare le sale in cui è stato proiettato almeno 2 volte lo stesso film. Π nomes (σ Data <> D OraInizio <> O (Proietta JOIN ρ Data,OraInizio D,O Proietta)) c) Trovare le sale in cui sia stato proiettato almeno un film di genere drammatico e nessun film di genere horror. R = sale in cui e` stato proiettato almeno un film di genere drammatico R = Π nomes (σ genere = drammatico (Film JOIN film=codfilm Proietta)) S = sale in cui e` stato proiettato almeno un film di genere horror R = Π nomes (σ genere = horror (Film JOIN film=codfilm Proietta)) Soluzione: R - S
d) Determinare le sale con almeno 30 posti in cui sono stati proiettati tutti i film di Dario Argento. Nel seguito, NJ indica l operazione di join naturale, per semplicita di scrittura (ma voi dovete utilizzare il simbolo corretto nelle prove scritte!) R = sale con almeno 30 posti e film proiettati R = Π nomes,film (σ nposti > = 30 (Sala NJ Proietta JOIN film=codfilm Film)) S = codice film di Dario Argento S = Π codfilm (σ regista = Dario Argento (Film)) Soluzione : R : S
Esercizio 3 In riferimento allo schema proposto nel contesto dell Esercizio 2: presentare i comandi SQL corrispondenti alle seguenti operazioni: a) Trovare i titoli ed il genere dei film proiettati nella sala Corallo a dicembre 2007 nella fascia serale (ovvero fra le 20 e le 24). SELECT titolo, genere FROM Proietta JOIN Film ON film = codfilm WHERE nomes = Corallo AND data BETWENN DATE 01/01/2007 AND DATE 31/12/2007 AND orainizio > = 20; b) Determinare il codice fiscale della persona che ha assistito al minor numero di film di durata superiore a 3 ore, con stipendio superiore alla media degli stipendi di tutti gli assistenti. SELECT codfisc FROM Personale NATURAL JOIN AssisteProiez NATURAL JOIN Proietta JOIN Film ON film = codfilm WHERE durata > = 3 AND StipMensile > (SELECT AVG(stipMensile) FROM Personale NATURAL JOIN AssisteProiez) GROUP BY codfisc HAVING count(*) <= (SELECT COUNT(*) FROM AssisteProiez NATURAL JOIN Proietta JOIN Film ON film = codfilm WHERE durata > = 3 GROUP BY codfisc); c) Aggiornare le proiezioni dei film di durata superiore alla durata media dei film con il loro stesso genere, indicando come sala di proiezione la nuova sala Ambra. UPDATE Proietta SET nomes = Ambra WHERE film in (SELECT codfilm FROM Film F WHERE durata > (SELECT AVG(durata) FROM Film WHERE genere = F. genere));
Esercizio 4 Si consideri la relazione R(ABCDEF) ed il seguente insieme G di dipendenze funzionali: AB CD EAF C F B a) Determinare se l insieme delle dipendenze G è minimale. Se non lo è, generare un insieme di dipendenze minimale equivalente a G. b) Determinare le chiavi dello schema. c) Verificare se lo schema è in BCNF o in 3NF, giustificando la risposta. d) Presentare una decomposizione 3NF lossless join dello schema originale, che preserva le dipendenze. e) La decomposizione 3NF ottenuta al passo precedente, è anche BCNF? Se lo è preserva le dipendenze? L insieme non e minimale. L insieme minimale equivalente e`: AB C AB D F B Sicuramente AF appartengono alla chiave. AF+ = AFBCD, quindi AF e` chiave ed e` anche l unica Lo schema non e` in BCNF (F non e` chiave o superchiave), non e` in 3NF (B non e` primo). Decomposizione in 3NF: R1(ABC) R2(ABD) R3(FB) Metto insieme schemi che derivano da dip funzionali con la stessa parte sinistra: R4(ABCD) R3(FB) Aggiungo schema con attributi chiave: R4(ABCD) AB CD chiave AB R3(FB) F B chiave F R5(AF) chiave AF Non ci sono schemi da eliminare, quindi questa e` la decomposizione finale. E anche in BCNF.
CREATE TABLE Nome Tabella ( [ LIKE Nome Tabella, ] spec_col 1,...,spec_col n ) [, PRIMARY KEY (Lista Nomi Colonne)] [, UNIQUE (Lista Nomi Colonne)] [, FOREIGN KEY (Lista Nomi Colonne) REFERENCES Nome Tabella Riferita [ON DELETE { NO ACTION RESTRICT CASCADE SET NULL SET DEFAULT } ] [ON UPDATE { NO ACTION RESTRICT CASCADE SET NULL SET DEFAULT } ] ] [, FOREIGN KEY ] [CHECK Condizione]; : : : [CHECK Condizione]; ); CREATE TABLE Nome Tabella [ WITH DATA ] AS Query; spec_col i = Nome Colonna i Dominio i { [GENERATED ALWAYS AS Espressione ] [DEFAULT Valore Default] [NOT NULL] [PRIMARY KEY] [UNIQUE] [CHECK Condizione] } CREATE ASSERTION Nome Vincolo CHECK Condizione; DROP TABLE Nome Tabella {RESTRICT CASCADE}; ALTER TABLE Nome Tabella ADD COLUMN spec_col; ALTER TABLE Nome Tabella ALTER COLUMN Nome Colonna { SET DEFAULT Valore default DROP DEFAULT }; ALTER TABLE Nome Tabella DROP COLUMN Nome Colonna {RESTRICT CASCADE}; SELECT [DISTINCT] R i1.c 1,,R in.c n FROM R 1,,R n WHERE Condizione [ GROUP BY Lista Nomi Colonne [HAVING Condizione su aggregazione] ] [ ORDER BY Lista Nomi Colonne ]; Clausola FROM puo anche contenere operazioni di JOIN: - Nome Relazione CROSS [ LEFT OUTER RIGHT OUTER INNER ] JOIN Nome Relazione - Nome Relazione [ LEFT OUTER RIGHT OUTER INNER ] JOIN Nome Relazione ON Predicato - Nome Relazione [ LEFT OUTER RIGHT OUTER INNER ] JOIN Nome Relazione USING Lista Nomi Colonne - Nome Relazione NATURAL [ LEFT OUTER RIGHT OUTER INNER ] JOIN Nome Relazione Condizione e una combinazione booleana di predicati, inclusi i seguenti: - C BETWEEN v 1 AND v 2 - C IN (v 1,,v n ), C IN sq - C LIKE pattern, con pattern stringa di caratteri che puo contenere i caratteri speciali % e _ - EXISTS sq, NOT EXISTS sq - ANY sq, ALL sq - UNION, INTERSECT, EXCEPT tra query
Funzioni di gruppo: - MAX, MIN, SUM, AVG, COUNT - Per ciascuna due versioni f(distinct Nome Colonna) f(nome Colonna) - Per COUNT: COUNT(*) COUNT(DISTINCT Nome Colonna) COUNT(Nome Colonna) INSERT INTO Nome Tabella [ ( C 1,..., C n ) ] { VALUES (e 1,..., e n ) sq } ; DELETE FROM Nome Tabella [alias] [ WHERE Condizione ]; UPDATE Nome Tabella [alias] SET C 1 = { e 1 NULL },, C n = { e n NULL } [ WHERE Condizione ]; CREATE VIEW Nome [ ( Lista Nomi Colonne ) ] AS Query [ WITH [ { LOCAL CASCADED} ] CHECK OPTION];