UNIVERSITÀ DEGLI STUDI DI UDINE Facoltà di Medicina e Chirurgia CORSO DI LAUREA IN TECNICHE DI RADIOLOGIA MEDICA PER IMMAGINI E RADIOTERAPIA ESAME 14 maggio 2009 1 Progettazione di basi di dati Si vuole progettare il sistema informativo per la gestione del magazzino di un laboratorio medico che effettua esami. Ogni esame è identificato da un codice numerico, è effettuato in una specifica data e ora, su un particolare paziente e da uno specifico medico. Per i medici e i pazienti si vuole memorizzare il codice fiscale, il nome, il cognome e almeno un riferimento telefonico. Inoltre, per i pazienti si vuole tener traccia anche della data di nascita, del gruppo sanguigno e del fattore Rh, mentre per i medici anche della relativa specializzazione. Si vuole mantener traccia dei diversi materiali e delle relative disponibilità. Ogni materiale ha un codice, che lo identifica univocamente, una descrizione ed è acquistato attraverso un ordine con una data quantità e prezzo. Ogni ordine ha un numero di registrazione interno univoco, una data, un fornitore e può presentare uno o più materiali al suo interno. Per ogni fornitore si vuole memorizzare la partita IVA, la denominazione, l indirizzo, uno o più numeri di telefono e il nome della persona di riferimento. Per poter mantenere aggiornata la disponibilità dei materiali si vuole mantener traccia anche del loro utilizzo. Per ogni esame, si vogliono quindi memorizzare i materiali utilizzati e i relativi quantitativi. 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à (identificando le possibili chiavi) e relazione. Vanno specificati accuratamente i vincoli di cardinalità e partecipazione di ciascuna relazione. 1
Figura 1: Schema ER Progettazione logica Apportare le necessarie modifiche di ristrutturazione allo schema Entità-Relazioni prodotto e tradurlo nello schema logico relazionale. Ristrutturazione: 1. specializzazione: entità PERSONA (dato che si suppone accedere in modo separato ai dati relativi ai pazienti e ai medici si decide eliminare l entità padre e portare tutte le proprietà dell entità padre alle entità figlie, Figura 2) Figura 2: Ristrutturazione di specializzazione dell entità PERSONA 2
2. attributi composti: attributo indirizzo dell entità FORNITORE (Figura 3) 3. attributi multivalore: attributo telefono dell entità FORNITORE (Figura 3) ed attributo telefono dell entità PERSONA (analogo al precedente) Figura 3: Ristrutturazione di attributi composti e multivalore dell entità FORNITORE Traduzione: 1. entità: F ORN IT ORE(partitaIV A, ragionesociale, personarif erimento, via, numero, citta) ragionesociale, personariferimento, via, numero, citta NOT NULL P AZIEN T E(codiceF iscale, nome, cognome, datan ascita, grupposanguigno, Rh) nome, cognome, datanascita, grupposanguigno, Rh NOT NULL M EDICO(codiceF iscale, nome, cognome, specializzazione) nome, cognome, specializzazione NOT NULL ORDIN E(numeroRegistrazione, data) data NOT NULL ESAM E(id, dataora) dataora NOT NULL M AT ERIALE(codice, descrizione) descrizione NOT NULL 3
T ELEF ONO(numero) 1 2. relazioni UNO-A-MOLTI (estensione delle tabelle precedenti): relazione effettuatosu: ESAM E(id, dataora, paziente) fk (paziente) references PAZIENTE(codiceFiscale) paziente NOT NULL relazione effettuatoda: ESAM E(id, dataora, paziente, medico) fk (medico) references MEDICO(codiceFiscale) 3. relazioni MOLTI-A-MOLTI (aggiunta di nuove tabelle): relazione intesta: INT EST A(fornitore, ordine) fk (fornitore) references FORNITORE(codiceFiscale) fk (ordine) references ORDINE(numeroRegistrazione) relazione contiene: CON T IEN E(ordine, materiale, quantita, prezzo) fk (ordine) references ORDINE(numeroRegistrazione) fk (materiale) references MATERIALE(codice) quantita, prezzo NOT NULL relazione utilizza: U T ILIZZA(esame, materiale, quantita) fk (esame) references ESAME(codice) fk (materiale) references MATERIALE(codice) quantita NOT NULL relazioni ha (una per il telefono del fornitore, una del medico, una del paziente): HA F ORNIT ORE(telefono, fornitore) fk (fornitore) references FORNITORE(partitaIVA) fk (telefono) references TELEFONO(numero) 2 Modello relazionale e linguaggio SQL Si consideri il seguente schema logico relazionale: 1 Suppongo di usare la stessa tabella per raccogliere tutti i numeri di telefono 4
P AZIEN T E(codiceF iscale, nome, cognome, datan ascita, grupposanguigno, Rh) AN ALISI(id, paziente, data, dataritiro, responsabile) ESAM I(analisi, esame, valore) T IP O ESAM E(denominazione, valorem inimo, valorem assimo) Tenendo presente che un analisi può prevedere diversi esami, definire preliminarmente le chiavi primarie e le eventuali chiavi esterne delle relazioni date. P AZIEN T E(codiceF iscale, nome, cognome, datan ascita, grupposanguigno, Rh) AN ALISI(id, paziente, data, dataritiro, responsabile) fk (paziente) references PAZIENTE(codiceFiscale) ESAM I(analisi, esame, valore) fk (analisi) references ANALISI(id) fk (esame) references TIPO ESAME(denominazione) T IP O ESAM E(denominazione, valorem inimo, valorem assimo) Successivamente, supponendo di aver già creato la tabella PAZIENTE, formulare l istruzione SQL per la creazione della tabella ANALISI (con tutti i vincoli necessari). CREATE TABLE ANALISI( id NUMERIC( 5, 0 ) PRIMARY KEY, p a z i e n t e CHAR(16) NOT NULL, data DATE NOT NULL, d a t a R i t i r o DATE, r e s p o n s a b i l e CHAR(16), 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 ) ) Formulare opportune interrogazioni nel linguaggio SQL che permettano di determianre: 1. i tipi di esame (denominazione) per cui è indicato un valore minimo e non un valore massimo SELECT FROM TIPO ESAME WHERE TIPO ESAME. valoreminimo IS NOT NULL AND TIPO ESAME. valoremassimo IS NULL 2. l identificativo e la data delle analisi effettuati da Mario Rossi ordinandoli in ordine crescente per data 5
SELECT ANALISI. id, ANALISI. data FROM ANALISI JOIN MEDICO ON ANALISI. p a z i e n t e=paziente. c o d i c e F i s c a l e WHERE PAZIENTE. nome= Mario AND PAZIENTE. cognome= Rossi ORDER BY ANALISI. data 3. il codice fiscale dei pazienti a cui è stato rilevato un valore eccessivo relativo all esame emoglobina SELECT ANALISI. p a z i e n t e FROM ANALISI JOIN ESAMI ON ANALISI. id=esami. a n a l i s i JOIN TIPO ESAME ON ESAMI. esame= WHERE = emoglobina AND TIPO ESAME. valoremassimo<esame. v a l o r e 4. i medici che sono stati responsabili di almeno due analisi relativi ad uno stesso paziente SELECT DISTINCT E1. r e s p o n s a b i l e FROM ANALISI E1, ANALISI E2 WHERE E1. r e s p o n s a b i l e=e1. r e s p o n s a b i l e AND E1. p a z i e n t e=e2. p a z i e n t e AND E1. id<>e2. id 5. il numero di esami che presentano valori errati (minori o maggiori dei valori limite) per ogni analisi SELECT ESAMI. a n a l i s i, COUNT( ) FROM ESAMI JOIN TIPO ESAME ON ESAMI. esame=tipo ESAME. denominazione WHERE TIPO ESAME. valoremassimo<esame. v a l o r e OR TIPO ESAME. valoreminimo>esame. v a l o r e GROUP BY ESAMI. a n a l i s i 6. i pazienti (codice fiscale, nome e cognome) a cui non sono mai stati rilevati valori errati (minori o maggiori dei valori limite) SELECT c o d i c e F i s c a l e, nome, cognome FROM PAZIENTE WHERE c o d i c e F i s c a l e NOT IN ( SELECT DISTINCT ESAMI. p a z i e n t e FROM ESAMI JOIN TIPO ESAME ON ESAMI. esame= WHERE TIPO ESAME. valoremassimo<esame. v a l o r e OR TIPO ESAME. valoreminimo>esame. v a l o r e ) 6
SELECT c o d i c e F i s c a l e, nome, cognome FROM PAZIENTE WHERE NOT EXISTS ( SELECT FROM ESAMI JOIN TIPO ESAME ON ESAMI. esame= WHERE (TIPO ESAME. valoremassimo<esame. v a l o r e OR TIPO ESAME. valoreminimo>esame. v a l o r e ) AND ESAMI. p a z i e n t e=paziente. c o d i c e F i s c a l e ) SELECT c o d i c e F i s c a l e, nome, cognome FROM PAZIENTE EXCEPT SELECT PAZIENTE. c o d i c e F i s c a l e, PAZIENTE. nome, PAZIENTE. cognome FROM PAZIENTE JOIN ANALISI ON PAZIENTE. c o d i c e F i s c a l e =ANALISI. p a z i e n t e JOIN ESAMI ON ANALISI. id=esami. a n a l i s i JOIN TIPO ESAME ON ESAMI. esame= WHERE TIPO ESAME. valoremassimo<esame. v a l o r e OR TIPO ESAME. valoreminimo>esame. v a l o r e 7