Di seguito vengono confrontate le Soluzioni proposte(Soluzioni del Corriere della Sera e Soluzione Alternativa) per la traccia del 2007 evidenziando eventuali modifiche che potrebbe essere apportate ma soprattutto le differenti interpretazioni date della traccia d'esame.
Per quanto riguarda la soluzione del Corriere della Sera... a parte che c'è un po' di confusione sui nomi assegnati alle tabelle nel diagramma E/R prenotazione → visita , visita → prestazione.... probabilmente dovuta alla fretta di pubblicare la soluzione il prima possibile,ci sono un paio di osservazioni da fare:
Nella soluzione del Corriere si interpreta la frase orario delle visite come un modo di dire che per ogni visita deve essere registrata anche l'ora(della prenotazione) e il tempo di durata previsto.
Nell'altra soluzione si interpreta la medesima frase come orari di ricevimento dei medici e tempo medio di visita per medico.
Prestazione: nella Soluzione del Corriere si fa l'ipotesi che una prestazione possa corrispondere a più visite. Il problema è che la durata media della prestazione non sembra corrispondere al tempo medio previsto per la visita a cui si fa riferimento nella traccia.
Per quanto riguarda il campo specializzazione va bene metterlo nella tabella Medico senza utilizzare una tabella a parte per uno Studio Medico dove lavorano in genere una decina di medici, la maggior parte dei quali, probabilmente, con specializzazioni diverse(la ridondanza in questo caso non comporterebbe un danno eccessivo)... a patto che ogni Medico abbia una sola specializzazione, ma ciò non è vero in generale(ne è stata avanzata alcuna ipotesi, al riguardo, nel testo della soluzione) per cui è necessario creare una tabella a parte e collegarla N:N con Medico come mostrato nella Soluzione Alternativa(che è la soluzione teoricamente più corretta se si vuole evitare ridondanza e rispettare la Prima Forma Normale(niente attributi composti e multipli) ).
Stesso discorso per Numero di Telefono... converrebbe mettere almeno un altro campo per il cellulare, ma anche così non sono sicuro che siano sufficienti: la possibilità di reperire il medico o il paziente è fondamentale e quindi sembra logico voler memorizzare più recapiti telefonici!
Per quanto riguarda l'indirizzo il discorso è meno pressante, tuttavia saper dove inviare una fattura potrebbe essere altrettanto importante nel caso in cui il paziente vada in vacanza o comunque non sia sempre reperibile ad un unico indirizzo(un discorso analogo vale per documenti da inviare al medico).
Nella tabella Paziente NumTessera andrebbe sostituito(per lo meno in Italia) con codice fiscale .
Vediamo l'implementazione:
1. quando le chiavi primarie non devono essere inserite manualmente(e questo è il caso dell' ID numerico per Medico,Paziente,Prestazione e Visita) dovrebbero essere specificati come auto_increment
2. quando si ha a che fare con le stringhe utilizzare varchar al posto di char per evitare di sprecare spazio a meno che non si tratti di campi di lunghezza fissa(esempio il codice fiscale)
3. data e ora sono registrati incampi separati anche se potrebbero essere riuniti in un unico campo DATETIME ma questo semplifica gli update perchè sarebbe più complicato modificare solo la data o l'ora (al riguardo vedi sul sito Esercizi sulle Date: c'è un esercizio, aggiunto di recente, che mostra proprio come si potrebbe eseguire un'operazione del genere)
4. Non sono specificati vincoli referenziali o per lo meno in MySQL InnoDB si lasciarebbe l'opzione di default ON DELETE RESTRICT ON UPDATE RESTRICT che va anche bene perchè qui le chiavi sono tutte id autoincrementanti, ma si potrebbe anche porre ON UPDATE CASCADE volendo.
5. Non sono specificati indici per accelerare la ricerca ad es. su nome e cognome paziente, a parte ovviamente quelli creati in automatico sulle chiavi esterne
Per quanto concerne la Soluzione alternativa invece...
1. Non c'è necessità di mettere Giorno(attributo derivabile) nella tabella Visita, il nome del giorno può essere ricavato sia attraverso apposite istruzioni in SQL, sia attraverso un opportuno script PHP lato server
2. L'attributo Tipo, nel modo in cui è utilizzato qui, potrebbe essere inserito nella specifica del titolo piuttosto che in riferimento al Medico e come codice numerico(piuttosto che una stringa) che permetta di classificare i titoli in varie tipologie come mostrato in Soluzione Prof. (es. 0 : titolo di laurea, 1 : specializzazione, 2 : altro, in effetti ci servirà un attributo Tipo anche nella tabella DatiAnagrafici ma inteso in maniera diversa)
3. L'attributo TempoMedio dovrebbe essere inserito in Visite in quanto sembra che la traccia lasci intendere che questo valore debba essere previsto relativamente ad ogni specifica visita. Il suo inserimento nella tabella Orari lascia perplessi, in quanto, tale valore risulterebbe essere fisso per Medico e soprattutto per giorno(es. lunedì solo visite “brevi”). In genere è il numero di visite che dovrebbe variare in base agli impegni del medico e all'orario di ricevimento e non il tempo impiegato nella visita!.
Adesso vediamo le query:
1) Il nodo da sciogliere è rappresentato dalla frase : “per ogni singolo medico”
Nel caso della Soluzione proposta dal Corriere la query è così interpretata: visualizza le visite di tutti i medici in un certa data.
L'ordinamento permette di raggruppare le visite in base al cognome del Medico.
Potrebbero esserci più persone con lo stesso cognome(ad es. per uno studio a conduzione familiare), ottenendo come risultato quello di mischiare le visite dei medici.
Quindi se devo ordinare mi conviene farlo anche in base alla chiave primaria, inoltre mi converrebbe stampare anche l'ora della visita e non solo il nome e cognome del paziente.
L'interpretazione più adeguata è probabilmente quella della Soluzione Alternativa che interpreta “per ogni singolo medico” come “per uno specifico medico”.
Nella Soluzione Alternativa però ci si è dimenticati di fare il join anche con Paziente per visualizzarne nome e cognome invece che la chiave primaria.
2)
Anche qui converrebbe visualizzare l'ora per distinguere gli appuntamenti saltati da quelli da effettuare ancora.3)
Per la terza query qui la traccia è veramente scritta male... anche qui le frasi “di ciascun medico” e“suddivisi per giorno e per ora” possono essere interpretate in vari modi.