Sei sulla pagina 1di 15

V

ive
re
In
ge
gn
er ia
V
ive
re
In
ge
gn
er ia
Esame di Basi di Dati
SOLUZIONE APPELLO 14/06/2011

1. Si effettui la progettazione concettuale della base di dati secondo la specifica che segue
fornendo un diagramma ER. Si vuole realizzare una base di dati che gestisca procedimenti

ia
sanzionatori nel contesto di rilevazioni statistiche ufficiali di carattere nazionale. Per alcune
rilevazioni statistiche ufficiali esiste, infatti, l’obbligo di risposta da parte dei soggetti contattati per la

er
conduzione delle rilevazioni. Qualora il soggetto contattato non risponda al questionario inviatogli,
dopo un prefissato intervallo di tempo, ha inizio un procedimento sanzionatorio che consta di due fasi
principali: invio della diffida al soggetto non rispondente e, qualora tale soggetto continui ad essere

gn
inadempiente (cioè non risponda al questionario), invio della sanzione che il soggetto stesso dovrà
pagare. I soggetti possono essere persone fisiche o imprese. Delle persone fisiche interessa
memorizzare il codice fiscale, delle imprese il codice fiscale o la partita iva in maniera alternativa.
Inoltre è di interesse l’indirizzo cui il soggetto è contattabile. Si noti che le imprese possono prevedere
ge
delle unità locali, ovvero l’impresa si articola secondo una struttura che consiste di un’impresa centrale
ed eventualmente di un insieme di imprese “periferiche”. Un procedimento viene avviato in relazione
alla non-risposta ad una specifica edizione di un’indagine. Ogni indagine è caratterizzata da un nome
In
(es. Forze di lavoro), da una frequenza con cui le sue edizioni occorrono (es. trimestrale) e dalle
specifiche edizioni che sono occorse ( es. primo trimestre 2011). Le edizioni, che hanno un codice
univoco nell’ambito dell’indagine in cui sono svolte, hanno una data di inizio ed una data di fine che
caratterizzano l’inizio e la fine della rilevazione sul campo dei dati oggetto dell’indagine. Nell’ambito
di un procedimento è prodotto un insieme di documenti che costituisce il fascicolo del procedimento.
re

Un fascicolo ha un codice che lo identifica nell’ambito del procedimento a cui è legato. I documenti,
che dispongono di un ID univoco nell’ambito del fascicolo in cui sono redatti, sono rappresentati da un
nome, un tipo, una data di produzione e dal path relativo al file cui sono associati. Del procedimento,
ive

oltre alle informazioni necessarie a desumere il suo avanzamento, interessa memorizzare la data di
inizio e, qualora sia stato archiviato, l’esito della archiviazione (ad esempio archiviato perché il
soggetto ha risposto) e la data di archiviazione.
V
1.1
V SCHEMA E-R

ive
re
In
ge
gn
er ia
2. Si effettui la prog. logica del diagramma ER realizzato con riferimento alla domanda 1. Si
motivino le scelte di progetto effettuate.

2.1 SCHEMA E-R RISTRUTTURATO

er ia
gn
ge
In
re
ive
V
2.2 SCHEMA RELAZIONALE

Procedimento(Codice,Soggetto,Edizione,Indagine,DataInizio)
foreign key : Procedimento(Soggetto) ⊆ Soggetto(Codice)
foreign key : Procedimento(Edizione,Indagine) ⊆ Edizione(Codice,Indagine)
inclusione : Procedimento(Codice) ⊆ Fascicolo(Procedimento)

ia
ProcedimentoNonArchiviato(Codice,Stato)
foreign key : ProcedimentoNonArchiviato (Codice) ⊆ Procedimento(Codice)
ProcedimentoArchiviato(Codice,Esito,DataArchiviazione)

er
foreign key : ProcedimentoArchiviato(Codice) ⊆ Procedimento(Codice)
Indagine(Codice,Nome,Frequenza)

gn
inclusione : Indagine(Codice) ⊆ Edizione(Indagine)
Edizione(Codice,Indagine,DataInizio,DataFine)
foreign key : Edizione(Indagine) ⊆ Indagine(Codice)
ge
Fascicolo(Codice,Procedimento)
inclusione : Fascicolo(Codice) ⊆ Documento(Fascicolo)
foreign key : Fascicolo(Procedimento) ⊆ Procedimento(Codice)
In
chiave : Procedimento
Documento(ID,Fascicolo,Data,Path,Nome,Formato)
foreign key : Documento(Fascicolo) ⊆ Fascicolo(Codice)
Soggetto(Codice,Indirizzo)
re

inclusione : Soggetto(Codice) ⊆ Procedimento(Soggetto)


Persona(Codice,CF)
ive

foreign key : Persona(Codice) ⊆ Soggetto(Codice)


foreign key : Persona(CF) ⊆ CF(Numero)
chiave : CF
ImpresaLocale(Codice,CodiceCentrale)
V

foreign key : Impresa(Codice) ⊆ Soggetto(Codice)


foreign key : Impresa(CodiceCentrale) ⊆ ImpresaCentrale(Codice)
ImpresaCentrale(Codice)
foreign key : Impresa(Codice) ⊆ Soggetto(Codice)
CF(Numero)
PIva(Numero)
ha(CF,Impresa)
foreign key : ha(CF) ⊆ CF(Numero)
foreign key : ha(Impresa) ⊆ Impresa(Codice)
chiavi : CF, Impresa
disponeDi(PIva,Impresa)
foreign key : disponeDi(PIva) ⊆ PIva(Numero)
foreign key : disponeDi (Impresa) ⊆ Impresa(Codice)
chiavi : PIva, Impresa
I vincoli di generalizzazione dello schema ristrutturato devono essere espressi in forma
insiemistica nello schema relazionale :
• ProcedimentoNonArchiviato [Codice] ∩ ProcedimentoNonArchiviato [Codice] = ∅
• Procedimento[Codice] ⊆
ProcedimentoNonArchiviato [Codice] ∪ ProcedimentoNonArchiviato [Codice]

• Persona [Codice] ∩ Impresa [Codice] = ∅

ia
• Soggetto [Codice] ⊆ Persona [Codice] ∪ Impresa [Codice]

er
Rimangono ovviamente validi i vincoli esterni espressi in fase di Progettazione Concettuale.

3. Dato il seguente schema:

gn
Delegato(IdDelegato, Nome, Cognome, Organizzazione)
Partecipa(IdDelegato, IdMeeting)
ge
Meeting(IdMeeting, Citta, Nazione, DataInizio, DataFine)

3.1 – Scrivere un’interrogazione SQL che restituisca Nome e Cognome dei delegati che hanno
In
partecipato solo a meeting non italiani.

SELECT Nome,Cognome
FROM Delegato
WHERE IdDelegato not in (SELECT IdDelegato
re

FROM Delegato, Partecipa,Meeting


WHERE (Delegato.IdDelegato=Partecipa.IdDelegato) AND
(Partecipa.IdMeeting=Meeting.IdMeeting) AND Nazione=”Italia”)
ive

AND IdDelegato in (SELECT IdDelegato


FROM Delegato, Partecipa,Meeting
WHERE (Delegato.IdDelegato=Partecipa.IdDelegato)
AND (Partecipa.IdMeeting=Meeting.IdMeeting) )
V

3.2 – Scrivere un’interrogazione SQL che restituisca, per ogni organizzazione, il numero totale
dei delegati che hanno partecipato a tutti i meeting.

SELECT Delegato.Organizzazione, count(*)


FROM Delegato, (SELECT IDDelegato
FROM Delegato
WHERE NOT EXISTS ((SELECT IdMeeting
FROM meeting)
EXCEPT
(SELECT IdMeeting
FROM Partecipa
WHERE Partecipa.IdDelegato =
Delegato.IdDelegato)) ) AS TEMP
WHERE TEMP.IdDelegato= Delegato.IdDelegato
GROUP BY Delegato.Organizzazione
Basi di dati – Prova 04-05-2005 – Soluzioni Query Algebra gruppo A

1) E’ dato il seguente schema di relazioni, che descrive un insieme di musei:


MUSEO(Codice,Nome,Via,Città,Direttore) MU
SALA(CodiceMuseo,NumSala, NumOpere, Superficie, NumPorte,Guardiano) SA
UMIDITA(CodiceMuseo,NumSala, Data, Ora,PercUmidità) UM
OPERA(CodiceO,NomeOpera,Autore,DataAcquisto,PerMaxUnidità,CodiceMuseo,NumSala) OP
PERSONALE(CF,Nome,DataAssunzione) PE
Le chiavi primarie sono in grassetto, le chiavi esterne sono in corsivo.
Il direttore di un museo e il guardiano di una sala sono entrambi parte del PERSONALE.
Si scrivano espressioni di algebra relazionale per le seguenti interrogazioni.:

ia
1a) Elencare CF e Nome del personale che lavora in un museo di Mantova.

π CF , Nome (PE|(ρ CF ← Direttore (π Direttoreσ Città ="Mantova" MU ) ∪ ρ CF ←Guardiano π Guardiano (SA|ρ CodiceMuseo←Museoσ Città ="Mantova" MU )))

ner
1b) Elencare il museo nel quale c’è la sala con percentuale di umidità minima.
eg R 0 = π PercUmiditàUM
R1 = ρ Perc← PercUmiditàπ PercUmiditàUM
MU | ( ρ Museo←CodiceMuseoπ CodiceMuseo (UM | (R0 − π PercUmiditàσ PercUmidità > Perc (R 0|R1))))
g
1c) Elencare i musei le cui sale ospitano tutte almeno 3 opere.
In
MU − MU | (ρ Museo←CodiceMuseoπ CodiceMuseo (σ NumOpere<3 SA))

1d) Elencare il personale che funge da guardiano per esattamente due sale.

R0 = (π CodiceMuseo, NumSala ,Guardiano SA) | (ρ Museo←CodiceMuseo , Sala ← NumSala (π CodiceMuseo , NumSala ,Guardiano SA))
re

R1 = ρ CF ←Guardianoπ Guardianoσ COdiceMuseo ≠ Museo∨ Sala ≠ NumSala R0


ive

R 2 = ρ CF ←Guardianoπ Guardianoσ F (R0 | (ρ Mu ←CodiceMuseo , Sa ← NumSala (π CodiceMuseo , NumSala ,Guardiano SA)))

con F = F1 ∨ F2 ∨ F3
V

F1 : Mu ≠ Museo ∧ Mu ≠ CodiceMuseo ∧ Museo ≠ CodiceMuseo

F2 : Sa ≠ Sala ∧ Sa ≠ NumSala ∧ NumSala ≠ Sala

F2 : sono i casi di due musei coincidenti con sale diverse e due sale coincidenti in musei diversi

PE | (R1 − R 2)
Basi di dati – Prova 04-05-2005 - Soluzioni Query Algebra gruppo B

1) E’ dato il seguente schema di relazioni, che descrive un insieme di musei:


MUSEO(Codice,Nome,Via,Città,Direttore) MU
SALA(CodiceMuseo,NumSala, NumOpere, Superficie, NumPorte,Guardiano) SA
UMIDITA(CodiceMuseo,NumSala, Data, Ora,PercUmidità) UM
OPERA(CodiceO,NomeOpera,Autore,DataAcquisto,PerMaxUnidità,CodiceMuseo,NumSala) OP
PERSONALE(CF,Nome,DataAssunzione) PE
Le chiavi primarie sono in grassetto, le chiavi esterne sono in corsivo.
Il direttore di un museo e il guardiano di una sala sono entrambi parte del PERSONALE.
Si scrivano espressioni di algebra relazionale per le seguenti interrogazioni.:

ia
1a) Elencare il nome e la data di acquisto delle opere collocate in sale senza guardiano.

π NomeOpera, DataAcquisto (OP | (π CodiceMuseo, NumSala (σ Guardiano SA)))

ner
isnull

1b) Elencare la sala del museo di Mantova nella quale è esposta l’opera acquistata più di recente.

R0 = π Dataacquisto (OP|ρ CodiceMuseo← Museoσ Città ="Mantova" MU )


eg
R1 = (R0 − π Dataacquistoσ Dataacquisto < Data (R 0|ρ Acq ← Dataacquisto R 0))

R 2 = π CodiceMuseo, Numsala (R1 | (OP|ρ CodiceMuseo← Museoσ Città ="Mantova" MU ))


g
SA | R 2
In

1c) Elencare i musei che hanno solo sale con percentuale di umidità inferiore a 50%

MU − MU | (ρ Museo←CodiceMuseoπ CodiceMuseo (σ PercUmidità >50 SA))


re

1d) Trovare i musei che hanno almeno due sale con la stessa superficie.

R0 = π CodiceMuseo , NumSala , Superficie (SA)


ive

MU | ρ Museo←CodiceMuseoπ CodiceMuseoσ Sa ≠ NumSala (R 0 | (ρ Sa ← NumSala R 0))


V
Prima prova di verifica del 4/11/2009
1. (Obbligatorio) Si considerino le relazioni R(A :string, B :string, C :int) e S(D :string, E :int):

R S

ia
A B C D E
a1 b1 10 b1 10
a1 b2 20 b2 40

ner
a2 b2 20 b3 30
a1 b3 30
a2 b3 30

Si diano (a) l’albero logico della seguente interrogazione, (b) il tipo del risultato e (c) il
eg
valore del risultato:

SELECT A, D, E
g
FROM R, S
WHERE B = D AND E < 40;
In
Albero logico

π b A,D,E
re

σ E<40
ive

⊲⊳
B=D

R S
V

Tipo risultato: {(A :string, D :string, E :int)}

A D E
a1 b1 10
a1 b3 30
a2 b3 30

Sia T il risultato della precedente interrogazione. Si diano (a) l’albero logico della seguente
interrogazione, (b) il tipo del risultato e (c) il valore del risultato:

1
SELECT D, SUM(E) AS SE
FROM T
GROUP BY D
HAVING COUNT(*) > 1;

ia
Albero logico

ner
π b D,SUM(E) AS SE

σ COUNT(∗)>1

eg D γ SUM(E),COUNT(∗)

T
g
Tipo risultato: {(D :string, SE :int)}
In

D SE
b3 60
re

2. Una società di formazione vuole utilizzare una base di dati per gestire le informazioni
riguardanti i corsi offerti, i partecipanti e i docenti.
Di un corso interessano il codice, che lo identifica, il titolo e la durata in ore. Dei corsi
ive

attivi interessano anche le date di inizio e fine, i giorni della settimana, l’aula e l’ora in cui
si tengono le lezioni.
Di un partecipante interessano il codice fiscale, che lo identifica, il nome, l’indirizzo di
V

residenza, il titolo di studio e gli argomenti di interesse. Un partecipante può essere un di-
pendente di un’azienda privata o pubblica, della quale interessano il nome, che la identifica,
il telefono e l’indirizzo. Dei dipendenti pubblici interessano il livello e la posizione ricoper-
ta. Dei partecipanti interessano i corsi attivi che frequentano e i corsi che hanno frequentato
presso la società di formazione, con il voto in decimi ottenuto e l’anno di frequenza.
(Opzionale) Di un docente interessano il codice fiscale, che lo identifica, il nome, l’indi-
rizzo di residenza, il titolo di studio, i corsi attivi che insegnano e i corsi della società di
formazione che possono insegnare. Un docente può essere un dipendente della società di
formazione o collaboratori esterni, e in questo caso interessano anche i recapiti telefonici.

(a) Si definisca lo schema concettuale della base di dati.

2
SeguitoDa
Voto
AnnoFrequenza

Persone
Corsi PuòEssereInsegnatoDa CF <<PK>> Azienda
Codice <<PK>> Nome Nome <<PK>>

ia
Titolo Residenza Telefono
Durata TitoloStudio Indirizzo

Impiega

ner
Corsi Attivi TenutoDa Partecipanti
DataInizio Docenti
DataFine ArgomentiDiInteresse :seq String

HaLezioni

Giorno
Aula
Ora
g Lezioni
eg Collaboratori
Esterni
RecapitiTelefonici :seq String
Dipendente Pubblico
Livello
PosizioneRicoperta

FrequentatoDa
In
Figura 1: Schema concettuale

(b) Si traduca lo schema concettuale in uno schema relazionale grafico, definendo gli
attributi delle chiavi primarie e delle chiavi esterne.
re
ive
V

3
SeguitoDa
FKCorso <<PK>>
<<FK(Corsi)>>
FKPartecipante <<PK>>
<<FK(Partecipanti)>>
Voto
Corsi
AnnoFrequenza
PkCorso <<PK>>
Codice <<PK1>>

ia
Titolo
Durata PuòEssereInsegnatoDA Persone
FKCorso <<PK>> PkPersona <<PK>>
<<FK(Corsi)>> CF <<PK1>>
FKDocente <<PK>> Nome Azienda
PkAzienda <<PK>>

ner
<<FK(Docenti)>> Residenza
TitoloStudio Nome <<PK1>>
Telefono
Indirizzo

CorsiAttivi InteressatoA
PkCorso <<PK>> Docenti Partecipanti FKPartecipante <<PK>>
<<FK(Corsi)>> PkPersona <<PK>> PkPersona <<PK>> <<FK(Corsi)>>
FKDocente <<FK(Docenti)>> <<FK(Persone)>> <<FK(Persone)>> FKArgomento <<PK>>
DataInizio
DataFine
g egCollaboratori
Esterni
PkPersona <<PK>>
<<FK(Docenti)>>
FKAzienda <<FK(Azienda)>>

Dipendente Pubblico
PkPersona <<PK>>

Livello
<<FK(Partecipanti)>>
<<FK(Argomenti)>>

Argomenti
IdArgomento <<PK>>
Argomento
Lezioni PosizioneRicoperta
PkCorso <<PK>>
<<FK(Corsi Attivi)>> RecapitiTelefonici
In
Giorno <<PK>> FKCollaboratore <<PK>>
Aula <<FK(CollaboratoriEsterni)>>
Ora Telefono <<PK>>

FrequentatoDa
FKCorso <<PK>>
<<FK(CorsiAttivi)>>
FKPartecipante <<PK>>
re

<<FK(Partecipanti)>>

Figura 2: Schema Logico


ive

3. Si consideri il seguente schema relazionale, che rappresenta un insieme di film, con i rispet-
tivi attori e case di produzione:
V

CaseProduzione(IdCasaProduzione, NomeCasa, Nazionalita)


Film(IdFilm, Titolo, AnnoProduzione, Lingua, IdCasaProduzione∗)
FilmAttori(IdFilm∗,IdAttore∗)
Attori(IdAttore, Nome, AnnoNascita, Sesso, Nazionalita)

(a) Si rappresenti graficamente lo schema relazionale della base di dati.


(b) Si scrivano le interrogazioni SQL che restituiscono le seguenti informazioni:
i. Per ogni film prodotto dopo il 1985, il titolo ed il nome della casa di produzione.
ii. Per ogni anno, l’anno ed il numero di film in lingua francese prodotti in quell’an-
no.

4
iii. Il nome della casa di produzione che ha fatto solo film non in lingua italiana.
iv. Il nome degli attori che hanno recitato solo in film in lingua italiana.
v. (Opzionale) Per ogni film che ha solo attori nati dopo il 1980, il titolo del film ed
il numero di attori di sesso femminile (F).

ia
Soluzioni:
i. Per ogni film prodotto dopo il 1985, il titolo ed il nome della casa di produzione.

ner
SELECT f.Titolo, c.NomeCasa
FROM Film f, CaseProduzione c
WHERE f.IdCasaProduzione = c.IdCasaProduzione
AND f.AnnoProduzione > 1985;

SELECT
g eg
ii. Per ogni anno, l’anno ed il numero di film in lingua francese prodotti in quell’an-
no.
f.AnnoProduzione, COUNT(*)
FROM Film f
WHERE f.Lingua = ’Francese’
In
GROUP BY f.AnnoProduzione;

iii. Il nome della casa di produzione che ha fatto solo film non in lingua italiana.
SELECT NomeCasa
FROM CaseProduzione c
re

WHERE FOR ALL f IN Film WHERE f.IdCasaProduzione = c.IdCasaProduzione


: NOT(f.Lingua = ’Italiano’);
ive

SELECT NomeCasa
FROM CaseProduzione c
WHERE NOT EXISTS
(SELECT *
V

FROM Film f
WHERE f.IdCasaProduzione = c.IdCasaProduzione
AND (f.Lingua = ’Italiano’));

iv. Il nome degli attori che hanno recitato solo in film in lingua italiana.
SELECT a.Nome
FROM Attori a
WHERE FOR ALL f IN Film, fa f IN FilmAttori
WHERE fa.IdAttore = a.IdAttore AND fa.IdFilm = f.IdFilm
: f.Lingua = ’Italiano’;

5
SELECT a.Nome
FROM Attori a
WHERE NOT EXISTS
(SELECT *
FROM FilmAttori fa, Film f
WHERE fa.IdAttore = a.IdAttore AND fa.IdFilm = f.IdFilm

ia
AND NOT (f.Lingua = ’Italiano’));

v. (Opzionale) Per ogni film che ha solo attori nati dopo il 1980, il titolo del film ed

ner
il numero di attori di sesso femminile (F).
SELECT f.Titolo, COUNT(*)
FROM Film f, FilmAttori fa1, Attori a1
WHERE fa1.IdAttore = a1.IdAttore AND f.IdFilm = fa1.IdFilm AND
g eg
(FOR ALL fa2 IN FilmAttori, a2 IN Attori
WHERE fa2.IdFilm = f.IdFilm AND fa2.IdAttore = a2.IdAttore
: a.AnnoNascita > 1980)
AND a1.Sesso = ’F’
GROUP BY f.IdFilm, f.Titolo;
In
SELECT f.Titolo, COUNT(*)
FROM Film f, FilmAttori fa1, Attori a1
WHERE fa1.IdAttore = a1.IdAttore AND f.IdFilm = fa1.IdFilm
NOT EXISTS
(SELECT *
re

FROM FilmAttori fa2, Attori a2


WHERE fa2.IdFilm = f.IdFilm AND fa2.IdAttore = a2.IdAttore
AND NOT (a.AnnoNascita > 1980))
AND a1.Sesso = ’F’
ive

GROUP BY f.IdFilm, f.Titolo;


V