BASE DI DATI - didawiki.cli.di.unipi.itdidawiki.cli.di.unipi.it/lib/exe/fetch.php/bdd-infuma/... ·...

26
BASE DI DATI Esercizio: Campionato corse Progettazione concettuale Progettazione logica Informatica Umanistica Università di Pisa

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’)

QUERY

11/12/2015 Progettazione: CampionatoCorse 23

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