BASE DI DATI - didawiki.cli.di.unipi.itdidawiki.cli.di.unipi.it/lib/exe/fetch.php/bdd-infuma/... ·...
Transcript of BASE DI DATI - didawiki.cli.di.unipi.itdidawiki.cli.di.unipi.it/lib/exe/fetch.php/bdd-infuma/... ·...
BASE DI DATI
Esercizio: Campionato corse
• Progettazione concettuale
• Progettazione logica
Informatica Umanistica
Università di Pisa
Esercizio: campionato corseSi vuole costruire una base di dati che contenga le informazioni salienti sul campionato automobilistico dell’anno in corso: • I campionati sono caratterizzati sicuramente da un presidente e non necessariamente da un
vicepresidente. I campionati si distinguono in Formula 1 e Formula 3.• Dei campionati di Formula 1 bisogna specificare anche il bonus in denaro aggiuntivo per il
primo classificato.• le case automobilistiche possono partecipare (nell’anno in corso) ad un solo campionato.• le case automobilistiche sono caratterizzate dalla sigla (che è unica), dal nome, dalla
nazione, dal punteggio accumulato nella classifica costruttori.• Ad ogni casa automobilistica sono associati due piloti: il pilota primario e il pilota
secondario;• i piloti sono caratterizzati dal codice fiscale, dal nome, dalla nazione, dal punteggio
accumulato nella classifica piloti; • dei circuiti/gare del campionato occorre ricordare il luogo, la nazione, il nome della pista, la
data.• Per ogni gara bisogna tener conto dei piloti partecipanti e delle posizioni da questi
conseguite.
11/12/2015 Progettazione: CampionatoCorse 2
Schema concettuale
11/12/2015 Progettazione: CampionatoCorse 3
FormulaUno
BonusPrimoClassificato
Campionato
Presidente
Vicepresidente
FormulaTre
Piloti
CodiceFiscale
Nome
Cognome
nazione
PunteggioPilota
1..*1..*
PosizioneConseguita
Circuiti/Gare
Luogo
Nazione
NomePista
CasaAutomobilistica
CodiceScuderia
Sigla
Nome
nazione
PunteggioAccumulato
1..1
1..*Associato
1..*1..1 Concorrere
Completa/disgiunta
1..*
1..*
Partecipano
Si_svolge
PilotaPrimario PilotaSecondario
Completa/disgiunta
Ad un campionato deve partecipare almeno una casa automobilistica, mente una casa automobilistica può partecipare ad un solo campionato nell’anno in corso
Un campionato si svolge in almeno una gara/circuito, mentre una gara/circuito può far riferimento a più campionati (ad es. alla Formula 1 e alla Formula 3). La data è relativa alla gara che si disputa per il campionato.
Un pilota partecipa almeno ad una gara nel campionato in corso. Ad una gara deve partecipare almeno un pilota (o più piloti).
DataDellaCorsa
Alternativa:Doppia
associazione?
Progettazione logica
• I passo: traduzione iniziale delle classi non coinvolte in gerarchie
• II passo: traduzione iniziale delle gerarchie
• III passo: traduzione degli attributi multivalore
• IV passo: traduzione delle associazioni molti a molti
• V passo: traduzione delle associazioni uno a molti
• VI passo: traduzione delle associazioni uno a uno
• VII passo: introduzione di eventuali ulteriori vincoli
• VIII passo: progettazione degli schemi esterni
11/12/2015 Progettazione: CampionatoCorse 4
I passo: traduzione iniziale delle classi non coinvolte in gerarchie e chiavi primarie
11/12/2015 Progettazione: CampionatoCorse 5
CircuitiGare T
IdPista CHAR(16) PK
NomePista VARCHAR(15)
Nazione VARCHAR(16)
Luogo VARCHAR(16)
Circuiti/Gare
Luogo
Nazione
NomePista
CasaAutomobilistica
CodiceScuderia
Sigla
Nome
nazione
PunteggioAccumulato
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3)
nazione VARCHAR(16)
PunteggioAccumulato INTEGER
La sigla della casa poteva essere
usata come chiave primaria poiché
univoca.
II passo: traduzione iniziale delle gerarchie
11/12/2015 Progettazione: CampionatoCorse 6
Tre possibili strade:1. Tradurre solo il padre della gerarchia (accorpare i figli nel padre)2. tradurre solo i figli della gerarchia (accorpare il padre nei figli)3. tradurre il padre e i figli collegandoli con chiavi esterne
I Soluzione: Solo il padre.Non abbiamo associazioni che si riferiscono alle sotto-classi
FormulaUno
BonusPrimoClassificato
Campionato
Presidente
Vicepresidente
FormulaTre
1..*1..*
Circuiti/Gare
Luogo
Nazione
NomePista
CasaAutomobilistica
CodiceScuderia
Sigla
Nome
nazione
PunteggioAccumulato
1..*1..1
Concorrere
Completa/disgiunta
Si_svolge
DataDellaCorsa
II passo: traduzione iniziale delle gerarchie
11/12/2015 Progettazione: CampionatoCorse 7
I Soluzione: Solo il padre
Campionato T
IdCampionato CHAR(10) PK
Presidente VARCHAR(16)
VicePresident VARCHAR(16)
Tipo VARCHAR(10)
BonusPrimoClassificato INTEGERFormulaUno
BonusPrimoClassificato
Campionato
Presidente
Vicepresidente
FormulaTre
Completa/disgiunta
Il tipo di campionato (se Formula1 o Formula3) viene espressa dall’attributo “tipo”. L’attributo Bonus potrà avere valore nullo e ciò avviene quando si considera la Formula 3
II passo: traduzione iniziale delle gerarchie
11/12/2015 Progettazione: CampionatoCorse 8
Tre possibili strade:1. Tradurre solo il padre della gerarchia (accorpare i figli nel padre)2. tradurre solo i figli della gerarchia (accorpare il padre nei figli)3. tradurre il padre e i figli collegandoli con chiavi esterne
I Soluzione: Solo il padre.Non abbiamo associazioni che si riferiscono alle sotto-classi. I figli non hanno attributi.
Circuiti/Gare
Luogo
Nazione
NomePista
CasaAutomobilistica
CodiceScuderia
Sigla
Nome
nazione
PunteggioAccumulato
Piloti
CodiceFiscale
Nome
Cognome
nazione
PunteggioPilota
PilotaPrimario PilotaSecondario
Completa/disgiunta
II passo: traduzione iniziale delle gerarchie
11/12/2015 Progettazione: CampionatoCorse 9
I Soluzione: Solo il padre
Pilota T
CodiceFiscale CHAR(16) PK
Nome VARCHAR(16)
Congnome VARCHAR(16)
nazione VARCHAR(16)
PunteggioPilota INTEGER
RuoloPilota INTEGER
Piloti
CodiceFiscale
Nome
Cognome
nazione
PunteggioPilota
PilotaPrimario PilotaSecondario
Completa/disgiunta
Il ruolo del pilota (1 oppure 2) viene espressa dall’attributo “RuoloPilota”.
II passo: traduzione iniziale delle gerarchie
11/12/2015 Progettazione: CampionatoCorse 10
CircuitiGare T
IdPista CHAR(16) PK
NomePista VARCHAR(15)
Nazione VARCHAR(16)
Luogo VARCHAR(16)
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3)
nazione VARCHAR(16)
PunteggioAccumulato INTEGER
Campionato T
IdCampionato CHAR(10) PK
Presidente VARCHAR(16)
VicePresident VARCHAR(16)
Tipo VARCHAR(10)
BonusPrimoClassificato INTEGER
Pilota T
CodiceFiscale CHAR(16) PK
Nome VARCHAR(16)
Congnome VARCHAR(16)
nazione VARCHAR(16)
PunteggioPilota INTEGER
RuoloPilota INTEGER
III passo: traduzione degli attributi multivalore
11/12/2015 Progettazione: CampionatoCorse 11
Nulla da fare!!!
IV passo: traduzione delle associazioni molti a molti
11/12/2015 Progettazione: CampionatoCorse 12
Campionato
Presidente
Vicepresidente1..*1..*
Circuiti/Gare
Luogo
Nazione
NomePista
CircuitiGare T
IdPista CHAR(16) PK
NomePista VARCHAR(15)
Nazione VARCHAR(16)
Luogo VARCHAR(16)
Campionato T
IdCampionato CHAR(10) PK
Presidente VARCHAR(16)
VicePresident VARCHAR(16)
Tipo VARCHAR(10)
BonusPrimoClassificato INTEGER
GareCampionato T
IdPista CHAR(16) PK, FK
IdCampionato CHAR(10) PK, FK
DataDellaCorsa DATE
Si_svolge
DataDellaCorsa
IV passo: traduzione delle associazioni molti a molti
11/12/2015 Progettazione: CampionatoCorse 13
1..*1..*
Circuiti/Gare
Luogo
Nazione
NomePista
Piloti
CodiceFiscale
Nome
Cognome
nazione
PunteggioPilota
PosizioneConseguita
Partecipano
CircuitiGare T
IdPista CHAR(16) PK
NomePista VARCHAR(15)
Nazione VARCHAR(16)
Luogo VARCHAR(16)
Partecipazione T
IdPista CHAR(16) PK, FK
CodiceFiscale CHAR(16) PK, FK
PosizioneConseguite INTEGER
Pilota T
CodiceFiscale CHAR(16) PK
Nome VARCHAR(16)
Congnome VARCHAR(16)
nazione VARCHAR(16)
PunteggioPilota INTEGER
RuoloPilota INTEGER
V passo: traduzione delle associazioni uno a molti
11/12/2015 Progettazione: CampionatoCorse 14
Campionato
Presidente
Vicepresidente
CasaAutomobilistica
CodiceScuderia
Sigla
Nome
nazione
PunteggioAccumulato
1..*1..1
Concorrere
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3)
nazione VARCHAR(16)
PunteggioAccumulato INTEGER
IdCampionato CHAR(10) FK
Campionato T
IdCampionato CHAR(10) PK
Presidente VARCHAR(16)
VicePresident VARCHAR(16)
Tipo VARCHAR(10)
BonusPrimoClassificato INTEGER
V passo: traduzione delle associazioni uno a molti
11/12/2015 Progettazione: CampionatoCorse 15
Piloti
CodiceFiscale
Nome
Cognome
nazione
PunteggioPilota
CasaAutomobilistica
CodiceScuderia
Sigla
Nome
nazione
PunteggioAccumulato
1..1
1..*
Associato
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3)
nazione VARCHAR(16)
PunteggioAccumulato INTEGER
Pilota T
CodiceFiscale CHAR(16) PK
Nome VARCHAR(16)
Congnome VARCHAR(16)
nazione VARCHAR(16)
PunteggioPilota INTEGER
RuoloPilota INTEGER
CodiceScuderia CHAR(3) FK
VII passo: introduzione di eventuali ulteriori vincoli: NOT NULL e UNIQUE
11/12/2015 Progettazione: CampionatoCorse 16
Pilota T
CodiceFiscale CHAR(16) PK
Nome VARCHAR(16) NOT NULL
Cognome VARCHAR(16) NOT NULL
nazione VARCHAR(16) NOT NULL
PunteggioPilota INTEGER NOT NULL
RuoloPilota INTEGER NOT NULL
CodiceScuderia CHAR(3) NOT NULL FK
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3) NOT NULL UNIQUE
nazione VARCHAR(16) NOT NULL
PunteggioAccumulato INTEGER NOT NULL
IdCampionato CHAR(10) NOT NULL FK
Campionato T
IdCampionato CHAR(10) PK
Presidente VARCHAR(16) NOT NULL
VicePresident VARCHAR(16)
Tipo VARCHAR(10) NOT NULL
BonusPrimoClassificato INTEGER
CircuitiGare T
IdPista CHAR(16) PK
NomePista VARCHAR(15) NOT NULL
Nazione VARCHAR(16) NOT NULL
Luogo VARCHAR(16) NOT NULL
Partecipazione T
IdPista CHAR(16) PK, FK
CodiceFiscale CHAR(16) PK, FK
PosizioneConseguite INTEGER NOT NULL
GareCampionato T
IdPista CHAR(16) PK, FK
IdCampionato CHAR(10) PK, FK
DataDellaCorsa DATE NOT NULL
BonusPrimoClassificatoE VicePresidente possono assumere valore NULLO
VII passo: introduzione di eventuali ulteriori vincoli: CHECK
11/12/2015 Progettazione: CampionatoCorse 17
Campionato T
IdCampionato CHAR(10) PK
Presidente VARCHAR(16) NOT NULL
VicePresident VARCHAR(16)
Tipo VARCHAR(10) NOT NULL
BonusPrimoClassificato INTEGER
CHECK (BonusPrimoClassificato
IS NULL OR Tipo = ‘FormulaUno’)
Schema concettuale
11/12/2015 Progettazione: CampionatoCorse 24
Pilota T
CodiceFiscale CHAR(16) PK
Nome VARCHAR(16) NOT NULL
Cognome VARCHAR(16) NOT NULL
nazione VARCHAR(16) NOT NULL
PunteggioPilota INTEGER NOT NULL
RuoloPilota INTEGER NOT NULL
CodiceScuderia CHAR(3) NOT NULL FK
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3) NOT NULL UNIQUE
nazione VARCHAR(16) NOT NULL
PunteggioAccumulato INTEGER NOT NULL
IdCampionato CHAR(10) NOT NULL FK
Campionato T
IdCampionato CHAR(10) PK
Presidente VARCHAR(16) NOT NULL
VicePresident VARCHAR(16)
Tipo VARCHAR(10) NOT NULL
BonusPrimoClassificato INTEGERCircuitiGare T
IdPista CHAR(16) PK
NomePista VARCHAR(15) NOT NULL
Nazione VARCHAR(16) NOT NULL
Luogo VARCHAR(16) NOT NULL
Partecipazione T
IdPista CHAR(16) PK, FK
CodiceFiscale CHAR(16) PK, FK
PosizioneConseguite INTEGER NOT NULL
GareCampionato T
IdPista CHAR(16) PK, FK
IdCampionato CHAR(10) PK, FK
DataDellaCorsa DATE NOT NULL
Interrogazione 1
• Elenco che riporta, per ciascun pilota, il numero di corse in cui si è piazzato sul podio. Visualizzare anche nome, cognome, nazione.
Select PI.nome, PI.cognome, PI.nazione, PI.codiceFiscale, count(*)
From Partecipazione AS PA JOIN Pilota AS PI ON
PA.codiceFiscale=PI.codiceFiscale
Where PA.partecipazioneConseguite = 1 OR
PA.partecipazioneConseguite = 2 OR
PA.partecipazioneConseguite = 3
Group by PI.codiceFiscale, PI.nome, PI.cognome, PI.nazione
11/12/2015 Progettazione: CampionatoCorse 25
Partecipazione T
IdPista CHAR(16) PK, FK
CodiceFiscale CHAR(16) PK, FK
PosizioneConseguite INTEGER NOT NULL
Pilota
CodiceFiscale CHAR(16)
Nome VARCHAR(16) NOT NULL
Cognome VARCHAR(16) NOT NULL
nazione VARCHAR(16) NOT NULL
PunteggioPilota INTEGER NOT NULL
RuoloPilota INTEGER NOT NULL
CodiceScuderia CHAR(3) NOT NULL
Interrogazione 2
• Scrivere una vista che riporta, per ciascuna casa automobilistica, il numero di corse vinte (ovvero in cui uno dei piloti è arrivato primo). Riportare solo quelle che hanno vinto almeno 10 gare.
Create view VistaNum (CasaAuto, numeroVincite)
Select CA.Sigla, count(*)
From CasaAutomobilistica AS CA JOIN Pilota AS PI
ON CA.codiceScuderia=PI.codiceScuderia
JOIN Partecipazione AS PA
ON PA.codiceFiscale=PI.codiceFiscale
Where PA.posizioneConseguite = 1
Group by CA.Sigla
Having count(*) >= 10
11/12/2015 Progettazione: CampionatoCorse 26
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3)
nazione VARCHAR(16)
PunteggioAccumulato INTEGER
IdCampionato CHAR(10) FK
Partecipazione T
IdPista CHAR(16) PK, FK
CodiceFiscale CHAR(16) PK, FK
PosizioneConseguite INTEGER NOT NULL
Pilota
CodiceFiscale CHAR(16)
Nome VARCHAR(16) NOT NULL
Cognome VARCHAR(16) NOT NULL
nazione VARCHAR(16) NOT NULL
PunteggioPilota INTEGER NOT NULL
RuoloPilota INTEGER NOT NULL
CodiceScuderia CHAR(3) NOT NULL
Interrogazione 3
• Elenco che riporta, per ciascun pilota, il miglior piazzamento nelle corse svolte nella nazione in cui è nato. Visualizzare anche il nome e il cognome del pilota.
Select P.CodiceFiscale, P.cognome, P.nome, P.nazione,
min(P.PosizioneConseguita)
From Piloti AS P, CircuitiGare AS CG, Partecipazione PA
Where P.codiceFiscale=PA.codiceFiscale AND PA.IdPista=CG.idPista
AND P.nazione = CG.nazione
GROUP BY P.CodiceFiscale, P.cognome, P.nome, P.nazione
11/12/2015 Progettazione: CampionatoCorse 27
Partecipazione T
IdPista CHAR(16) PK, FK
CodiceFiscale CHAR(16) PK, FK
PosizioneConseguite INTEGER NOT NULL
CircuitiGare T
IdPista CHAR(16) PK
NomePista VARCHAR(15) NOT NULL
Nazione VARCHAR(16) NOT NULL
Luogo VARCHAR(16) NOT NULL
Pilota
CodiceFiscale CHAR(16)
Nome VARCHAR(16) NOT NULL
Cognome VARCHAR(16) NOT NULL
nazione VARCHAR(16) NOT NULL
PunteggioPilota INTEGER NOT NULL
RuoloPilota INTEGER NOT NULL
CodiceScuderia CHAR(3) NOT NULL
Interrogazione 4
• Elenco che riporta il pilota (nome, cognome) il cui punteggio è maggiore della media dei punteggi di tutti i piloti.
Select P1.cognome, P1.nome
From Piloti AS P1
Where P1.PunteggioPilota > (
select avg(P2.PunteggioPilota)
from Piloti AS P2)
11/12/2015 Progettazione: CampionatoCorse 28
Partecipazione T
IdPista CHAR(16) PK, FK
CodiceFiscale CHAR(16) PK, FK
PosizioneConseguite INTEGER NOT NULL
Pilota
CodiceFiscale CHAR(16)
Nome VARCHAR(16) NOT NULL
Cognome VARCHAR(16) NOT NULL
nazione VARCHAR(16) NOT NULL
PunteggioPilota INTEGER NOT NULL
RuoloPilota INTEGER NOT NULL
CodiceScuderia CHAR(3) NOT NULL
Interrogazione 5
• Elenco che riporta la casa automobilistica (Sigla, nazione) prima in classifica.
Select CA.Sigla, nazione
From CasaAutomobilistica AS CA
Where CA.punteggioAccumulato =
(Select max(Casa.punteggioAccumulato)
From CasaAutomobilistica AS Casa)
11/12/2015 Progettazione: CampionatoCorse 29
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3)
nazione VARCHAR(16)
PunteggioAccumulato INTEGER
IdCampionato CHAR(10) FK
Interrogazione 6
• Elenco che riporta il pilota (nome, cognome) il cui punteggio è maggiore dei punteggi accumulati da tutti i piloti della scuderia Ferrari (sigla SF) (usare select annidate)
Select P1.cognome, P1.nome
From Piloti AS P1
Where P1.PunteggioPilota > ALL (
select P2.PunteggioPilota
from Piloti AS P2
where sigla = ‘SF’)
11/12/2015 Progettazione: CampionatoCorse 30
Nota che ci sono più piloti, quindi
più punteggi, relativi alla Ferrari
Pilota
CodiceFiscale CHAR(16)
Nome VARCHAR(16) NOT NULL
Cognome VARCHAR(16) NOT NULL
nazione VARCHAR(16) NOT NULL
PunteggioPilota INTEGER NOT NULL
RuoloPilota INTEGER NOT NULL
CodiceScuderia CHAR(3) NOT NULL
Interrogazione 7
• Elenco che riporta le gare (Nome pista e Nazione) che sono situati in nazioni che cui non ci sono case automobilistiche che corrono “in casa”, ma ci sono piloti che corrono “in casa”. Ad esempio: il circuito di Singapore verrebbe visualizzato poiché non esistono case automobilistiche di Singapore, ma vi sono piloti la cui nazione è Singapore (usare selectannidate)
Select nomePisa, nazione
From CircuitiGare
Where nazione NOT IN (Select nazione from CasaAutomobilistica)
AND nazione IN (Select nazione from Pilota)
11/12/2015 Progettazione: CampionatoCorse 31
CasaAutomobilistica T
codiceScuderia CHAR(3) PK
Sigla VARCHAR(3)
nazione VARCHAR(16)
PunteggioAccumulato INTEGER
IdCampionato CHAR(10) FK
CircuitiGare T
IdPista CHAR(16) PK
NomePista VARCHAR(15) NOT NULL
Nazione VARCHAR(16) NOT NULL
Luogo VARCHAR(16) NOT NULL
Pilota
CodiceFiscale CHAR(16)
Nome VARCHAR(16) NOT NULL
Cognome VARCHAR(16) NOT NULL
nazione VARCHAR(16) NOT NULL
PunteggioPilota INTEGER NOT NULL
RuoloPilota INTEGER NOT NULL
CodiceScuderia CHAR(3) NOT NULL