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)