Esercizio no.2:soluzione
Se consideriamo un'istantanea del sistema, un
utente può prendere in prestito un certo numero di libri, un altro
utente può prendere più di un libro fra quelli non scelti dal primo
utente. In questo caso si configura una relazione uno-molti fra
le due entità. Fra l'entità L (libro) e l'entità U (utente).
ma se pensiamo ad uno sviluppo nel tempo di questo servizio, il
secondo utente può prendere in prestito libri riconsegnati dal primo
utente. In questo caso il legame fra le due entità è di tipo molti-a-molti.
viene messa in evidenza la relazione P (prestito)
che in pratica attualizza nel tempo il legame fra le due entità.
Come ovvio essa diventerà una tabella a tutti gli effetti che conterrà
le chiavi esterne pertinenti alle tabelle Libro e Utente, inoltre
sarà dotata di campi Data per monitorare gli ingressi e le uscite
dei vari libri dalla biblioteca.
Si crea un file Access di nome arbitrario. La prima tabella creata
si chiama U (Utente).
idU |
Contatore chiave primaria
|
Cognome |
Testo |
nome |
Testo |
La Seconda tabella si chiama L (Libro).
idL |
Testo Chiave Primaria |
Titolo |
Testo |
Autore |
Testo |
La tabella principale verrà chiamata P (Prestito).
idP |
Contatore chiave primaria
|
xidU |
Numerico |
xidL |
Testo |
inizio |
data in cifre |
fine |
data in cifre |
In questa ultima tabella, si notano le due chiavi esterne xidU
ed xidL che devono essere di un formato di dati compatibile con
le chiavi primarie correlate.
Popoliamo le tabelle partendo da quelle dotate solo della chiave
primaria e compilando da ultimo solo quella contenente le chiavi
esterne; questo perchè non è possibile inserire dei
dati in una tabella secondaria ( che contenga chiavi esterne ) se
non esiste un record correlato nella tabella principale cui fanno
riferimento le chiavi esterne.
L |
|
|
idL |
Titolo |
Autore |
AQ123 |
Algoritms |
Sedgewitch |
BP482 |
Pascal |
Wirth |
DW834 |
Transistors |
Coppelli |
HT937 |
Microprocessori |
Carroll |
HY237 |
Diodi |
Stortoni |
TR827 |
Compilatori |
Ranieri |
dopo la tabella L dei libri, inseriamo i record per la tabella
U, degli utenti
U |
|
|
idU |
Cognome |
Nome |
1 |
Rossi |
Mario |
2 |
Verdi |
Andrea |
3 |
Bianchi |
Massimo |
4 |
Corrada |
Fabio |
5 |
Vallieri |
Sara |
6 |
Garavaglia |
Marco |
7 |
Esposito |
Marzia |
Infine la tabella P dei prestiti
P |
|
|
|
|
idP |
xidL |
xidU |
inizio |
fine |
1 |
DW834 |
6 |
12/12/2003 |
15/12/2003 |
2 |
AQ123 |
6 |
10/01/2004 |
12/01/2004 |
3 |
BP482 |
7 |
19/01/2004 |
21/01/2004 |
4 |
HY237 |
5 |
15/01/2004 |
22/01/2004 |
5 |
TR827 |
4 |
01/02/2004 |
03/02/2004 |
6 |
TR827 |
3 |
02/02/2004 |
03/02/2004 |
7 |
HY237 |
6 |
03/03/2004 |
18/03/2004 |
8 |
AQ123 |
1 |
01/04/2004 |
05/05/2004 |
9 |
BP482 |
2 |
02/04/2004 |
23/04/2004 |
10 |
DW834 |
3 |
10/04/2004 |
15/04/2004 |
11 |
HT937 |
4 |
18/04/2004 |
10/05/2004 |
12 |
TR827 |
6 |
05/05/2004 |
10/06/2004 |
13 |
AQ123 |
5 |
07/05/2004 |
09/06/2004 |
14 |
HY237 |
5 |
15/05/2004 |
|
15 |
BP482 |
3 |
16/05/2004 |
|
16 |
DW834 |
6 |
12/06/2004 |
|
17 |
TR827 |
5 |
18/06/2004 |
|
Lo schema logico è il seguente:
q1: Tutti i libri prestati a all'utente Vallieri in ordine
cronologico.
|
|
|
SELECT L.titolo,P.inizio,P.fine
FROM L,P,U
WHERE L.idL=P.xidL AND U.
idU=P.xidU AND U.cognome='vallieri'
ORDER BY P.inizio; |
titolo |
inizio |
fine
|
Diodi |
15/01/2004 |
22/01/2004
|
Algoritms |
07/05/2004 |
09/06/2004
|
Diodi |
15/05/2004 |
|
Compilatori |
18/06/2004 |
|
|
q2: Individua i primi tre lettori che hanno letto più libri.
|
|
|
SELECT TOP 3 U.cognome, COUNT(P.xidU)
AS TOT
FROM L, P, U
WHERE L.idL=P.xidL AND
U.idU=P.xidU
GROUP BY U.cognome
ORDER BY COUNT(P.xidU) DESC; |
cognome |
TOT |
Garavaglia |
5 |
Vallieri |
4 |
Bianchi |
3 |
|
q3: Individua tutti i possessori dei libri non ancora rientrati
e il titolo degli stessi.
|
|
|
SELECT P.idP, U.Cognome, L.Titolo
FROM L, U, P
WHERE L.idL=P.xidL AND
U.idU=P.xidU AND
P.fine Is Null; |
idP |
Cognome |
Titolo |
14 |
Vallieri |
Diodi |
15 |
Bianchi |
Pascal |
16 |
Garavaglia |
Transistors |
17 |
Vallieri |
Compilatori |
|
q4: Dare lo storico dei libri chiesi in prestito da un utente
indicando il periodo.
|
|
|
SELECT P.idP, P.inizio, P.fine, L.Titolo
FROM P, L, U
WHERE L.idL=P.xidL AND
U.idU=P.xidU AND
U.Cognome=[Cognome:]; |
idP |
inizio |
fine |
Titolo |
5 |
01/02/2004 |
03/02/2004 |
Compilatori |
11 |
18/04/2004 |
10/05/2004 |
Microprocessori |
|
q5: Fai la classifica dei libri maggiormente prestati.
|
|
|
SELECT L.titolo, Count(P.xidL) AS
TOT
FROM P,L
WHERE L.idL=P.xidL AND
P.xidL IS NOT NULL
GROUP BY L.titolo
HAVING Count(P.xidL)
ORDER BY Count(P.xidL) DESC;
|
titolo |
TOT |
Compilatori |
4 |
Transistors |
3 |
Pascal |
3 |
Diodi |
3 |
Algoritms |
3 |
Microprocessori |
1 |
|
q6: Individua prestiti la cui durata supera i 15gg.
|
|
|
SELECT P.idP, U.Cognome, L.Titolo
FROM P,L,U
WHERE L.idL=P.xidL AND
U.idU=P.xidU AND
DATEDIFF('d',P.inizio,P.fine)>15; |
idP |
Cognome |
Titolo |
8 |
Rossi |
Algoritms |
9 |
Verdi |
Pascal |
11 |
Corrada |
Microprocessori |
12 |
Garavaglia |
Compilatori |
13 |
Vallieri |
Algoritms |
|
|