UNIVERSITÀ DEGLI STUDI DI UDINE Facoltà di Medicina e Chirurgia CORSO DI LAUREA IN TECNICHE DI RADIOLOGIA MEDICA PER IMMAGINI E RADIOTERAPIA ESAME di INFORMATICA e ARCHIVIAZIONE 22 giugno 2011 1 Progettazione di basi di dati Si vuole progettare il sistema informativo per la gestione delle informazioni relative agli interventi eseguiti dalla centrale operativa del 118. In particolare, si vuole mantener traccia delle informazioni relative ai mezzi a disposizione. Di essi si vuole tener traccia del tipo (automedica, ambulanza, elicottero...), matricola, targa (per automediche e ambulanze), data ultima revisione, numero passeggeri. Per ognuno di essi si vuole tener traccia dei dipendenti che possono guidarli. Per ognuno dei dipendenti si tiene traccia di nome, cognome, indirizzo di residenza (via, numero, comune) e uno o più numeri di telefono. I dipendenti possono essere autisti, medici o infermieri: per gli autisti si vuole tener traccia delle patenti possedute e per i medici della specializzazione conseguita. L obiettivo principale del sistema è memorizzare le informazioni relative agli interventi effettuati. Per ognuno si vuole memorizzare la data, l ora e il luogo dell intervento, i mezzi utilizzati con il conducente, i medici e gli infermieri intervenuti, la causa dell intervento (incidente automobilistico, incendio,...), il numero di persone coinvolte, la descrizione dell intervento e il relativo esito. Progettazione concettuale Definire uno schema Entità-Relazioni che descriva il contenuto informativo del sistema, illustrando con chiarezza le eventuali assunzioni fatte. Lo schema dovrà essere completato con attributi ragionevoli per ciascuna entità (indicando i possibili identificatori) e relazione. Vanno specificati accuratamente i vincoli di cardinalità e partecipazione di ciascuna relazione. 1
Figura 1: Schema ER NOTE: si suppone che non possano verificarsi più incidenti nello stesso luogo, alla stessa data e ora (il luogo è abbastanza dettagliato per permettere questo); si suppone che la matricola possa essere un identificativo del mezzo, univoco per qualsiasi tipo di mezzo; nel momento in cui viene richiesto un intervento, e quindi registrato, il numero di persone, la descrizione e l esito dell intervento non possono essere note per cui si sono introdotti degli attributi opzionali; la relazione ternaria IntervieneMezzo permette di memorizzare per ogni mezzo uscito in un intervento il relativo autista. Se si volesse sapere anche per ogni medico e per ogni infermiere su quale mezzo sono usciti in ogni intervento bisognerebbe aggiungere un appostita entità USCI- TA alla quale collegare con apposite tre relazioni mezzi e autista (1), medico (2) e infermiere (3). Progettazione logica Apportare le necessarie modifiche di ristrutturazione allo schema Entità-Relazioni prodotto e tradurlo nello schema logico relazionale. Ristrutturazione: 1. attributi composti: attributo indirizzo dell entità DIPENDENTE; 2. attributi multivalore: attributo telefono dell entità DIPENDENTE (si è presupposto che un numero sia associato unicamente ad un dipendente), attributo patente dell entità AUTISTA; 2
3. specializzazione dipendente: supponendo che il 118 acceda ai dati dei dipendenti raggruppati per tipo (serve un autista cerco un autista, serve un medico cerco un medico...) si è optato per eliminare l entità padre della specializzazione e mantenere le figlie. Si osservi che se la specializzazione fosse sovrapposta, ad esempio un medico potesse essere anche autista, tale ristrutturazione introdurrebbe ridondanza; 4. specializzazione mezzo: visto che esiste un unica proprietà propria dei mezzi targati che caratterizza comunque molti dei tipi di mezzi, acceduti indipendentemente dal fatto che siano targati o meno, si è deciso di mantenere solo il padre della specializzazione. Lo schema ER ristrutturato è rappresentato in Figura 2. Traduzione: 1. entità: Figura 2: Schema ER ristrutturato M EDICO(codiceF iscale, nome, cognome, comune, via, numero, specializzazione) nome, cognome, comune, via, numero, specializzazione NOT NULL IN F ERM IERE(codiceF iscale, nome, cognome, comune, via, numero) nome, cognome, comune, via, numero NOT NULL AU T IST A(codiceF iscale, nome, cognome, comune, via, numero) nome, cognome, comune, via, numero NOT NULL M EZZO(matricola, tipo, posti, datarevisione, targa) tipo, posti, datarevisione NOT NULL 3
IN T ERV EN T O(data, ora, luogo, numerop ersone, descrizione, esito) P AT ENT E(tipo) T ELEF ON O(numero) 2. relazioni UNO-A-MOLTI (estensione delle tabelle precedenti): relazione hai, ham e haa: T ELEF ON O(numero, inf ermiere, medico, autista) fk (infermiere) references INFERMIERE(codiceFiscale) fk (medico) references MEDICO(codiceFiscale) check(infermiere IS NOT NULL or (medico IS NULL and autista IS NULL)) check(medico IS NOT NULL or (infermiere IS NULL and autista IS NULL)) check(autista IS NOT NULL or (medico IS NULL or infermiere IS NULL)) 3. relazioni MOLTI-A-MOLTI (nuove tabelle): relazione possiede: P OSSIEDE(autista, patente) fk (patente) references PATENTE(tipo) relazione puoguidare: P U OGU IDARE(autista, mezzo) fk (mezzo) references MEZZO(matricola) relazione intervienemezzo 1 : INT ERV IENEMEZZO(autista, mezzo, data, ora, luogo) fk (mezzo) references MEZZO(matricola) fk (data,ora,luogo) references INTERVENTO(data,ora,luogo) relazione intervienem: INT ERV IENEM(medico, data, ora, luogo) fk (medico) references MEDICO(codiceFiscale) 1 Visto che in un certo intervento ogni mezzo ha un solo autista, la chiave primaria può essere definita esclusivamente sugli attributi che identificano le due entità mezzo e intervento. Nel caso generale bisognerebbe introdurre anche l attributo che identifica l autista. 4
fk (data,ora,luogo) references INTERVENTO(data,ora,luogo) relazione intervienei: INT ERV IENEI(infermiere, data, ora, luogo) fk (infermiere) references INFERMIERE(codiceFiscale) fk (data,ora,luogo) references INTERVENTO(data,ora,luogo) 2 Modello relazionale e linguaggio SQL Si consideri il seguente schema logico relazionale: P AZIEN T E(codiceF iscale, nome, cognome, datan ascita, grupposanguigno, Rh) MALAT T IA(codice, nome, descrizione, tipo, curabile) 2 SOF F RE(paziente, malattia, dalladata, alladata) Definire preliminarmente le chiavi primarie e le chiavi esterne delle relazioni date, tenendo presente che si vuole mantener traccia dello storico delle malattie di cui un paziente ha sofferto. P AZIEN T E(codiceF iscale, nome, cognome, datan ascita, grupposanguigno, Rh) M ALAT T IA(codice, nome, descrizione, tipo, curabile) SOF F RE(paziente, malattia, dalladata, alladata) fk (paziente) references PAZIENTE(codiceFiscale) fk (malattia) references MALATTIA(codice) Successivamente, supponendo di aver già creato le tabelle PAZIENTE e MALATTIA, formulare l istruzione SQL per la creazione della tabella SOF- FRE con tutti i vincoli necessari. CREATE TABLE SOFFRE( p a z i e n t e CHAR( 1 6 ), m a l a t t i a CHAR( 5 ), dalladata DATE, a lladata DATE, PRIMARY KEY ( paziente, malattia, dalladata ), FOREIGN KEY ( p a z i e n t e ) REFERENCES PAZIENTE( c o d i c e F i s c a l e ), FOREIGN KEY ( m a l a t t i a ) REFERENCES MALATTIA( c o d i c e ) ) Infine, formulare opportune interrogazioni nel linguaggio SQL che permettano di determinare: 2 curabile è un attributo booleani 5
1. il numero di pazienti che soffrono/hanno sofferto di almeno una malattia curabile SELECT COUNT(DISTINCT SOFFRE. p a z i e n t e ) FROM MALATTIA, SOFFRE WHERE MALATTIA. c o d i c e=soffre. m a l a t t i a AND MALATTIA. c u r a b i l e SELECT COUNT(DISTINCT SOFFRE. p a z i e n t e ) FROM MALATTIA JOIN SOFFRE ON MALATTIA. c o d i c e=soffre. m a l a t t i a WHERE MALATTIA. c u r a b i l e 2. il nome e il cognome dei pazienti che soffrono attualmente di mononucleosi (nome) SELECT PAZIENTE. nome, PAZIENTE. cognome FROM PAZIENTE, SOFFRE, MALATTIA WHERE PAZIENTE. c o d i c e F i s c a l e=soffre. p a z i e n t e AND SOFFRE. m a l a t t i a = MALATTIA. c o d i c e AND SOFFRE. nome = mononucleosi AND SOFFRE. alladata NULL SELECT PAZIENTE. nome, PAZIENTE. cognome FROM PAZIENTE JOIN SOFFRE ON PAZIENTE. c o d i c e F i s c a l e=soffre. p a z i e n t e JOIN SOFFRE. m a l a t t i a = MALATTIA. c o d i c e WHERE AND SOFFRE. nome = mononucleosi AND SOFFRE. alladata IS NULL IS 3. i codici fiscali delle persone che soffrono/hanno sofferto di almeno due malattie diverse (possibilmente senza usare funzioni aggregate) SELECT DISTINCT S1. p a z i e n t e FROM SOFFRE AS S1, SOFFRE AS S2 WHERE S1. p a z i e n t e = S2. p a z i e n t e AND S1. m a l a t t i a < S1. m a l a t t i a SELECT DISTINCT m a l a t t i a FROM SOFFRE GROUP BY p a z i e n t e HAVING COUNT( )>1 4. il codice fiscale dei pazienti che soffrono/hanno sofferto di malattie di tipo infettivo e che non soffrono di malattie non curabile FROM SOFFRE JOIN MALATTIA ON SOFFRE. m a l a t t i a = MALATTIA. c o d i c e WHERE MALATTIA. t i p o = i n f e t t i v a EXCEPT 6
FROM SOFFRE JOIN MALATTIA ON SOFFRE. m a l a t t i a = MALATTIA. c o d i c e WHERE MALATTIA. c u r a b i l e = f a l s e SELECT DISTINCT SOFFRE. p a z i e n t e FROM SOFFRE JOIN MALATTIA ON SOFFRE. m a l a t t i a = MALATTIA. c o d i c e WHERE MALATTIA. t i p o = i n f e t t i v a AND SOFFRE. p a z i e n t e NOT IN ( FROM SOFFRE JOIN MALATTIA ON SOFFRE. m a l a t t i a = MALATTIA. c o d i c e WHERE MALATTIA. c u r a b i l e = f a l s e ) SELECT c o d i c e f i s c a l e FROM PAZIENTE WHERE c o d i c e F i s d c a l e IN ( FROM SOFFRE JOIN MALATTIA ON SOFFRE. m a l a t t i a = MALATTIA. c o d i c e WHERE MALATTIA. t i p o = i n f e t t i v a ) AND c o d i c e F i s c a l e NOT IN ( FROM SOFFRE JOIN MALATTIA ON SOFFRE. m a l a t t i a = MALATTIA. c o d i c e WHERE MALATTIA. c u r a b i l e = f a l s e ) 7