Progettazione Concettuale Database Ospedale
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Progettazione Concettuale Database Ospedale

  • 14,783 views
Uploaded on

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

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

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
14,783
On Slideshare
14,419
From Embeds
364
Number of Embeds
7

Actions

Shares
Downloads
197
Comments
0
Likes
4

Embeds 364

http://didatticasilvanonatalizi.blogspot.com 151
http://didatticasilvanonatalizi.blogspot.it 138
http://www.slideshare.net 63
http://www.health.medicbd.com 6
http://www.didatticasilvanonatalizi.blogspot.com 3
http://static.slideshare.net 2
http://health.medicbd.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Progettazione concettuale database OSPEDALE SCHEMA ENTITY RELATIONSHIP Esercizio per la classe VA liceo tecnico Del 17 novembre 2008 Prof. Silvano Natalizi
  • 2. 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
  • 3. Struttura dell’ospedale con reparti
  • 4. Mapping della struttura ospedale
    • OSPEDALE( codOsp ,nomeOsp,locaOsp);
    • REPARTO(* codOsp , codRep ,nomeRep);
    • CAMERA(* codOsp ,* codRep , numCam );
    • LETTO (* codOsp ,* codRep ,* numCam , numLetto );
  • 5. Dati campione delle tabelle della struttura ospedale (ospedale, reparto)
  • 6. Dati campione delle tabelle della struttura ospedale (camera)
  • 7. Dati campione delle tabelle della struttura ospedale (letto)
  • 8. 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”
  • 9. L’entità paziente
  • 10. 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 ?
  • 11. 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
  • 12. 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);
  • 13. La relazione ternaria “cura”
  • 14. Mapping della relazione “cura”
    • La relazione “cura” è molti a molti a molti,
    • Inoltre ha tre attributi
    • Pertanto diventa una tabella
    • CURA(* numTesseraSanitaria , * codImp , * codTrattament o, dataT , durataT, risultatoT);
  • 15. Relazione “responsabile tra medico e paziente
  • 16. 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?
  • 17. 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”.
  • 18. La relazione “responsabile” diventa relazione della relazione “ricovera”
  • 19. La relazione “ricovera” diventa entità debole
  • 20. 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)
  • 21. La specializzazione/generalizzazione
  • 22. 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 !
  • 23. 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 ,
  • 24. 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) );