Schema concettuale

enigmagame
Devo realizzare lo schema concettuale utilizzando il modello entità-relazione del seguente progetto.
Si vuole progettare un sistema informativo per gestire le informazioni relative alle attività di una clinica ospedaliera. Il sistema registra i ricoveri dei pazienti presso i reparti della clinica. Per ogni paziente memorizza: la regione di residenza (Veneto, Lombardia, Liguria, ecc...), il codice della tessera sanitari, che insieme alla regione identifica univocamente un paziente, il cognome, il nome, l'indirizzo e la città di residenza e la data di nascita. Il sistema memorizza la storia di tutti i ricoveri della clinica e quindi oltre al paziente e al reparto registra anche la dada di inizio e la data di fine ricovero. Per ogni reparto il sistema registra un codice univoco, il numero di posti letto, il primario e tutti i medici che vi lavorano. Per ogni medico si conosce il nome, il cognome e il numero di matricola.
Quando il paziente è ricoverato il sistema registra tutte le cure e gli esami a cui è sottoposto. Per ogni cura prescritta al paziente il sistema registra: il medico che l'ha prescrtitta, la data di inizio della cura, il medicinale, la quantità somministrata al giorno e la durata in giorni della cura. Per ogni esame si registra: un codice univoco, il medico che lo ha richiesto, la data della richiesta e il tipo di esame; quando l'esame viene eseguito il sistema registra la data di esecuzione, il medico che ha eseguiro l'esame e il risultato dell'esame. Se si tratta di un esame di laboratorio (ad esempio esame del sangue o esame istologico) viene registrato come risultato il valore misurato, mentre se si tratta di un esame radiografico o ecografico viene registrato il nome del file contenente le immagini e il referto del medico che ha esaminato le stesse. Infine per gli interventi chirurgici a cui il paziente viene sottoposto, si registra la data dell'intervento, il chirurgo che ha eseguito l'intervento e il tipo di intervento.

Ad una primissima realizzazione supponiamo che lo schema ER possa essere questo:
http://img407.imageshack.us/my.php?image=eran6.jpg

Mancano molte cose, tra cui il nome di alcune relazioni, cardinalità ecc...
Ma ecco alcuni dubbi:
1) Io aggiungerei un entità medico, da collegare al reparto con una relazione e da collegare con altre tre relazioni alle entità cura, esame e intervento.
2) Le entità cura, esame, intervento vanno bene cosi collegate all'entità paziente.
3) Vostri consgili modifiche ecc...

Grazie :-D!!

Risposte
Marvin1
Ciao Andre,ho visto il tuo schema di frettissima, ti rispondo velocemente riguardo una delle tue domande:

è giusto fare l'entità Medico in quanto vengono elencati alcuni attributi (Nome, Cognome, Matricola): generalemente una regola per capire se è necessario
creare o meno una entità è capire se ha degli attributi, in tal caso risulta evidente la risposta.

se il medico fosse coinvolto solo in una tabella e se non fossero elencati gli attributi allora il medico sarebbe a sua volta un attributo ad una tabella o ad una relazione.

a presto,
Marvin

codino75
per la tua 2) domanda:
mi sembra che alcuni attributi che tu hai riferito alle entita' CURA, ESAME, INTERVENTO si debbano piuttosto riferire alla RELAZIONE esistente tra la entita' (CURA, ESAME od INTERVENTO) e l'entita' PAZIENTE.
se dubbi posta ciao

Giova411
Ciao secondo me l'hai fatto benino.
Aggiungerei l'entità MEDICO

Cmq ti consiglio di vedere:
http://www.star.dist.unige.it/~enrico/B ... 8-5_07.pdf
il penultimo esercizio svolto è simile al tuo. Puoi farti un'idea in base alle richieste e alla soluzione proposta.

Cmq in questa pagina trovi molti esercizi svolti che ti possono essere utilissimi:
http://www.star.dist.unige.it/~enrico/B ... /Esercizi/

Premesso che si sappiano fare questi schemi concettuali, un'altra cosa volevo dirti:
gli schemi entità relazione è importantissimo saperli fare e credo che tu li sappia fare, ma è anche vero che è difficile trovare degli errori grossolani (se non solo durante l'utilizzo del DB).
Nella progettazione, un po' come con l'UML, nessuno mai ti potrà dire che è totalmente sbagliato (ricorda la premessa) ma potrà trovare dei difetti e delle parti "migliorabili"

enigmagame
Grazie a tutti...
Come già detto sono daccordo per aggiungere l'entità medico, da mettere in relazione con l'entità reparto.
Ora vi chiedo questa cosa, secondo voi oltre a relazionare paziente con cura, esame e intervento, è corretto relazionare anche medico con queste entità?
Mi spiego meglio, potrei avere cura con un attributo medico_richiedente oppure collegarlo all'entià medico; potrei avere esame con due attributi medico_richiedente e medico esecutore, oppure collegare questa con due relazioni all'entità medico e cosi anche per intervento.
Voi che dite è meglio tenere solo l'attributo o creare tutte queste nuove relazioni (un pò tante)!

mi sembra che alcuni attributi che tu hai riferito alle entita' CURA, ESAME, INTERVENTO si debbano piuttosto riferire alla RELAZIONE esistente tra la entita' (CURA, ESAME od INTERVENTO) e l'entita' PAZIENTE.

Hai ragione... e credo che tu stia parlando delle date o sbaglio? Ad esempio data_inizio in cura, oppure data_richiesta e data_esecuzuione in esame?

Grazie ancora...
Ciao!

codino75
"enigmagame":


mi sembra che alcuni attributi che tu hai riferito alle entita' CURA, ESAME, INTERVENTO si debbano piuttosto riferire alla RELAZIONE esistente tra la entita' (CURA, ESAME od INTERVENTO) e l'entita' PAZIENTE.

Hai ragione... e credo che tu stia parlando delle date o sbaglio? Ad esempio data_inizio in cura, oppure data_richiesta e data_esecuzuione in esame?

Grazie ancora...
Ciao!


ripensandoci, se un tipo di cura (o esame o intervento) non possiede informazioni generali comuni a tutti i pazienti che la effettuano, il tuo schema puo' andare bene, ma io pensavo, forse sbagliando, che alcune informazioni sul tipo di cura (o esame o intervento) possono essere comuni a tutti i pazienti (es.nome della cura etc) mentre altre variano da paziente a paziente.

Giova411
"enigmagame":

Mi spiego meglio, potrei avere cura con un attributo medico_richiedente oppure collegarlo all'entià medico; potrei avere esame con due attributi medico_richiedente e medico esecutore, oppure collegare questa con due relazioni all'entità medico e cosi anche per intervento.

Sì, potresti provare anche così.
Dipende da come si interpreta il testo e, di schemi, ne puoi trovare diversi. :wink:

enigmagame
Ok grazie mille a tutti, comunque è vero, di schema concettuale non ne esiste uno dipende...
Ora vorrei postare un paio di query sql per vedere cosa ho combinato :lol: !

Dato il seguente schema relazionale (chiavi primarie sottolineate) contenente i dati delle auto noleggiate da una agenzia presso l'areoporto di Verona:
AUTO(Targa,Marca,Modello,Posti,Cilindrata);
NOLEGGIO(Targa,Cliente,DataInizio,DataFine*);
CLIENTE(NPatente,Cognome,Nome,Provenienza,#Infrazioni);
Vincoli di intergrità: NOLEGGIO.Targa -> AUTO; NOLEGGIO.Cliente -> CLIENTE
Formulare in SQL le seguenti interrogazioni (definire viste solo dove è necessario):
a) Trovare le auto che non sono mai state noleggiate da clienti provenienti da Londra.
b) Trovare il cliente che ha ottenuto il maggior numero di infrazioni nell'anno 2005, riportando il cognome e il nome del cliente.

Allora...
a)
SELECT a.Targa
FROM AUTO a JOIN NOLEGGIO n ON a.Targa = n.Targa JOIN CLIENTE c on n.Cliente = c.NPatente
WHERE c.Provenienza <> 'Londra'


b)
CREATE VIEW NOLEGGIO05(Targa,Cliente) AS
SELECT Targa, Cliente
FROM NOLEGGIO
WHERE DataInizio > 01/01/2005 AND DataInizio < 31/12/2005 AND DataFine > 01/01/2005 AND DataFine < 31/12/2005

SELECT Cognome, Nome
FROM CLIENTE
WHERE NPatente = (SELECT MAX(Infrazioni)
                              FROM CLIENTE
                              WHERE NPatente = (SELECT NPatente
                                                FROM NOLEGGIO05
                                               )
                              )


Che dite, un macello? Sono molto incerto sulla seconda, prima di tutto sol controllo delle date...
Grazie!

codino75
osservazioni per la prima query:
* non vengono trovate le auto CHE NON SIANO STATE MAI NOLEGGIATE (se queste ultime debbano o meno essere trovate ovviamente dipende da come si interpreta il quesito; io senza sapere ne' leggere ne' scrivere ce le metterei)
* puoi ottenere lo stesso risultato (senza pero poter trovare le auto 'mai noleggiate' che dicevo prima) senza fare il join con auto, se ti serve solo la targa dell'auto.

codino75
per la seconda query:
sembrerebbe che dalle tabelle non sia possibile rispondere alla query, in quanto il campo #infrazioni si trova nel record CLIENTE e cumula (credo) tutte le infrazioni (cioe' fatte in qualsiasi anno ) del cliente.

enigmagame
Allora...

* non vengono trovate le auto CHE NON SIANO STATE MAI NOLEGGIATE (se queste ultime debbano o meno essere trovate ovviamente dipende da come si interpreta il quesito; io senza sapere ne' leggere ne' scrivere ce le metterei)

Hai ragione, dipende da come si interpreta il quesito... Se dovessi decidere di includere le auto che non sono MAI state noleggiate dovrei utilizzare un join esterno no? (LEFT JOIN)


* non vengono trovate le auto CHE NON SIANO STATE MAI NOLEGGIATE (se queste ultime debbano o meno essere trovate ovviamente dipende da come si interpreta il quesito; io senza sapere ne' leggere ne' scrivere ce le metterei)

Vero, se non è necessario presentare altri dati nel risultato (marca, modello, ecc.) il join con la tabella AUTO è superfluo.


sembrerebbe che dalle tabelle non sia possibile rispondere alla query, in quanto il campo #infrazioni si trova nel record CLIENTE e cumula (credo) tutte le infrazioni (cioe' fatte in qualsiasi anno ) del cliente.

Anche qui ciò che dici è vero, il fatto è che viene da un testo d'esame e non capisco... Comunue la query è corretta secondo te? Tralasciando il fatto che il risultato non e' corretto...

codino75
allora...
* non so (e non ho abbastanza tempo) per dirti come si farebbe la prima query per trovare anche le auto 'mai noleggiate'; tuttavia, se posti una soluzione, forse posso cercare di capire se puo' essere giusta.

*la seconda query, come la hai svolta , mi pare trovi nome e cognome dei clienti, tra quelli che hanno noleggiato almeno una volta un'auto nel 2005, che abbiano il max numero di infrazioni.
-in questo senso mi sembra corretta.
-un suggerimento: riporta anche il num.patente, in quanto 2 persone potrebbero avere lo stesso nome (e' sempre preferibile portarsi dietro la chiave); cio' , secondo me, vale anche se nel testo non e' esplicitamente richiesto ma , richiedendo di riportare il cliente, ovviamente cio' si puo' fare correttamente solo riportando anche la chiave di CLIENTE.
-il controllo sulle date in generale va bene, in quanto tu consideri che il noleggio deve iniziare e finire nel 2005, mentre non vale uno che inizi nel 2005 e termini nel 2006 (o viceversa). questa e' una tua scelta e mi sembra ragionevole. il controllo sarebbe potuto limitarsi a:
data_inizio>=1/1/05 and data_fine<=31/12/05 in quanto sicuramente il database, per essere coerente, non puo' prevedere per un noleggio , che la data di fine sia anteriore a quella di inizio, tuttavia va bene anche come lo hai scritto tu.

enigmagame
Ciao ragazzi, rileggendo questo post ho notato che le query SQL non sono corrette. Rivediamo il testo.
1) Trovare le auto che non sono mai state noleggiate da clienti provenienti da Londra. La versione corretta dovrebbe essere questa:
SELECT *
FROM AUTO
WHERE Targa NOT IN (SELECT n.Targa
                    FROM NOLEGGIO n JOIN CLIENTE c ON n.Cliente = c.NPatente
                    WHERE c.Provenienza = 'Londra')


2) Trovare il cliente che ha ottenuto il maggior numero di infrazioni nell'anno 2005, riportando il cognome e il nome del cliente. Messa giù come nei precedenti post non restituisce nulla. Questa dovrebbe essere corretta:
SELECT NPatente, Cognome, Nome
FROM CLIENTE
WHERE Infrazioni IN (SELECT MAX(c.Infrazioni)
                     FROM CLIENTE c JOIN NOLEGGIO n ON c.NPatente = n.Cliente
                     WHERE n.DataInizio >= '20050101' AND n.DataFine <= '20051230')


Volevo chiarire un unlteriore cosa, nel testo è sempre scritto "definire viste solo dove è necessario". Ovvero si devono usare viste solo se non è possibile in nessun altro modo arrivare al risultato...
Ciao!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.