Progettazione Concettuale Database Ospedale

13,577 views

Published on

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

Published in: Education
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
13,577
On SlideShare
0
From Embeds
0
Number of Embeds
402
Actions
Shares
0
Downloads
246
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Progettazione Concettuale Database Ospedale

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

×