Progettazione Concettuale Database Ospedale

24
Progettazione concettuale database OSPEDALE SCHEMA ENTITY RELATIONSHIP Esercizio per la classe VA liceo tecnico Del 17 novembre 2008 Prof. Silvano Natalizi

description

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

Transcript of Progettazione Concettuale Database Ospedale

Page 1: 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

Page 2: Progettazione Concettuale Database Ospedale

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

Page 3: Progettazione Concettuale Database Ospedale

Struttura dell’ospedale con reparti

Page 4: Progettazione Concettuale Database Ospedale

Mapping della struttura ospedale OSPEDALE(codOsp,nomeOsp,locaOsp); REPARTO(*codOsp,codRep,nomeRep); CAMERA(*codOsp,*codRep,numCam); LETTO

(*codOsp,*codRep,*numCam,numLetto);

Page 5: Progettazione Concettuale Database Ospedale

Dati campione delle tabelle della struttura ospedale (ospedale, reparto)

Page 6: Progettazione Concettuale Database Ospedale

Dati campione delle tabelle della struttura ospedale (camera)

Page 7: Progettazione Concettuale Database Ospedale

Dati campione delle tabelle della struttura ospedale (letto)

Page 8: Progettazione Concettuale Database Ospedale

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”

Page 9: Progettazione Concettuale Database Ospedale

L’entità paziente

Page 10: Progettazione Concettuale Database Ospedale

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 ?

Page 11: Progettazione Concettuale Database Ospedale

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

Page 12: Progettazione Concettuale Database Ospedale

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

Page 13: Progettazione Concettuale Database Ospedale

La relazione ternaria “cura”

Page 14: Progettazione Concettuale Database Ospedale

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

Page 15: Progettazione Concettuale Database Ospedale

Relazione “responsabile tra medico e paziente

Page 16: Progettazione Concettuale Database Ospedale

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?

Page 17: Progettazione Concettuale Database Ospedale

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”.

Page 18: Progettazione Concettuale Database Ospedale

La relazione “responsabile” diventa relazione della relazione “ricovera”

Page 19: Progettazione Concettuale Database Ospedale

La relazione “ricovera” diventa entità debole

Page 20: Progettazione Concettuale Database Ospedale

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)

Page 21: Progettazione Concettuale Database Ospedale

La specializzazione/generalizzazione

Page 22: Progettazione Concettuale Database Ospedale

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 !

Page 23: Progettazione Concettuale Database Ospedale

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 ,

Page 24: Progettazione Concettuale Database Ospedale

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