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 8 settembre 2011 1 Progettazione di basi di dati Si vuole progettare il sistema informativo per la gestione del magazzino dei medicinali utilizzati in un reparto ospedaliero. In particolare, si vuole mantener traccia delle informazioni relative ad ogni medicinale utilizzato/disponibile. Ogni tipo di medicinale ha un nome, un principio attivo, un produttore, un periodo di validità (es. 36 mesi) ed è di un particolare tipo (generico, etico,...). Ogni medicinale può essere disponibile in confezioni diverse con diversa forma (compresse, sospensione,...) e/o quantità (10, 20,...) di prodotto. Si vuole tener traccia di tutti i medicinali acquistati. Per ogni ordine di medicinali effettuato si vuole memorizzare la data, il fornitore, il quantitativo di ogni confezione di medicinale acquistato ed il relativo prezzo (che può variare da ordine a ordine). Dei fornitori si memorizza la partita iva, la ragione sociale, l indirizzo (città, via, numero) e uno o più numeri di telefono. Infine, ogni medicinale prelevato dal magazzino deve essere registrato. Per ogni prelievo si vuole memorizzare la data, la persona che effettua il prelievo e il quantitativo di confezioni prelevate. 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. Progettazione logica Apportare le necessarie modifiche di ristrutturazione allo schema Entità-Relazioni prodotto e tradurlo nello schema logico relazionale. 1
Figura 1: Schema ER Ristrutturazione: 1. attributi composti: l attributi indirizzo dell entità FORNITORE; 2. attributi multivalore: l attributo telefono dell entità FORNITORE; Lo schema ER ristrutturato è rappresentato in Figura 2. Traduzione: 1. entità: Figura 2: Schema ER ristrutturato M EDICIN ALE(nome, principioattivo, validita, produttore, tipo) principioattivo, produttore, tipo NOT NULL CON F EZION E(medicinale, f orma, quantita) P RELIEV O(id, data, persona) descrizione, tipo, apparato NOT NULL 2
ACQU IST O(id, data) data NOT NULL F ORN IT ORE(pIV A, ragionesociale, citta, via, numero) ragionesociale, citta, via, numero NOT NULL T ELEF ON O(numero) 2. relazioni UNO-A-MOLTI (estensione delle tabelle precedenti): relazione ha: T ELEF ON O(numero, f ornitore) fornitore NOT NULL fk (fornitore) references FORNITORE(pIVA) relazione appartiene: CON F EZION E(medicinale, f orma, quantita) fk (medicinale) references MEDICINALE(nome) relazione intestazione: ACQU IST O(id, data, f ornitore) data, fornitore NOT NULL fk (fornitore) references FORNITORE(pIVA) 3. relazioni MOLTI-A-MOLTI (nuove tabelle): relazione acquista: ACQU IST A(id, medicinale, f orma, quantitac, quantita, prezzo) quantita, prezzo NOT NULL fk (medicinale, forma, quantitac) references CONFEZIONE(medicinale, forma, quantita) fk (id) references PRELIEVO(id) relazione preleva: P RELEV A(id, medicinale, f orma, quantitac, quantita) quantita NOT NULL fk (medicinale, forma, quantitac) references CONFEZIONE(medicinale, forma, quantita) fk (id) references PRELIEVO(id) 3
2 Modello relazionale e linguaggio SQL Si consideri il seguente schema logico relazionale: OSP EDALE(codice, nome, citta, via, numero) REP ART O(ospedale, nome, dataapertura) M EDICO(codiceF iscale, nome, cognome, datan ascita, specializzazione, lavorain ospedale, lavorain reparto) Definire preliminarmente le chiavi primarie e i vincoli di chiave esterna sulle relazioni date. OSP EDALE(codice, nome, citta, via, numero) REP ART O(ospedale, nome, dataapertura) fk (ospedale) references OSPEDALE(codice) M EDICO(codiceF iscale, nome, cognome, datan ascita, specializzazione, lavorain ospedale, lavorain reparto) fk (lavorainospedale,lavorainreparto) references REPARTO(ospedale,nome) Successivamente, supponendo di aver già creato le tabelle OSPEDALE e REPARTO, formulare l istruzione SQL per la creazione della tabella MEDI- CO con tutti i vincoli necessari. CREATE TABLE MEDICO( c o d i c e F i s c a l e CHAR( 1 6 ), nome VARCHAR( 3 0 ) NOT NULL, cognome VARCHAR( 3 0 ) NOT NULL, datanascita DATE NOT NULL, s p e c i a l i z z a z i o n e VARCHAR( 3 0 ) NOT NULL, l a v o r a I N o s p e d a l e CHAR( 5 ) NOT NULL, l a v o r a I N r e p a r t o VARCHAR( 2 0 ) NOT NULL, PRIMARY KEY ( c o d i c e F i s c a l e ), FOREIGN KEY ( lavorainreparto, lavorainstanza ) REFERENCES REPARTO( ospedale, nome) ) Infine, formulare opportune interrogazioni nel linguaggio SQL che permettano di determinare: 1. il numero di medici che lavorano in ogni ospedale (codice identificativo dell ospedale) SELECT lavorainospedale, COUNT( ) GROUP BY l a v o r a I N o s p e d a l e ; 2. il codice e la città dell ospedale e il nome del reparto in cui lavorano medici specializzati in angiologia 4
SELECT DISTINCT codice, comune, MEDICO. l a v o r a I N r e p a r t o FROM OSPEDALE, MEDICO WHERE c o d i c e=l a v o r a I N o s p e d a l e AND s p e c i a l i z z a z i o n e= a n g i o l o g i a SELECT DISTINCT codice, comune, MEDICO. l a v o r a I N r e p a r t o FROM OSPEDALE JOIN MEDICO ON c o d i c e=l a v o r a I N o s p e d a l e WHERE s p e c i a l i z z a z i o n e= a n g i o l o g i a Volendo passare per la tabella REP ART O, che comunque non serve perché nella tabella M EDICO c è l attributo lavorain reparto che non è altro che il nome del reparto: SELECT DISTINCT codice, comune, REPARTO. nome FROM OSPEDALE, REPARTO, MEDICO WHERE c o d i c e=o s p e d a l e AND l a v o r a I N o s p e d a l e=o s p e d a l e AND l a v o r a I N r e p a r t o=reparto. nome AND s p e c i a l i z z a z i o n e= a n g i o l o g i a 3. le specializzazioni per cui esistono almeno due medici (possibilmente senza usare funzioni aggregate) SELECT DISTINCT P1. s p e c i a l i z z a z i o n e AS P1, MEDICO AS P2 WHERE P1. s p e c i a l i z z a z i o n e = P2. s p e c i a l i z z a z i o n e AND P1. c o d i c e F i s c a l e < P2. c o d i c e F i s c a l e SELECT s p e c i a l i z z a z i o n e GROUP BY s p e c i a l i z z a z i o n e HAVING COUNT( ) >1 4. l indirizzo (città, via e numero) degli ospedali che hanno il reparto di chirurgia (nome) ma non hanno nessun medico specializzato in Chirurgia pediatrica. FROM OSPEDALE JOIN REPARTO ON codiceasl=o s p e d a l e WHERE REPARTO. nome= C h i r u r g i a EXCEPT FROM OSPEDALE JOIN MEDICO ON codiceasl=o s p e d a l e WHERE s p e c i a l i z z a z i o n e= C h i r u r g i a p e d i a t r i c a FROM OSPEDALE JOIN REPARTO ON codiceasl=o s p e d a l e WHERE REPARTO. nome= C h i r u r g i a AND codiceasl NOT IN (SELECT o s p e d a l e WHERE s p e c i a l i z z a z i o n e= C h i r u r g i a p e d i a t r i c a ) 5