Sei sulla pagina 1di 3

Corso di Tecnologie Digitali [1] A.A.

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

POLITECNICO DI MILANO Esame 28 Gennaio 2021


INGEGNERIA GESTIONALE

Concettuale

1. Prima di dare il via all’imponente campagna vaccinale in corso, vi è stata commissionata la digitalizzazione
dell’intera base di dati relativa alle vaccinazioni della popolazione italiana, con lo scopo di riportare
queste e altre informazioni sanitarie di ogni cittadino in un proprio fascicolo sanitario elettronico.
Ogni persona è caratterizzata dal nome, cognome, data di nascita e codice fiscale. Ogni farmaco vaccinale
è identificato dal nome commerciale e caratterizzato dal nome del principio attivo oltre che dalla casa
produttrice di cui sono noti la denominazione, il nome del supervisore sanitario e un contatto telefonico.
Ogni casa produttrice può essere associata a più farmaci. Ogni persona può ricevere più dosi dello stesso
vaccino; per ogni somministrazione viene memorizzata la data e la sede dell’inoculazione (es. braccio
sinistro, braccio destro, …). Si tenga conto che in una specifica data si può somministrare solo una dose
di vaccino.

2. Estendere il progetto concettuale come segue. Si vuole inoltre tener traccia del personale sanitario che
somministra i vaccini: durante ogni vaccinazione sono presenti due infermieri e un medico. Oltre a
quanto già specificato per le persone, occorre memorizzare il numero di badge per gli infermieri e il
numero di iscrizione all’ordine per i medici. È inoltre nota l’obbligatorietà o meno di ogni vaccinazione
effettuata. Per effettuare le vaccinazioni sono stati adibiti diversi centri caratterizzati da nome, tipologia
(es. ospedale, ambulatorio, clinica, …), recapito telefonico e possibilmente la posizione (indirizzo, civico
e CAP). Per ogni centro si deve poter risalire alle somministrazioni che ha effettuato.
Logico

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

Codice Indirizzo Città


CF

Nome
Sede (1,n) Frequenta (1,n) Socio
Cognome
(1,n) (0,n)
Indirizzo

Possiede Richiede

Condizioni Numero

(1,1) (1,1)
DataConsegna

Copia (0,n) Riguarda (1,n) Prestito

(1,1) Data
restituzione
Numero

Di

Titolo
ISBN
(1,n)
Autore

Libro Editore

Pagine Genere Durata


(t,e)

Cartaceo Audiolibro

Sede (Codice, Indirizzo, Città)


Socio (CF, Nome, Cognome, Indirizzo)
Libro (ISBN, Titolo, Editore, Genere, Tipo, Pagine, Durata)
Autore_Libro (Autore, ISBN)
Copia (ISBN, Numero, Condizioni, CodiceSede)
Prestito (CFSocio, Numero, DataConsegna)
Frequenta (CFSocio, CodiceSede)
Riguarda (CFSocio, NumeroPrestito, NumeroCopia, ISBNCopia, DataRestituzione)

Autore_Libro.ISBN à Libro.ISBN
Copia.ISBN à Libro.ISBN
Copia.CodiceSede à Sede.Codice
Prestito.CFSocio à Socio.CF
Frequenta.CFSocio à Socio.CF
Frequenta.CodiceSede à Sede.Codice
Riguarda.(CFSocio, NumeroPrestito) à Prestito.(CFSocio, Numero)
Riguarda.(NumeroCopia, ISBNCopia) à Copia.(Numero, ISBN)
SQL

Si consideri il seguente schema di base di dati che vuole tenere traccia delle spese effettuate tramite carta
di credito presso diversi istituti bancari.

Persona(CF(K), Nome, Cognome, DataNascita)


Carta(Codice(K), Banca, Possessore)
Acquisto(CodiceCarta(K), Data(K), Importo, Esercente)

Carta.Possessore -> Persona.CF


Acquisto.CodiceCarta -> Carta.Codice

(K) Indica la chiave primaria.


Si assuma che l'importo è espresso in euro e che ogni persona può avere più carte, anche legate alla stessa
banca.

a) Trovare tutti gli acquisti fatti nel 2020 da carte legate alle banche BPM o Polibank

SELECT *
FROM Acquisto AS a
WHERE a.Data BETWEEN 01/01/2020 AND 31/12/2020
AND a.CodiceCarta IN (
SELECT c.Codice
FROM Carta AS c
WHERE c.Banca = "PoliBank" OR c.Banca = "BPM"

b) Trovare tutte le Carte della banca "PoliBank" che nel 2021 hanno effettuato al massimo 10 acquisti
per un importo totale di almeno 500€.

SELECT c.Codice
FROM Carta AS c JOIN Acquisto AS a ON c.Codice = a.CodiceCarta
WHERE a.Data >= 01/01/2021 AND c.Banca = "PoliBank"
GROUP BY a.CodiceCarta
HAVING COUNT(*) <= 10 AND SUM(a.Importo) >= 500;

c) Trovare, per ogni persona, la banca con la quale ha effettuato la maggior parte delle sue spese e
l’importo relativo

CREATE VIEW TotaleBanca(CFPersona, Banca, Totale) AS


SELECT c.Possessore, c.Banca, SUM(a.Importo)
FROM Carta AS c JOIN Acquisto AS a ON c.Codice = a.CodiceCarta
GROUP BY c.Possessore, c.Banca;

SELECT *
FROM TotaleBanca AS t1
WHERE t1.Totale = (
SELECT MAX(t2.Totale)
FROM TotaleBanca AS t2
WHERE t1.CFPersona = t2.CFPersona);