Sei sulla pagina 1di 5

Corso di Tecnologie Digitali [1] A.A.

2019-2020
Proff. Cappiello, Plebani, Salnitri, Vitali

POLITECNICO DI MILANO Esame 28 Agosto 2020


INGEGNERIA GESTIONALE

Concettuale

1. Vi è stata commissionata la progettazione della base di dati delle spiagge di una nota località
balneare. Di ogni spiaggia, caratterizzata dal nome, si conoscono il numero di telefono e
l'indirizzo, composto da via e numero civico. Le spiagge possono essere pubbliche o private:
delle spiagge pubbliche si conosce la superficie in metri quadrati, mentre delle spiagge
private si conosce il numero di slot con ombrellone assegnabili. Per poter accedere alle
spiagge private è necessaria una prenotazione. Le prenotazioni sono giornaliere e per
ognuna di esse bisogna tenere traccia del cliente che la effettua, della data e della spiaggia
ipotizzando che lo stesso cliente può prenotare più spiagge lo stesso giorno. Del cliente sono
inoltre richiesti nome, cognome e telefono (ma non il codice fiscale).

Superficie
NumSlot
PUBBLICA PRIVATA
(t,e) (1,1) (1,1) (1,n)
Presso Effettua
(1,n)
ID
Data
Nome
Telefono SPIAGGIA
Nome
Indirizzo PRENOTAZIONE CLIENTE Cognome
Telefono
Via NumeroCivico

2. Estendere il modello creato al passo precedente includendo le seguenti specifiche. Si


vogliono memorizzare i bagnini che lavorano sulle diverse spiagge. Dei bagnini si conoscono
codice fiscale, nome, cognome, telefono e tutte le date di rinnovo del brevetto da bagnino,
compresa quella del primo conseguimento. Ogni bagnino può lavorare in diverse spiagge e
ogni spiaggia deve averne almeno uno. Infine, si vogliono memorizzare le attività disponibili
in ogni spiaggia. Ogni attività è caratterizzata dal nome, univoco per la spiaggia in cui viene
erogata, il numero minimo e il numero massimo di partecipanti. Le attività sono di due tipi,
gratuite o a pagamento. Le attività a pagamento richiedono di memorizzare il prezzo per
persona.
Superficie
NumSlot
PUBBLICA PRIVATA
(t,e) (1,1) (1,1) (1,n)
Presso Effettua
(1,n)
Data ID
Nome Telefono
SPIAGGIA
Indirizzo (0,n) Nome
NumeroCivico (1,n) PRENOTAZIONE CLIENTE Cognome
Via Telefono

Lavora Eroga
(1,1) Nome

(1,n)
CF Nome MinPartecipanti
BAGNINO Cognome ATTIVITA’ MaxPartecipanti
DataRinnovoBrevetto
(1,n) Telefono

(t,e)
PrezzoPersona

GRATIS PAGAMENTO
Logico

Dato lo schema E-R in figura, definire il modello logico usando il modello relazionale e specificando
chiavi e vincoli di integrità referenziale.

Superficie
NumSlot
PUBBLICA PRIVATA
(t,e) (1,1) (1,1) (1,n)
Presso Effettua
(1,n)
Data ID
Nome Telefono
SPIAGGIA
Indirizzo (0,n) Nome
NumeroCivico (1,n) PRENOTAZIONE CLIENTE Cognome
Via Telefono

Lavora Eroga
(1,1) Nome

(1,n)
CF Nome MinPartecipanti
BAGNINO Cognome ATTIVITA’ MaxPartecipanti
DataRinnovoBrevetto
(1,n) Telefono

(t,e)
PrezzoPersona

GRATIS PAGAMENTO

Spiaggia(Nome, Telefono, NumeroCivico, Via, Tipo, Superficie*, NumSlot*)


Prenotazione(NomeSpiaggia, IDCliente, Data)
Cliente(ID, Nome, Cognome, Telefono)
Bagnino(CF, Nome, Cognome, Telefono)
DataRinnovoBrevetto(CFBagnino, Data)
Attivita(NomeSpiaggia, Nome, MinPartecipanti, MaxPartecipanti, PrezzoPersona*)
Lavora(NomePiscina, CFBagnino)

Lavora.NomePiscina -> Piscina.Nome


Lavora.CFBagnino -> Bagnino.CF
Attivita.NomeSpiaggia -> Spiaggia.Nome
Prenotazione. NomeSpiaggia -> Spiaggia.Nome
Prenotazione.IDCliente -> Cliente.ID
DataRinnovoBrevetto.CFBagnino -> Bagnino.CF
SQL

Si consideri il seguente schema di base di dati relativo ad albergo.

Camera (Numero(K), PrezzoPerNotte, Letti)


Prenotazione (Codice(k), NumeroCamera, CFCliente, DataArrivo, NumeroNotti)
Cliente (CF(k), Nome, Cognome, Indirizzo, Città, Nazione)

Prenotazione.NumeroCamera -> Camera.Numero


Prentoazione.CFCliente -> Cliente.CF

(K) Indica gli attributi che compongono la chiave primaria di una relazione.

1) Trovare le camere da due letti che, a partire da giugno 2020, sono state prenotate almeno una
volta da un cliente straniero, ma non sono mai state prenotate per più di un giorno (per singola
prenotazione).

SELECT *
FROM Camera AS C
WHERE C.Letti = 2 AND Numero IN (
SELECT P.NumeroCamera
FROM Prenotazione AS P JOIN Cliente AS C ON P.CFCliente = C.CF
WHERE P.DataArrivo >= 1/6/2020 AND C.Nazione != “Italia”)
AND Numero NOT IN (
SELECT NumeroCamera
FROM Prenotazione
WHERE DataArrivo >= 1/6/2020 AND NumeroNotti > 1
)

2) Trovare tutti i clienti che, a partire dal 2019, hanno effettuato prenotazioni per un costo totale
di almeno 2000€ o che si sono fermati nell’hotel per almeno 60 giorni.

SELECT *
FROM Cliente
WHERE CF IN (SELECT P.CFCliente
FROM Prenotazione AS P JOIN Camera AS C ON P.NumeroCamera = C.Numero
WHERE P.DataArrivo >= 1/1/2019
GROUP BY P.CFCliente
HAVING SUM (P.NumeroNotti * C.PrezzoPerNotte) >= 2000 OR SUM (P.NumeroNotti) >=
60)

3) Trovare, per ogni camera, il cliente straniero che vi ha soggiornato più a lungo (anche in periodi
diversi).

CREATE VIEW ClientiCamera(NumeroCamera, CFCliente, TotaleNotti) AS


SELECT P.NumeroCamera, P.CFCliente, SUM(P.NumeroNotti)
FROM Prenotazione AS P JOIN Cliente AS C ON P.CFCliente = C.CF
WHERE C.Nazione != “Italia”
GROUP BY P.NumeroCamera, P.CFCliente

SELECT *
FROM ClientiCamera AS V1
WHERE V1.TotaleNotti = (
SELECT MAX(V2.TotaleNotti)
FROM ClientiCamera AS V2
WHERE V1.NumeroCamera = V2.NumeroCamera
)