Progettazione Concettuale Database Ospedale
-
Upload
silvano-natalizi-itis-alessandro-volta-perugia -
Category
Education
-
view
14.914 -
download
8
description
Transcript of Progettazione Concettuale Database Ospedale
Progettazione concettuale database OSPEDALE
SCHEMA ENTITY RELATIONSHIP
Esercizio per la classe VA liceo tecnico
Del 17 novembre 2008
Prof. Silvano Natalizi
Progettazione di un database per un ospedale Si vuole progettare un database per un ospedale, in modo che le seguenti informazioni siano opportunamente
rappresentate : Un paziente viene ricoverato in un reparto dell’ospedale e gli è assegnato un letto in una camera della corsia di quel
reparto. il paziente ha un numero, un nome, un indirizzo, un numero di tessera sanitaria. il reparto ha un nome (chirurgia, medicina interna…) ed un codice identificativo la camera ha un numero il letto ha un numero
un infermiere può essere assegnato ad uno o più reparti. In ciascun reparto lavora almeno un infermiere. Si vogliono memorizzare le ore per settimana che ogni infermiere lavora in un reparto. l’infermiere è un impiegato dell’ospedale. per ogni infermiere si vogliono memorizzare gli anni di anzianità. l’impiegato è ogni persona che lavora nello staff dei dipendenti dell’ospedale.
Si vuole memorizzare il nome , l’indirizzo, il codice, di ciascun impiegato. Un medico è assegnato ad uno o più pazienti. Ad un paziente deve essere assegnato almeno un medico.
ciascun medico è parte dello staff degli impiegati dell’ospedale per ciascun medico deve essere memorizzata la sua specializzazione.
I medici possono eseguire delle cure mediche (trattamenti) sui pazienti. Ad un paziente possono essere fatti trattamenti medici da uno o più medici. per ciascun trattamento eseguito su di un paziente da un particolare medico si vuole memorizzare la data del
trattamento, la sua durata, il risultato. il trattamento, ossia esami medici o qualsiasi procedura eseguita dal medico su di un paziente, ha un nome ed un
codice identificativo
Struttura dell’ospedale con reparti
Mapping della struttura ospedale OSPEDALE(codOsp,nomeOsp,locaOsp); REPARTO(*codOsp,codRep,nomeRep); CAMERA(*codOsp,*codRep,numCam); LETTO
(*codOsp,*codRep,*numCam,numLetto);
Dati campione delle tabelle della struttura ospedale (ospedale, reparto)
Dati campione delle tabelle della struttura ospedale (camera)
Dati campione delle tabelle della struttura ospedale (letto)
Serve l’entità letto ?
Non si sarebbe potuto fare a meno delle entità camera e letto ? L’entità numero camera potrebbe essere un semplice attributo
della relazione paziente assegnato al reparto All’entità reparto potremmo attribure il numero totale delle sue
camere Tuttavia si ha la necessità di conoscere quanti letti ci sono per
camera ! Dove memorizziamo questa informazione ? Oppure potremmo calcolare il numero di letti per camera se non
avessimo l’indicazione precisa di ogni letto per camera ? Come faremmo a sapere se in una camera ci sono ancora letti
liberi per un nuovo ricovero ? Da qui risulta chiaro che l’entità camera e letto diventano
interessanti e necessarie se ci sono altri dati da memorizzare al loro livello.
Potremmo a tal fine aggiungere (ad esempio) nella tabella “letto” la nuova colonna “occupato/libero”
L’entità paziente
L’entità paziente e le sue relazioni Dall’entità paziente partono due distinte
relazioni binarie : La relazione binaria “RICOVERA” tra
l’entità paziente e l’entità reparto La relazione binaria “ASSEGNATO” tra
l’entità paziente e l’entità letto. Potremmo sostituire a queste due relazioni
binarie una sola relazione ternaria ?
La relazione “assegnato”
Questa relazione è 1 a 1 Ad un paziente deve essere assegnato un letto
Partecipazione totale Un letto può essere assegnato ad un paziente
Partecipazione parziale Il mapping di “Letto” viene riprogettato e diventa: LETTO
(*codOsp,*codRep,*numCam,numLetto,*numTesseraSanitaria); Ossia abbiamo aggiunto nella tabella letto la chiave primaria di
Paziente che qui diventa chiave straniera Questa cosa è utili perché così sappiamo che il letto è occupato
Quando il letto è libero nel corrispondente campo è memorizzato zero
La relazione “ricovera”
La relazione ricovera è “1 a molti” perché un paziente deve essere ricoverato in un solo reparto, ma un reparto deve ricoverare più pazienti.
Tuttavia se vogliamo memorizzare dei dati interessanti quale la data di ricovero e quella di dimissione, la relazione assume una dimensione anche temporale e quindi possiamo dire che un paziente nel tempo può essere ricoverato in più reparti.
In quest’ultimo caso la relazione diventa molti a molti ed ha anche degli attributi per cui si mappa nella tabella “ricovera”
RICOVERA(*codOsp, *codRep, *numTesseraSanitaria, dataRicovero, dataDimissione);
La relazione ternaria “cura”
Mapping della relazione “cura” La relazione “cura” è molti a molti a molti, Inoltre ha tre attributi Pertanto diventa una tabella CURA(*numTesseraSanitaria, *codImp,
*codTrattamento, dataT, durataT, risultatoT);
Relazione “responsabile tra medico e paziente
Il medico responsabile del paziente Ogni qual volta un paziente è ricoverato in un reparto di un
ospedali gli viene assegnato un medico responsabile. La relazione binaria “responsabile” uno a molti, tra medico e
paziente si mappa al seguente modo: Nella tabella PAZIENTE viene inserita la chiave straniera codice
medico ! Cosa succede se il paziente è ricoverato più volte in periodi
successivi ? Potremmo risolvere il problema passando ad una relazione molti
a molti e creare una tabella per la relazione “responsabile” RESPONSABILE(*codimp,*numeroTesseraSanitaria);
Quali informazioni fornirebbe questa tabella?
Dati campioni di “responsabile”
Questa tabella ci dice che un certo paziente ha un certo medico responsabile, ma non sappiamo per quale ricovero !
Se un paziente viene ricoverato in periodi successivi nel medesimo ospedale, avremo una nuova riga con un nuovo medico o il medesimo medico, pertanto la chiave primaria manca di un attributo
La soluzione del problema sta nel riconoscere che questa relazione “responsabile” in realtà è una relazione di relazione nei confronti della relazione “ricovera”.
La relazione “responsabile” diventa relazione della relazione “ricovera”
La relazione “ricovera” diventa entità debole
Mapping di “ricovero”
Ricovero è un’entità debole che dipende sia da paziente che da reparto. Inoltre è dalla parte di molti della relazione “responsabile”
Ne consegue che in “ricovero” devono esserci, come chiavi straniere, le chiavi primarie delle tre entità “paziente”, “reparto”, “medico”
RICOVERO(*numTesseraSanitaria,*codOsp,*codRep,numr,dataRicovero, *codImp,dataDimissione)
La specializzazione/generalizzazione
La tabella “RICOVERO”
RICOVERO(*numTesseraSanitaria,*codOsp,*codRep,numr,dataRicovero, *codImp,dataDimissione)
Osserviamo che la chiave primaria è composta da molte chiavi straniere e la chiave parziale numeroRicovero !
Ci occorre una sintassi per dichiarare una chiave composta
Ci occorre una sintassi per dichiarare le chiavi straniere !
Sintassi per creare la tabella “RICOVERO” 1 CREATE TABLE ricovero (
numTesseraSanitaria char(16) not null, codOsp integer not null, codRep int not null, numRicovero int not null, codMedico char(10) not null, dataRicovero date not null, dataDimissione date ,
Sintassi per creare la tabella “RICOVERO” 2
CONSTRAINT ricovero_pk PRIMARY KEY(codOsp,codRep,numRicovero),
CONSTRAINT ricovero_fk1 FOREIGN KEY(codOsp) REFERENCES ospedale(codOsp),
CONSTRAINT ricovero_fk2 FOREIGN KEY(codRep) REFERENCES reparto(codRep),
CONSTRAINT ricovero_fk3 FOREIGN KEY(numTesseraSanitaria) REFERENCES paziente(numTesseraSanitaria),
CONSTRAINT ricovero_fk4 FOREIGN KEY(codMedico) REFERENCES personale(codImp) );