Cartella Medicine Temperature: SET(data,temp) Patologie: SET(String) Paziente Costo () : NUMERIC 0..* codice descrizione fornisce quantita_scatole costo_scatola Reparto 1..1 codice_pad indirizzo_pad n_piano n_letti_u n_letti_d tel 0..1 i 1..* codice ticket data inizio data fine 0..1 Primario_in Servizio 0..* 0..1 infermiere_in medico_in Svolto_in d e_ sc Costo () : NUMERIC 0..* 1 i ru uf us CF nome cognome sesso dataN n_stanza n_letto DIAGRAMMA CLASSI Personale Ricovero Ambulatorio Emergenza disposto_da cod_pren cod_emergenza nome_unita nome cognome tel specializzazione stipendio 1..* 1 Medico 1..* Infermiere Ausiliario T_Cartella T_Paziente CF nome cognome sesso dataN n_stanza n_letto Temperature: {{ }} Patologie: {{String}} medicine: {{ }} * T_Medicina TIPI codice descrizione quantita_scatole costo_scatola assumiamo che tutti i codici abbiamo un valore semantico T_Reparto Costo () : NUMERIC T_Temperature data temp * codice_pad indirizzo_pad n_piano n_letti_u n_letti_d tel primario: T_Servizio Costo () : NUMERIC * codice ticket data inizio data fine Reparto paziente cartella * * T_Personale T_Ricovero T_Ambulatorio T_Emergenza disposto_da cod_pren cod_emergenza nome_unita nome cognome tel specializzazione stipendio tipo reparto : Tabelle • Paziente of T_Paziente (PID,CF) • Servizio of T_Servizio (SID,codice, paziente WITH OPTION SCOPE Paziente, reparto WITH OPTION SCOPE Reparto) – Ricovero of T_Ricovero UNDER T_Servizio – Ambulatorio of T_Ambulatiorio UNDER T_Servizio – Emergenza of T_Emergenza UNDER T_Servizio • Medicina of T_Medicina (MID,codice) • Personale of T_Personale (PID, nome, cogn, tel, reparto WITH OPTION SCOPE Reparto) • Reparto of T_Reparto (RID, codice_pad, indirizzo_pad,n_piano, primario WITH OPTION SCOPE Personale) • non creiamo una tabella per cartella in quanto non e’ e’ coinvolta in aggregazioni per riferimento Tabelle: nota • • • • il tipo T_Servizi non e’ riferito da alcuna aggregazione tuttavia, contiene dei metodi quindi il tipo deve essere mantenuto se non avesse avuto metodi, potevamo non creare il tipo e definire Servizi come tabella non tipata DDL • Definizione tipo per modellazione cartelle cliniche CREATE TYPE t_cartella AS (temperature t_temperature MULTISET, patologie VARCHAR(20) MULTISET, medicine REF T_Medicine MULTISET) NOT FINAL; Query • Dato il reparto X visualizzare il medicinale piu’ utilizzato per pazienti uomini SELECT M.Nome FROM Servizi S, UNNEST(S.Cartella.Medicine) M WHERE S.reparto --> Nome = ‘X’ AND S.paziente --> Sesso = ‘M’ GROUP BY M.Nome HAVING COUNT(*) > = ALL (SELECT COUNT(*) FROM Servizi S, UNNEST(S.Cartella.Medicine) M WHERE S.reparto --> Nome = ‘X’ AND S.paziente --> Sesso = ‘M’ GROUP BY M) Query • Dato il reparto Z, visualizzare la cartella clinica piu’ costosa per pazienti ricoverati dall’anno X all’anno Y • HP: visualizzo solo le temperature, e il CF del paziente, in modo analogo si possono visualizzare tutte le altre informazioni SELECT S.paziente--> CF, T.data,T.temp FROM Servizi S, UNNEST(S.Cartella.Temperature) T WHERE S.reparto --> Nome = ‘Z’ AND S.data_inizio >= ‘1/1/X’ AND S.data_fine <= ‘31/12/Y’ AND S.cartella.costo() > = ALL (SELECT S.cartella.costo() FROM Servizi S WHERE S.reparto --> Nome = ‘Z’ AND S.data_inizio >= ‘1/1/X’ AND S.data_fine <= ‘31/12/Y’) Inserimento • Inserire la cartella clinica per un certo ricovero a vostra scelta, supponendo di assegnare due medicinali e la temperatura del giorno corrente UPDATE Servizio SET cartella = t_cartella(MULTISET[t_temperature(CURRENT_DATE,38)], MULTISET[‘febbre’,’dolori addominali’], MULTISET[SELECT m.mid FROM Medicina WHERE codice =‘xy’ OR codice = ‘zw’]) WHERE paziente.CF =‘XNSHEUE’