Esercizio no.6:soluzione
I Professori (P) sono classificati per nome e per numero di telefono. Gli allievi (A) sono classificati per nome e per indirizzo di studio (liceo,ragioneria,meccanica..).
E' evidente una relazione n:n fra le due entità; un professore
può seguire più allievi ed ogni allievo può avere più professori.
Le regole di derivazione impongono la creazione di una terza tabella
che noi chiamiamo lezione (L) che come informazione aggiuntiva potrebbe
contenere la data della lezione effettuata.
Dobbiamo però considerare le specifiche del problema che prevedono dei costi differenziati a secondo del numero di ore di cui è costituita la lezione stessa.

Si può in questo caso utilizzare una struttura relazionale
ternaria.
Alla relazione L viene associata una terza entità Ore (O)
contenente il listino prezzi che caratterizza ogni singola
lezione prenotata
Si ottiene dunque il diagramma concettuale riportato sopra
e ne consegue i diagramma logico riportato a fianco.
CREATE TABLE P ( idp COUNTER PRIMARY KEY, nome CHAR(20), tel CHAR(12)); |
CREATE TABLE
A ( ida COUNTER PRIMARY KEY, nome CHAR(20), ist CHAR(12)); |
CREATE TABLE O ( ido INTEGER PRIMARY KEY, costo INTEGER); |
CREATE TABLE
L ( idl COUNTER PRIMARY KEY, data date, xidp INTEGER REFERENCES P(idp), xido INTEGER REFERENCES O(ido), xida INTEGER REFERENCES A(ida)); |
Con queste quattro query si ottiene il diagramma logico riportato
sopra; la query L va ovviamente eseguita per ultima. Possiamo testare
il db coi seguenti dati
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
q1:Elenca gli alunni seguiti da uno specifico insegnante in uno specifico giorno. ( nel nostro caso l'insegnante 'bianchi' il giorno 2 ) |
||||
SELECT A.nome FROM P, L, A WHERE P.idp=L.xidp AND A.ida=L.xida AND P.nome='bianchi' AND L.data=#01/02/01#; |
|
q2:Individua il nome e il tel. dei professori che devono seguire uno specifico alunno in un dato giorno ( nel nostro caso l'alunno Alpha il giorno 3) |
|||||||
SELECT P.nome, P.tel
FROM P, L, A WHERE P.idp=L.xidp AND A.ida=L.xida AND A.nome='alpha' AND L.data=#01/03/01#; |
|
q3:Calcola le ore eseguite dal uno specifico insegnante in totale ( nel nostro caso da Rossi ) |
|||
SELECT SUM(L.xido) AS
TOT FROM P, L WHERE P.idp=L.xidp AND P.nome='rossi'; |
|
q4:Calcola le ore e il compenso delle lezioni per uno specifico alunno in uno specifico giorno. ( nel nostro caso per l'alunno Gamma il giorno 3) |
|||||
SELECT SUM(L.xido) AS
ORE, SUM(O.costo) AS TOT FROM A, L, O WHERE A.idA=L.xidA AND O.ido=L.xido AND A.nome='gamma' AND L.data=#1/3/2001#; |
|