Esercizio ER 1 Si vuole rappresentare una base di dati per una stazione radio. Nella stazione radio lavorano conduttori, tecnici, e personale amministrativo, per ciascuno dei quali si vuol tenere traccia del codice fiscale e dei dati anagrafici. Per il personale amministrativo si vuole memorizzare la qualifica, e per i tecnici la specializzazione. Conduttori e tecnici sono assegnati ad una o più trasmissioni della radio. Per ogni trasmissione, caratterizzata da un nome, si vuole tenere traccia dell'orario e del giorno a cui viene trasmessa. In ogni trasmissione vengono trasmessi dei brani musicali, per i quali si vuole tenere traccia del titolo e del numero progressivo all'interno dell'lp a cui appartengono. Per ogni LP, si vuole tenere traccia del titolo, del codice, della casa discografica, e degli autori. Inoltre, a una trasmissione possono partecipare uno o più ospiti in studio, per i quali si vuole tenere traccia del codice fiscale, del nome e, se noti, dei numeri di telefono, e della data in cui partecipano alla trasmissione. Si assuma che un brano non venga mai trasmesso due volte nella stessa trasmissione, e che un ospite non partecipi mai due volte alla stessa trasmissione. Descrivere con un diagramma Entità-Relazione lo schema concettuale di una base dati per lo scenario descritto. Costruire, a partire dallo schema concettuale derivato al punto precedente, lo schema logico relazionale per la stessa base di dati. (Facoltativo) Rimuovere l'assunzione circa i brani, e considerare (sia nel progetto concettuale che in quello logico) anche il caso in cui un brano venga trasmesso più volte, in date diverse, durante la medesima trasmissione. Soluzione ER 1
AMMINISTRATIVO(CF, DatiAnagr, Qualifica) TECNICO(CF, DatiAnagr, Specializzazione) CONDUTTORE(CF, DatiAnagr) TRASMISSIONE(Nome, Giorno, Ora) ASSEGNATO TECNICO(CF, NomeTrasm) ASSEGNATO CONDUTTORE(CF, NomeTrasm) LP(Cod, Titolo, CasaDisc) AUTORE(CodLP, NomeAutore) BRANO(CodLP, Titolo, NProgr) OSPITE(CF, Nome) NTEL OSPITE(CF, Numero) TRASMESSO(NomeTrasm, Titolo, CodLP, Data) INVITATO(NomeTrasm, CF, Data) Esercizio ER 2 Si vuole rappresentare una base di dati per la gestione del programma di una manifestazione di concerti di musica classica. I concerti proposti nel programma sono caratterizzati da titolo e descrizione. Ogni concerto è composto da un certo numero di pezzi musicali, ognuno caratterizzato da un titolo e da uno o più autori. Inoltre, per ogni concerto si conosce l'ordine in cui sono rappresentati i pezzi che fanno parte del programma. L'esecutore di ogni concerto è identificato da un codice, ed è caratterizzato da nome e stato di provenienza. L'esecutore può essere un'orchestra oppure un solista. Nel caso delle orchestre si memorizzano il nome del direttore e il numero di elementi nell'orchestra, mentre nel caso dei solisti si considera lo strumento suonato. Per le orchestre, inoltre, si memorizzano i componenti (un orchestrale può suonare in una sola orchestra), identificati da un codice univoco all'interno dell'orchestra, e caratterizzati da nome, data di nascita e lo strumento suonato. I concerti sono tenuti in sale da concerto, identificate da un codice univoco e caratterizzate da nome, indirizzo, capienza massima, numero di posti a sedere, ed eventualmente da uno o più numeri di telefono. Ogni concerto può essere programmato in una o più date (ma mai nella stessa sala). Per ogni programmazione di un concerto è noto il prezzo del biglietto, che può essere diverso per programmazioni diverse dello stesso concerto. Descrivere con un diagramma Entità-Relazione lo schema concettuale di una base dati per lo scenario descritto. Costruire, a partire dallo schema concettuale derivato al punto precedente, lo schema logico relazionale per la stessa base di dati. (Facoltativo) Rimuovere l'assunzione circa le sale, e considerare (sia nel progetto concettuale che in quello logico) anche il caso in cui un concerto possa avere luogo anche più volte, in date diverse, nella stessa sala.
Soluzione ER 2 CONCERTO(TitoloC, Descr) SOLISTA(Cod, Nome, Stato, Strumento) ORCHESTRA(Cod, Nome, Stato, NomeDirettore, NElementi) COMPONENTE(Cod, CodOrchestra, Nome, DataN, Strumento) ORCHESTRA ESEGUE(CodConcerto, CodOrchestra) SOLISTA ESEGUE(CodConcerto, CodSolista) SALA(Cod, Nome, Indirizzo, NPostiSedere, CapienzaMax) NTEL SALA(Numero, CodSala) HA LUOGO(CodConcerto, CodSala, Data, PrezzoBiglietto) Esercizi SQL 1. Sia dato il seguente schema relazionale: LP(CodLP, Titolo, CodAutore, Anno, CasaDiscografica) AUTORE(CodAutore, Nome) a) Visualizzare l anno di registrazione dell LP Nuvole di F. de Andrè. b) Visualizzare il titolo degli LP registrati dai Pearl Jam dal 1990 in avanti. c) Visualizzare il nome degli autori che hanno registrato LP con una sola casa discografica, realizzando tale interrogazione mediante il costrutto NOT EXISTS. 2. Sia dato il seguente schema relazionale: LAVORA-IN(CodImpiegato, CodUfficio) IMPIEGATO(CodImpiegato, Nome, Titolo, Stipendio) a) Visualizzare nome e codice di tutti gli impiegati che percepiscono uno stipendio mensile superiore ai 2.000.000 di lire. b) Visualizzare il nome e il codice di tutti gli impiegati che condividono l ufficio con il Rag. Fantozzi.
c) Visualizzare il nome di tutti gli impiegati che condividono l ufficio con esattamente un altra persona che ha inoltre stipendio maggiore del loro. 3. Sia dato il seguente schema relazionale: STUDENTI(Matr, Nome, AnnoIscr) ESAMI(CodCorso, Matr, Data, Voto) PIANO-STUDI(Matr, CodCorso, Anno) a) Visualizzare il nome di tutti gli studenti che hanno superato l esame di tutti i corsi indicati nel loro piano di studi. Soluzioni SQL 1. (a) SELECT Anno WHERE Titolo = "Nuvole" AND Nome = "De Andre " AND LP.CodAutore = Autore.CodAutore; (b) SELECT Titolo WHERE Nome = "Pearl Jam" AND LP.CodAutore = Autore.CodAutore; AND Anno >= 1990; (c) SELECT Nome WHERE LP.CodAutore = Autore.CodAutore FROM LP AS LP2 WHERE LP2.CodAutore = Autore.CodAutore AND LP.CasaDiscografica <> LP2.CasaDiscografica); 2. (a) SELECT Nome, CodImpiegato FROM Impiegato AS I WHERE Stipendio > 2.000.000; (b) SELECT Nome, CodImpiegato FROM Impiegato WHERE Nome <> "Fantozzi" AND CodImpiegato IN (SELECT CodImpiegato FROM LavoraIn WHERE CodUfficio = (SELECT CodUfficio FROM LavoraIn AS L, Impiegato AS I WHERE Nome = "Fantozzi" AND Titolo = "Rag." AND L.CodImpiegato = I.CodImpiegato)) L interrogazione (equivalente) con il join è assai più complessa: SELECT I2.Nome, I2.CodImpiegato FROM Impiegato AS I1, Impiegato AS I2
LavoraIn AS L1, LavoraIn AS L2 WHERE I1.Nome = "Fantozzi" AND I2.Nome <> "Fantozzi" AND I1.Titolo = "Rag." AND I1.CodImpiegato = L1.CodImpiegato AND L1.CodUfficio = L2.CodUfficio AND L2.CodImpiegato = I2.CodImpiegato; In pratica, I1 e L1 sono impiegate per determinare l ufficio di Fantozzi, mentre I2 e L2 sono impiegate per trovare i nomi dei suoi compagni di ufficio. (c) SELECT I1.Nome FROM Impiegato AS I1, Impiegato AS I2 LavoraIn AS L1, LavoraIn AS L2 WHERE I1.CodImpiegato = L1.CodImpiegato AND L1.CodUfficio = L2.CodUfficio AND L2.CodImpiegato = I2.CodImpiegato AND I2.Stipendio > I1.Stipendio FROM Impiegato AS I3, LavoraIn AS L3 WHERE L1.CodUfficio = L3.CodUfficio AND L3.CodImpiegato <> L2.CodImpiegato AND L3.CodImpiegato <> L1.CodImpiegato); 3. (a) SELECT Nome FROM Studenti WHERE NOT EXISTS FROM PianoStudi FROM Esame WHERE Esame.Matr = Studenti.Matr AND PianoStudi.Matr = Studenti.Matr AND Esame.CodCorso = PianoStudi.CodCorso));