Si consideri il seguente schema di basi di dati che rappresenta le informazioni per la gestione di un laboratorio di analisi mediche: PAZIENTI(Codice, Nome, Cognome, Indirizzo) ANALISI(Codice, Paziente, Data) ESAMI(Analisi, TipoEsame, Valore) TIPIESAMI(Codice, Nome) Occorre definire vincoli di integrità referenziale fra: 1. ANALISI.Paziente e PAZIENTI.Codice 2. ESAMI.Analisi e ANALISI.Codice 3. ESAMI.TipoEsame e TIPIESAMI.Codice A. Trovare nome e cognome dei pazienti nelle cui analisi il valore di glicemia è risultato superiore a 200. Algebra relazionale π Nome,Cognome (PAZIENTI Codice=Paziente π Paziente (ANALISI π Analisi(σValore>200 (ESAMI Codice=Analisi TipoEsame=Codice σ Nome=’glicemia’ (TIPIESAMI))))) Calcolo su domini { Cognome: c, Nome: n | PAZIENTI(Codice: cp, Nome: n, Cognome: c, Indirizzo: i) ∧ ANALISI(Codice: ca, Paziente: cp, Data: d) ∧ ESAMI(Analisi: ca, TipoEsame: e, Valore: v) ∧ TIPIESAMI(Codice: e, Nome: ne) ∧ (ne = ‘glicemia’) ∧ (v>200) } Calcolo su tuple { p.(Nome, Cognome) | p(PAZIENTI), a(ANALISI), e(ESAMI), t(TIPIESAMI) | p.Codice = a.Paziente ∧ a.Codice = e.Analisi ∧ e.TipoEsame = t.Codice ∧ t.Nome = ‘glicemia’ ∧ e.Valore > 200 } B. Trovare nome e cognome dei pazienti che hanno fatto almeno due volte lo stesso esame in analisi diverse dello stesso giorno. Algebra relazionale ESAMIANALISI = πAnalisi,TipoEsame,Data,Paziente (ρAnalisi←Codice(ANALISI) π Nome,Cognome (ρ Paziente←Codice (PAZIENTI) σ¬(Analisi1=Analisi2)(ρAnalisi1←Analisi (ESAMIANALISI) ESAMI) π Paziente ( ρAnalisi2←Analisi (ESAMIANALISI)))) Calcolo su domini { Cognome: c, Nome: n | PAZIENTI(Codice: cp, Nome: n, Cognome: c, Indirizzo: i) ∧ ANALISI(Codice: ca, Paziente: cp, Data: d) ∧ ESAMI(Analisi: ca, TipoEsame: e, Valore: v) ∧ ANALISI(Codice: ca1, Paziente: cp, Data: d) ∧ ESAMI(Analisi: ca1, TipoEsame: e, Valore: v1) ∧ ¬(ca=ca1) } Calcolo su tuple { p.(Nome, Cognome) | p(PAZIENTI), a(ANALISI), e(ESAMI) | p.Codice = a.Paziente ∧ a.Codice = e.Analisi ∧ ∃ a1(ANALISI) ∃ e1(ESAME) (a1.Paziente = p.Codice ∧ a1.Codice = e1.Analisi ∧ e1.TipoEsame = e.TipoEsame ∧ a1.Data = a.Data ∧ ¬(a1.Codice=a.Codice)) } Si consideri il seguente schema di basi di dati che rappresenta le informazioni per la gestione di una sala operatoria: PAZIENTI(Codice, Nome, Cognome, Indirizzo) INTERVENTI(Codice, Paziente, Data) EQUIPE(Intervento, Medico, Ruolo) MEDICI(Codice, Nome) Occorre definire vincoli di integrità referenziale fra: 1. INTERVENTI.Paziente e PAZIENTI.Codice 2. EQUIPE.Intervento e INTERVENTI.Codice 3. EQUIPE.Medico e MEDICI.Codice A. Trovare nome e cognome dei pazienti che hanno subito interventi in cui il dott. Kildare era Anestesista Algebra relazionale π Nome,Cognome (PAZIENTI Codice=Paziente π Paziente (INTERVENTI π InterventoσRuolo=’Anestesista’ (EQUIPE Codice=Intervento Medico=Codice σ Nome=’Kildare’(MEDICI)))) Calcolo su domini { Cognome: c, Nome: n | PAZIENTI(Codice: cp, Nome: n, Cognome: c, Indirizzo: i) ∧ INTERVENTI(Codice: ci, Paziente: cp, Data: d) ∧ EQUIPE(Intervento: ci, Medico m: e, Ruolo: r) ∧ MEDICI(Codice: m, Nome: nm) ∧ (nm = ‘Kildare’) ∧ (r=’Anestesista’) } Calcolo su tuple { p.(Nome, Cognome) | p(PAZIENTI), i(INTERVENTI), e(EQUIPE), m(MEDICI) | p.Codice = i.Paziente ∧ i.Codice = e.Intervento ∧ e.Medico = m.Codice ∧ m.Nome = ‘Kildare’ ∧ e.Ruolo = ‘Anestesista’ } B. Trovare i nomi dei medici che hanno partecipato a più di un intervento nello stesso giorno. Algebra relazionale EQUIPEINTERVENTI = π Intervento,Data,Medico (ρ Intervento←Codice(INTERVENTI) π Nome (ρ Medico←Codice (MEDICI) EQUIPE)) π Medico (σ¬(Intervento1=Intervento2) (ρ Intervento1←Intervento (EQUIPEINTERVENTI) ρ Intervento2←Intervento (EQUIPEINTERVENTI)))) Calcolo su domini { NomeMedico: n | MEDICI(Codice: cm, Nome: n) ∧ EQUIPE(Intervento: ci, Medico: cm, Ruolo: r) ∧ INTERVENTI(Codice:ci, Paziente: cp, Data: d) ∧ EQUIPE(Intervento: ci1, Medico: cm, Ruolo: r1) ∧ INTERVENTI(Codice: ci1, Paziente: cp1, Data: d) ∧ ¬(ci=ci1) } Calcolo su tuple { m.(Nome) | m(MEDICI), i(INTERVENTI), e(EQUIPE) | e.Medico = m.Codice ∧ i.Codice = e.Intervento ∧ ∃ i1(INTERVENTI) ∃ e1(EQUIPE) (e1.Medico = m.Codice ∧ i1.Codice = e1.Intervento ∧ i1.Data = i.Data ∧ ¬(i1.Codice=i.Codice)) } Si consideri il seguente schema di basi di dati che rappresenta le informazioni per la gestione di uno studio dentistico: PAZIENTI(Codice, Nome, Cognome, Indirizzo) MEDICAZIONI(Codice, Paziente, Data) TIPOMEDICAZIONE(Medicazione, Dente , Descrizione) TIPIDENTI(Codice, Nome) Occorre definire vincoli di integrità referenziale fra: 1. MEDICAZIONI.Paziente e PAZIENTI.Codice 2. TIPOMEDICAZIONE.Medicazione e MEDICAZIONI.Codice 3. TIPOMEDICAZIONE.Dente e TIPIDENTE.Codice A. Trovare nome e cognome dei pazienti a cui è stato otturato il molare M4S. Algebra relazionale π Nome,Cognome (PAZIENTI Codice=Paziente π Paziente (MEDICAZIONI π MedicazioneσDescrizione=’otturazione’ (TIPOMEDICAZIONE Codice=Medicazione Dente=Codice σ Nome=’M4S’(TIPIDENTE)))) Calcolo su domini { Cognome: c, Nome: n | PAZIENTI(Codice: cp, Nome: n, Cognome: c, Indirizzo: i) ∧ MEDICAZIONI(Codice: cm, Paziente: cp, Data: d) ∧ TIPOMEDICAZIONE(Medicazione: cm, Dente: cd, Descrizione: dsc) ∧ TIPIDENTI(Codice: cd, Nome: nd) ∧ (dsc = ‘otturazione’) ∧ (nd=’M4S’) } Calcolo su tuple { p.(Nome, Cognome) | p(PAZIENTI), m(MEDICAZIONI), tm(TIPOMEDICAZIONI), d(TIPIDENTI) | p.Codice = m.Paziente ∧ m.Codice = tm.Medicazione ∧ tm.Dente = d.Codice ∧ tm.Descrizione = ‘otturazione’ ∧ d.Nome = ‘molare’ } B. Trovare nome e cognome dei pazienti a cui è stato tolto più di un dente nello stesso giorno. Algebra relazionale ESTRAZIONI = π Dente,Paziente,Data (ρ Medicazione←Codice (MEDICAZIONI) σDescrizione=’estrazione’(TIPIMEDICAZIONE)) π Nome,Cognome (ρ Paziente←Codice (PAZIENTI) π Paziente σ¬(Dente1=Dente2)(ρDente1←Dente(ESTRAZIONI) ρ Dente2←Dente (ESTRAZIONI))) Calcolo su domini { Cognome: c, Nome: n | PAZIENTI(Codice: cp, Nome: n, Cognome: c, Indirizzo: i) ∧ MEDICAZIONI(Codice: cm1, Paziente: cp, Data: d) ∧ TIPOMEDICAZIONE(Medicazione: cm1, Dente: cd1, Descrizione: desc) ∧ MEDICAZIONI(Codice: cm2, Paziente: cp, Data: d) ∧ TIPOMEDICAZIONE(Medicazione: cm2, Dente: cd2, Descrizione: desc) ∧ (desc='estrazione') ∧ ¬(cd1=cd2) } Calcolo su tuple { p.(Nome,Cognome) | p(PAZIENTI), m(MEDICAZIONI), t(TIPOMEDICAZIONI) | p.Codice = m.Paziente ∧ m.Codice = t.medicazione ∧ t.Descrizione = 'estrazione' ∧ ∃ m1(MEDICAZIONI) ∃ t1(TIPOMEDICAZIONI) (p.Codice = m1.Paziente ∧ m1.Codice = t1.medicazione ∧ t1.Descrizione = 'estrazione' ∧ m1.Data = m.Data ∧ ¬(t1.Dente=t.Dente)) } Si consideri il seguente schema di basi di dati che rappresenta le informazioni per la gestione di un ambulatorio medico: PAZIENTI(Codice, Nome, Cognome, Indirizzo) VISITA(Codice, Paziente, Data) PRESCRIZIONE(Visita, Medicinale, Posologia) MEDICINALE(Codice, Nome) Occorre definire vincoli di integrità referenziale fra: 1. VISITA.Paziente e PAZIENTI.Codice 2. PRESCRIZIONE.Visita e VISITA.Codice 3. PRESCRIZIONE.Medicinale e MEDICINALE.Codice A. Trovare nome e cognome dei pazienti a cui sono stati prescritti più di 100mg di Cortisone. Algebra relazionale π Nome,Cognome (PAZIENTI Codice=Paziente π Paziente (VISITA πVisitaσPosologia>100 (PRESCRIZIONE Codice=Visita Medicinale=Codice σ Nome=’Cortisone’(MEDICINALE)))) Calcolo su domini { Cognome: c, Nome: n | PAZIENTI(Codice: cp, Nome: n, Cognome: c, Indirizzo: i) ∧ VISITA(Codice: cv, Paziente: cp, Data: d) ∧ PRESCRIZIONE(Visita: cv, Medicinale: cm, Posologia: p) ∧ MEDICINALE(Codice: cm, Nome: nm) ∧ (nm = ‘Cortisone’) ∧ (p>100) } Calcolo su tuple { p.(Nome, Cognome) | p(PAZIENTI), v(VISITA), pr(PRESCRIZIONE), m(MEDICINALE) | p.Codice = v.Paziente ∧ v.Codice = pr.Visita ∧ pr.Medicinale = m.Codice ∧ m.Nome = ‘Cortisone’ ∧ pr.Posologia > 100 } B. Trovare nome e cognome dei pazienti ai quali è stato prescritto lo stesso medicinale in almeno due visite diverse. Algebra relazionale VISITAPRESCRIZIONE = πVisita,Medicinale,Paziente (ρVisita←Codice(VISITA) PRESCRIZIONE) π Nome,Cognome (ρ Paziente←Codice (PAZIENTI) (ρVisita1←Visita (VISITAPRESCRIZIONE) π Paziente (σ¬(Visita1=Visita2) ρVisita2←Visita (VISITAPRESCRIZIONE)))) Calcolo su domini { Cognome: c, Nome: n | PAZIENTI(Codice: cp, Nome: n, Cognome: c, Indirizzo: i) ∧ VISITA(Codice: cv1, Paziente: cp, Data: d1) ∧ PRESCRIZIONE(Visita: cv, Medicinale: cm, Posologia: pos1) ∧ VISITA(Codice: cv2, Paziente: cp, Data: d2) ∧ PRESCRIZIONE(Visita: cv2, Medicinale: cm, Posologia: pos2) ∧ ¬(cv1=cv2) } Calcolo su tuple { p.(Nome,Cognome) | p(PAZIENTI), v1(VISITA), pr1(PRESCRIZIONE) | p.Codice = v1.Paziente ∧ v1.Codice = pr1.Visita ∧ ∃ v2(VISITA) ∃ pr2(PRESCRIZIONE) (p.Codice = v2.Paziente ∧ v2.Codice = pr2.Visita ∧ ¬(v2.Codice=v1.Codice) ∧ pr1.Medicinale = pr2.Medicinale }