Prova Scritta di Basi di Dati 25 Luglio 2006 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 13 2 10 3 10 Totale 33 Punti assegnati
Esercizio 1 Vogliamo realizzare una base di dati che mantenga informazioni su componenti di arredamento, da utilizzare per effettuare proposte di arredo ai clienti di uno studio di architettura. Ogni componente di arredo (ad esempio tavolo, sedie, ecc.), è caratterizzato da un codice identificativo, un nome, una breve descrizione, dalla data in cui è iniziata la sua produzione e dalle sue dimensioni. Per ogni componente, vogliamo mantenere informazioni sui colori in cui \`e disponibile e sui materiali (ad esempio legno, laminato plastico, ecc.). Ogni componente può essere disponibile in piu colori e in piu materiali. Per ogni componente, vogliamo inoltre mantenere informazioni sulla azienda produttrice. In particolare, per ogni azienda, vogliamo mantenere, il nome, l'indirizzo, il numero di telefono e di fax, ed il nome e cognome della persona di riferimento. Ogni componente pu\`o essere prodotto da piu aziende, mentre la stessa azienda pu\`o produrre piu componenti utilizzati dallo studio di architettura. Nella base di dati, vogliamo inoltre mantenere informazioni sui progetti che lo studio realizza. Per ogni progetto vogliamo mantenere le informazioni sul cliente per cui il progetto e stato sviluppato (nome, cognome, codice fiscale, indirizzo), sulla data in cui il progetto e stato realizzato e sull'architetto che lo ha realizzato (nome, cognome, recapito). Per semplicita assumiamo che ogni progetto sia realizzato da un solo architetto, mentre lo stesso cliente puo avere piu progetti ad esso associati. Ogni progetto si compone del progetto di una serie di ambienti. Per ogni ambiente vogliamo mantenere il nome (cucina, soggiorno, ecc.), le dimensioni (lunghezza, larghezza e altezza) ed il colore del pavimento e delle pareti. Vogliamo inoltre mantenere informazioni sui componenti di arredo che il progetto prevede di collocare in ogni ambiente, con l'indicazione del colore, del materiale scelto e della ditta fornitrice. Si richiede di: a) Definire uno schema ER per la situazione sopra descritta. Precisare la cardinalità delle associazioni e degli attributi (se diversa da quella di default), i vincoli di identificazioni (chiavi), facendo opportune assunzioni, e la tipologia delle generalizzazioni.
b) Precisare eventuali vincoli di integrità non rappresentabili nello schema ER proposto. 1. Il colore e il materiale con cui una componente viene utilizzato in un progetto devo appartenere all insieme dei colori e dei materiali con cui la componente e disponibile. 2. L azienda che produce una componente per un progetto deve appartenere all insieme delle aziende che producono quella componente 3. La data di inizio distribuzione di una componente deve precedere la data dei progetti che contengono quella componente. c) Generare lo schema ristrutturato corrispondente allo schema ER definito al punto a), indicando eventuali nuovi vincoli di integrita.
d) Realizzare uno schema relazionale corrispondente allo schema ristrutturato definito al punto c), indicando le chiavi, le chiavi esterne (usare una freccia dagli attributi riferenti a quelli riferiti), gli attributi che possono essere nulli e le eventuali chiavi secondarie. COMPONENTE(CodC,Nome,Descr,Dim,Data) AZIENDA(Nome,Ind,Tel,Fax,NomeR,CognR) PROGETTI(Data,NomeA,CognomeA,CF) con CF chiave esterna su CLIENTE, e (NomeA,CognomeA) chiave esterna su ARCHITETTO ARCHITETTO(Nome,Cognome,Ind) CLIENTE(CF,Nome,Cogn,Ind ) COLORI(NomeC) MATERIALI(NomeM) FATTO_DI(CodC,NomeM) con CodC chiave esterna su COMPONENTE e NomeM chiave esterna su MATERIALI DI_COLORE(CodC,NomeC) CodC chiave esterna su COMPONENTE e NomeM chiave esterna su MATERIALI PRODOTTO_DA(CodC,NomeAzienda,Indirizzo), con (NomeAzienda,Indirizzo) chiave esterna su AZIENDA e CodC chiave esterna su COMPONENTE UTILIZZA(DataP,NomeA,CognomeA,CodC,NomeAzienda,Indirizzo,Colore,Materiale) con (NomeAzienda,Indirizzo) chiave esterna su AZIENDA, CodC chiave esterna su COMPONENTE e (DataP,NomeA,CognomeA) chiave esterna su PROGETTI e) Discutere eventuali ottimizzazioni allo schema A tutte le relazioni con identificatore composto puo essere aggiunto un campo codice, per ridurre il numero di attributi di cui e composta la chiave. Inoltre le relazioni COLORI e MATERIALI possono essere eliminate in quanto, in base ai vincoli dello schema, i valori dei campo NomeC e NomeM compariranno certamente nelle relazioni FATTO_DI e DI_COLORE
Esercizio 2 Si consideri il seguente schema relazional, relativo alle mostre esibite in un museo: OPERA(CodO,Nome,Autore,Tipo) MOSTRA(CodM, Nome,CodO,Stanza,Piano) AUTORE(Codice,Nome,Cognome,DataNascita) Nello schema precedente, attributi con lo stesso nome rappresentano chiavi e chiavi esterne. Il campo Autore in OPERA e inoltre chiave esterna su AUTORE. Si richiede di formulare le seguenti interrogazioni, in algebra relazionale: a) Determinare il nome delle mostre che contengono almeno una scultura di un autore nato prima del 1900 e che risiedono al piano terra Qui e nelle interrogazioni seguenti indichiamo con: OPERA_R = ρ Nome NomeO (OPERA ) AUTORE_R = ρ Nome NomeA (AUTORE ) Inoltre NJ indica il join naturale e JOIN il join (per semplicita di scrittura) π Nome (σ Tipo= scultura AND Piano = terra AND DataNascita < 1/1/1900 (MOSTRE NJ OPERA JOIN Autore=Codice AUTORE)) b) Determinare le mostre che contengono almeno due opere di autori distinti e che non contengono sculture. Determiniamo le mostre che non contengono sculture: R= π CodM (MOSTRA) - π CodM (σ Tipo= scultura (MOSTRE)) Determiniamo le mostre che contengono opere di almeno due autori distinti: S1 = π CodM,Autore (MOSTRA NJ OPERA_R) S= π Nome (σ Autore Autore1 (S1 NJ ρ Autore Autore1 (S1))) Risultato: R S
c) Determinare i piani che contengono almeno un opera per ogni tipo. R= π Tipo,Piano (MOSTRA NJ OPERA_R) S= π Tipo (OPERA) R : S d) Determinare l autore piu giovane le cui opere sono contenute nel museo. Determiniamo il codice degli autori per cui esiste un autore piu giovane S1 = π Codice,DataNascita (AUTORE) S= π Codice (σ DataNascita < DN (S1 NJ ρ Codice C, DataNascita DN (S1))) Determiniamo il risultato per differenza π Codice (AUTORE) S
Esercizio 3 In riferimento allo schema proposto nel contesto dell Esercizio 2, presentare i comandi SQL corrispondenti alle seguenti operazioni: a) Determinare il nome delle mostre che contengono almeno una scultura di un autore nato prima del 1900 e che risiedono al piano terra. SELECT FROM MOSTRA M, OPERA O, AUTORE A WHERE M.CodO = O.CodO AND O.Autore = A.Codice AND Tipo = scultura AND DataNascita < 1/1 1900 AND Piano = terra ; b) Determinare le mostre che contengono almeno due opere di autori distinti e che non contengono sculture. SELECT CodM FROM MOSTRA JOIN OPERA ON MOSTRA.CodO = OPERA.CodO WHERE CodM NOT IN (SELECT CodM FROM MOSTRA M, OPERA O WHERE M.CodO = O.CodO AND Tipo = scultura ) GROUP BY CodM HAVING COUNT(DISTINCT Autore) > = 2; c) Determinare l autore piu giovane le cui opere sono contenute nel museo. SELECT Codice FROM AUTORE WHERE DataNascita >= ALL (SELECT DataNascita FROM AUTORE JOIN OPERA ON Codice = Autore); d) Creare una vista che per ogni mostra che contiene almeno 10 opere, la data di nascita dell autore piu vecchio ed il numero totale di opere di pittura in essa esposte. Nella correzione, non ho contato gli errorei relativi alla selezione sul tipo dell opera. Se non ci fosse la restrizione su opere di pittura la query sarebbe (versione considerata per la correzione): CREATE VIEW Opere10 AS SELECT CodM, min(datanascita),count(codo) FROM MOSTRA M, OPERA O, AUTORE A WHERE M.CodO = O.CodO AND O.Autore = A.Codice A GROUP BY CodM HAVING COUNT(CodO) >= 10; Con la condizione su pittura, al query era effettivamente piu complessa: R= SELECT CodM, min(datanascita) as DN FROM MOSTRA M, OPERA O, AUTORE A WHERE M.CodO = O.CodO AND O.Autore = A.Codice A GROUP BY CodM HAVING COUNT(CodO) >= 10;
S = SELECT CodM, COUNT(CodO) as NO FROM MOSTRA M, OPERA O, AUTORE A WHERE M.CodO = O.CodO AND O.Autore = A.Codice A AND Tipo = pittura GROUP BY CodM; Risultato: CREATE VIEW Opere10Pittura AS SELECT CodM,DN,NO FROM R NATURAL JOIN S;