fratac ha scritto:
NON MODIFICARE LA STRUTTURA O LE RELAZIONI, altrimenti potresti corrompere per sempre il database.
Se fino ad ora ha "Funzionato" bisogna metterci delle pezze.
Per me deve essere una relazione molti a molti, visto che lo stesso esame può essere ripetuto infinite volte con infiniti voti.
ora tu hai un voto collegato ad infiniti corsi.
Forse mi sbaglio ma secondo me ora tu hai.
I numeri tra la parentesi indicato un ipotetico numero ID, che insieme creano una superchiave per ricavare il valore voto(valore atomico)
Primo esame
IDVotiAllievi(1)-- IDAllievoCorsi(1) Voto 17 (valore atomico): Bocciato
ripete l'esame, avrai di nuovo.
IDVotiAllievi(1)-- IDAllievoCorsi(1) Voto 30 (valore atomico): Promosso.
Considerando che la relazione tra votiallievi e allievicorsi è uno a molti con join sinistro (e quindi ricavi tutti i corsi, ma solo i voti allievi che sono uguali) se non mi sono sbagliato nel ragionamento, hai una super chiave identica per due voti diversi.
Fino a quando lo stato è bocciato o promosso il problema non sorge.
Quando invece ti ritrovi con due voti dello stesso studente sullo stesso corso, ti ritrovi nella condizione di avere la stessa chiave ed in teoria, la query riporta solo il primo valore che trova. Che è bocciato.
Quindi non è che il database funziona bene. E' la prima volta che ti sei accorto dell'errore.
Quindi, quale era la domanda iniziale che hai posto?
Il database funziona bene da anni, sicuramente per ogni funzione che svolge esistevano varie soluzioni e sicuramente ci saranno soluzioni migliori di quelle che ho adottato io, ma questo è un altro discorso.
Adesso mi è stato chiesto di implementare una nuova funzione, ovvero creare una lista di allievi che hanno delle pendenze (assenze o bocciature) su una determinata materia.
Purtroppo spiegare in poche righe un database abbastanza complesso non è semplice e alcune affermazioni che fai sono frutto, giustamente, della non conoscenza di tutta la struttura; infatti, ogni esame è univoco:
es. se io oggi vengo bocciato alla prima sessione dell'esame di storia (IDEsame 1), il mese prossimo dovrò ripetere l'esame di storia, ma sarà un esame diverso dal primo, avrà infatti un'altra data, sarà una seconsa sessione e non prima e ci parteciperanno altre persone (quelle bocciate in prima sessione) e quindi quell'esame avrà la stessa chiave esterna relativa alla materia (storia) ma una chiave primaria diversa (IDEsame 2).
Volendo ragionare per cicli, dovrei fare un "for" per ogni idallievo e ogni idcurricula (materia) e prendere chi ha un voto inferiore a 18 o è assente.
Non so se così è più chiaro.