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; |
|
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; |
|
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; |
|
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:]; |
|
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; |
|
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; |
|