Basi di dati II prova intermedia 16 Marzo 2006 Compito 1
Transcript
Basi di dati II prova intermedia 16 Marzo 2006 Compito 1
Nome, Cognome, Matricola:_____________________ Basi di dati II prova intermedia 16 Marzo 2006 Compito 1 Esercizio Si progetti la base di dati che rispetta le seguenti specifiche. <.. OMISSIS ..> E’ richiesto di produrre il diagramma ER e lo schema relazionale indicando per ogni relazione la chiave, gli attributi che possono assumere valori nulli (con un asterisco), e i vincoli di chiave esterna (utilizzando una freccia dall’attributo della tabella secondaria a quello della tabella primaria). Quesiti 1. Dato il seguente diagramma ER Codice Nome Indirizzo Cliente PIVA (0,N) Richiesta Codice Nome Codice (1,1) Prodotto (0,N) Composizi one (1,N) Ordine Data Prezzo Scheda Codice Requisiti Tipo Hardware Software (0,1) Realizzazi one (0,N) Programmatore Descrizione Nome Indirizzo A. Quale delle seguenti affermazioni è corretta? ☞ Prezzo è un attributo dell’entità Hardware Prezzo è un attributo ereditato dall’entità padre Prodotto Prezzo non è un attributo dell’entità Software L’entità Hardware non è in relazione con l’entità Ordine Prodotto è in relazione con l’entità Programmatore B. Quale delle seguenti affermazioni è corretta? Richiesta è una relazione “molti-a-molti” ☞ Un software può essere realizzato da un programmatore La relazione Realizzazione è una relazione uno-a-molti e lega eventualmente un Software al programmatore che l’ha realizzato. E’ opzionale visto che la cardinalità minima è 0. Composizione è una relazione “uno-a-molti” Un ordine riguarda un solo prodotto C. Uno schema relazionale che rappresenta in modo corretto il diagramma ER è PRODOTTO(Codice,Nome,Prezzo,HW_SW,Tipo*,Scheda*,Requisiti*, Descrizione*,Programmatore*) PROGRAMMATORE(Codice,Nome,Indirizzo) CLIENTE(Codice,Nome,Indirizzo,PIVA) ORDINE(Codice,Data,Cliente,Prodotto) PRODOTTO(Codice,Nome,Prezzo) HARDWARE(Tipo,Scheda) SOFTWARE(Requisiti,Descrizione,Programmatore*) PROGRAMMATORE(Codice,Nome,Indirizzo) CLIENTE(Codice,Nome,Indirizzo,PIVA) COMPOSIZIONE(Prodotto,Ordine) ORDINE(Codice,Data,Cliente) ☞ PRODOTTO(Codice,Nome,Prezzo,HW_SW,Tipo*,Scheda*,Requisiti*, Descrizione*,Programmatore*) PROGRAMMATORE(Codice,Nome,Indirizzo) CLIENTE(Codice,Nome,Indirizzo,PIVA) ORDINE(Codice,Data,Cliente) COMPOSIZIONE(Prodotto,Ordine) La gerarchia è eliminata accorpando le figlie nel padre. Questa soluzione prevede l’aggiunta dell’attributo HW_SW per discriminare le due sottocategorie. Inoltre gli attributi propri di ciascuna figlia possono assumere valori nulli (Tipo, Scheda, Requisiti, Descrizione, Programmatore). La relazione Realizzazione è uno-a-molti ed è tradotta mettendo l’attributo Programmatore nella tabella PRODOTTO con il vincolo di integrità referenziale PRODOTTO.Programmatore -> PROGRAMMATORE.Codice. La relazione Richiesta è uno-amolti ed è tradotta mettendo l’attributo Cliente nella tabella ORDINE con il vincolo di integrità referenziale ORDINE.Cliente->CLIENTE.Codice. Infine la relazione Composizione è di tipo molti-a-molti ed è tradotta inserendo la tabella COMPOSIZIONE col riferimento alle chiavi delle entità coinvolte. I vincoli di integrità referenziale necessari sono COMPOSIZIONE.Prodotto->PRODOTTO.Codice e COMPOSIZIONE.Ordine->ORDINE.Codice. PRODOTTO(Codice,Nome,Prezzo,HW_SW,Tipo*,Scheda*,Requisiti*, Descrizione*,Programmatore*,Ordine*) PROGRAMMATORE(Codice,Nome,Indirizzo) CLIENTE(Codice,Nome,Indirizzo,PIVA) ORDINE(Codice,Data,Cliente) 2. Dato il seguente schema di base di dati relazionale SPEDIZIONI(Codice,Data,Mittente,Destinatario,costo) CLIENTI(Codice,Nome,Indirizzo,Città,PIVA) Con i vincoli di integrità SPEDIZIONI.Mittente→CLIENTI.Codice SPEDIZIONI.Destinatario→CLIENTI.Codice A. Quale delle seguenti istruzioni SQL rappresenta l’interrogazione “trovare per ogni coppia di città il numero di spedizioni effettuate dall’inizio del 2003” SELECT Mitt.Città AS Città1, Dest.Città AS Città2, count(*) AS Numero FROM SPEDIZIONI S, CLIENTI Mitt, CLIENTI Dest WHERE S.Mittente=Mitt.Codice AND S.Destinatario=Dest.Codice GROUP BY Mitt.Città, Dest.Città HAVING S.Data>=’01-01-2003’ SELECT Mitt.Città AS Città1, Dest.Città AS Città2, count(*) AS Numero FROM SPEDIZIONI S, CLIENTI Mitt, CLIENTI Dest WHERE S.Mittente=Mitt.Codice AND S.Destinatario=Dest.Codice AND S.Data>=’01-01-2003’ GROUP BY Mitt.Città ☞ SELECT Mitt.Città AS Città1, Dest.Città AS Città2, count(*) AS Numero FROM SPEDIZIONI S, CLIENTI Mitt, CLIENTI Dest WHERE S.Mittente=Mitt.Codice AND S.Destinatario=Dest.Codice AND S.Data>=’01-01-2003’ GROUP BY Mitt.Città, Dest.Città Nella clausola WHERE sono presenti le due condizioni di join necessarie a collegare SPEDIZIONI.Mittente con CLIENTI.Codice (S.Mittente=Mitt.Codice) e SPEDIZIONI.Destinatario con CLIENTI.Codice (S.Destinatario=Dest.Codice) in modo da collegare ogni spedizione alle informazioni relative al mittente e il destinatario (interessa in particolare la città in cui si trovano). Inoltre nella clausola WHERE si provvede a selezionare solo le spedizioni con una data compatibile col vincolo richiesto (S.Data>=’0101-2003’). Infine il raggruppamento è effettuato sui due attributi Mitt.Città e Dest.città perché è richiesto di contare il numero di spedizioni fatte per ogni coppia di città del mittente e del destinatario. SELECT Mitt.Città AS Città1, Dest.Città AS Città2, count(*) AS Numero FROM SPEDIZIONI S, CLIENTI Mitt, CLIENTI Dest WHERE S.Data>=’01-01-2003’ GROUP BY Mitt.Città, Dest.Città B. Quale delle seguenti istruzioni SQL rappresenta l’interrogazione “trovare i clienti che non hanno effettuato spedizioni nel 2002” SELECT Mitt.Nome FROM SPEDIZIONI S, CLIENTI Mitt WHERE Mitt.Codice=S.Mittente AND NOT EXISTS (SELECT Mittente FROM SPEDIZIONI WHERE YEAR(Data)=’2002’) SELECT Mitt.Nome FROM SPEDIZIONI S, CLIENTI Mitt WHERE Mitt.Codice=S.Mittente AND S.Mittente = ANY (SELECT Mittente FROM SPEDIZIONI WHERE YEAR(Data)<>’2002’) SELECT Mitt.Nome FROM SPEDIZIONI S, CLIENTI Mitt WHERE Mitt.Codice=S.Mittente AND S.Mittente IN ANY (SELECT Mittente FROM SPEDIZIONI WHERE YEAR(Data)>’2002’) ☞ SELECT Mitt.Nome FROM SPEDIZIONI S, CLIENTI Mitt WHERE Mitt.Codice=S.Mittente AND S.Mittente <> ALL (SELECT Mittente FROM SPEDIZIONI WHERE YEAR(Data)=’2002’) Si selezionanano i clienti che sono mittenti (join fra spedizioni e clienti sugli attributi SPEDIZIONE.Mittente e CLIENTE.Codice) e si prendono solo i mittenti che non sono fra quelli che hanno fatto una spedizione nel 2002. Infatti la query annidata produce i codici dei clienti che risultano mittenti di una spedizione del 2002 (condizione WHERE YEAR(Data)=’2002’). Nella query esterna si richiede che il codice del mittente sia diverso da tutti quelli selezionati in precedenza (ovvero non si trovi nell’insieme dei codici dei clienti che hanno fatto spedizioni nel 2002). 3. Data la seguente relazione ANALISI(Paziente,Medico,Data,Reparto,Indirizzo,Esenzione,TipoAnalisi,Ticket,Descrizione,Risultato) e le dipendenze funzionali Paziente→Indirizzo, Esenzione Medico→Reparto TipoAnalisi→Ticket, Descrizione Quale delle seguenti normalizzazioni produce relazioni in 3NF ed è senza perdita? PAZIENTE(Paziente,Indirizzo,Esenzione) TIPOANALISI(TipoAnalisi,Ticket,Descrizione) ANALISI(Paziente,Medico,Data,Reparto,TipoAnalisi,Risultato) ☞ PAZIENTE(Paziente,Indirizzo,Esenzione) MEDICO(Medico,Reparto) TIPOANALISI(TipoAnalisi,Ticket,Descrizione) ANALISI(Paziente,Medico,Data,TipoAnalisi,Risultato) Le prime tre relazioni sono la proiezione della relazione originaria sulle tre dipendenze funzionali e quindi sono in 3NF. La relazione ANALISI mantiene la chiave originaria e gli attributi (solo Risultato) che non è presente nelle altre relazioni. PAZIENTE(Paziente,Indirizzo) MEDICO(Medico,Reparto) TIPOANALISI(TipoAnalisi,Ticket,Descrizione,Risultato) ANALISI(Paziente,Medico,Data,TipoAnalisi,Esenzione) PAZIENTE(Paziente,Indirizzo,Esenzione) MEDICO(Medico,Reparto) ANALISI(Paziente,Medico,Data,TipoAnalisi,Descrizione,Ticket,Risultato)