Progettazione Concettuale Database Ospedale

Post on 04-Dec-2014

14.915 views 8 download

description

esempio di progettazione di un database per un ospedale. Schema concettuale entity relationships

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) );