Post on 05-Dec-2014
description
Apr 10, 2023
Osservazioni sul compitoLibreria Online
Silvano Natalizi
prova scritta di informatica
Sessione ordinaria 2007
seconda prova scritta
Testo della prova - 1
Testo della prova - 2
Testo della prova - 3
Esame dell’entità libro
Ci domandiamo: dobbiamo memorizzare ogni copia di un libro come riga di una tabella “CopiaLibro”? Oppure quando ci arriva una nuova copia dobbiamo solo aggiornare il numero di copie del libro a cui appartiene?
Questa domanda ce la dobbiamo porre in generale ogni qual volta si ha a che fare con un tipo di dati replicabile in molti esamplari.
Dobbiamo creare due entità o una sola entità ?
Entità esemplare
In generale dobbiamo creare un’entità quando riconosciamo che per ogni istanza di essa bisogna memorizzare due o più attributi.
Pertanto seguendo questo criterio generale: creiamo un’entità CopiaLibro se è necessario memorizzare, per ogni nuova copia di libro che arriva nella nostra libreria, i seguenti dati: numeroinventario, datacaricomagazzino, costo, fornitore,… collocazione scaffale coordinate per fare su di una pagina web una visualizzazione
virtuale corrispondente alla libreria fisica
Leggendo attentamente il testo del compito - 1
Sembra che non ci sia nessun dato attinente ad una copia specifica di un libroPertanto è sufficiente creare una sola entità Libro
Quando ci arriverà un nuovo titolo, faremo un inserimento di una nuova riga nella tabella Libro
Quando invece ci arriverà una nuova copia di un titolo già esistente nella tabella Libro, ci limiteremo ad aggiornare l’attributo “numeroCopie”
Leggendo attentamente il testo del compito - 2
Dove inseriamo queste informazioni ?
Data di archiviazione e Ultimi Arrivi
Uno degli attributi richiesti da memorizzare per ogni titolo di Libro, e quindi in ogni riga della tabella Libro, è dataArchiviazione.
Pertanto è facile sapere quali sono gli “Ultimi Arrivi” , basta fare una query (interrogazione) della tabella libro e selezionare solo i titoli la cui dati di archiviazione sia maggiore della data attuale – 30 giorni
Quindi l’attributo dataArchiviazione risolve il problema di conoscere gli “Ultimi Arrivi”
“Da non Perdere”, “Offerte speciali”, “Remainders”
Queste tre categorie di offerte di libri, secondo la specifica fornita dal testo del compito, dipendono tutte e tre dall’attributo sconto. sconto=20% “Da non Perdere” sconto=25% “Offerte Speciali” sconto=50% “Remainders”
Pertanto siamo in grado di conoscere l’eventuale offerte interrogando la tabella libri e selezionando l’attributo sconto. L’attributo sconto risolve il problema. Se è a zero vuol dire che quel libro non ha nessuna offerta.
“I più venduti”
Il testo dice che sono i titoli che hanno venduto il maggior numero di copie negli ultimi 30 giorni.
Da dove ricavo questa informazione ? Non dalla tabella Libro. A meno che inserisca in essa un attributo specifico. Non conviene La cosa ha a che fare con le vendite. Dove devo memorizzare le vendite dei libri ?
Leggendo attentamente il testo del compito - 3
Nella tabella DettaglioOrdine sono memorizzate le informazioni utili che mi servono per ricavare il maggior numero di copie vendute per ogni intervallo temporale, e quingi anche negli ultimi giorni
Infatti ho la data della vendita, la quantità di copie, e il riferimento articolo (la chiave esterna del libro)
“I più venduti” DettaglioOrdine
Pertanto per conoscere quali sono i libri più venduti e visualizzarli agli utenti, non è necessario inserire un nuovo attributo nella tabella Libro
Invece va fatta una opportuna query di aggregazione sulla tabella DettaglioOrdine, sommando il numero di copie vendute, raggruppando per titolo libro selezionando la data Ordinando in maniera decrescente sul campo somma
L’entità libro
L’entità Reparto
Relazione tra Reparto e Libro
Un reparto deve organizzare uno o più titoli di libri
Un titolo deve trovarsi in un solo reparto
Schema logico Libro e Reparto
È buona norma fare un pezzo di lavoro alla volta. Intanto deriviamo le tabelle Libro e Reparto
REPARTO(id, nome)
LIBRO(id, titolo, autore, prezzo, editore, numeroCopie,
annoPubblicazione, numeroPagine, immagineCopertina,
sconto, dataArchiviazione, reparto_id )
Proviamo la prima query richiesta dal testo
1. Ricerca per Reparto, scelto un reparto, il numero di libri “Da non perdere”
Proviamo la prima query - 2
Per fare la seconda parte della prima query, occorre anche la tabella ordini, nella quale ci sono i dati analitici delle vendite; dati che dobbiamo aggregare per sapere quali sono i libri “più venduti”
Pertanto dobbiamo continuare ad implementare lo schema concettuale e derivare lo schema logico
Gli ordini
Concentriamo la nostra attenzione sulla specifica del problema che riguarda gli ordini
Un ordine si riferisce ad un utente registratoUn ordine ha alcune righe di dettaglioCiascuna riga di dettaglio è collegata ad un prodotto, in questo caso un libro
Schema concettuale dell’ordine
Attributi di DettaglioOrdine
Gli altri attributi richiesti dal testo ( titolo, prezzo di copertina, riferimento articolo ) non li devo memorizzare nella tabella DettaglioOrdine perché già somo memorizzati nella tabella Libro e da questi sono conoscibili con la join.
evaso: vale 1 per gli ordini non ancora evasi, 2 per gli ordini evasi
Schema logico di Ordine
ORDINE(id, nome, utente_id, dataOrdine)
DettaglioOrdine(ordine_id, numeroRiga , quantità, giorniConsegna, evaso, libro_id)
Tuttavia conviene introdurre anche per DettaglioOrdine una chiave surrogata id primaria e trattare questa Entità come forte, ossia dotata di chiave primaria
DettaglioOrdine(id, ordine_id, numeroRiga, quantità, giorniConsegna, evaso, libro_id)
Ora completiamo la query 1, parte seconda
Query: Scelto un reparto, visualizzare il numero di libri “i più venduti” con i relativi dettagli.
Conviene suddividere la query in due fasi.
a) Creiamo una view, ogni riga della quale memorizza il numero di copie dei libri venduti negli ultimi 30 giorni
b) una seconda query che ordina la view in ordine decrescente nel numero delle copie vendute
Creazione della view venduti
La dichiarazione current_date<ordine.dataOrdine+30si pone come obiettivo quello di selezionare gli ordini con data inferiore a 30 giorni dalla data corrente.L’istruzione è solo di principio. Quella effettiva dipende da come è memorizzata la data nel campo dataOrdine.
Completamento della query
Ci limitiamo alla visualizzazione, per ogni reparto, dei primi 10 titoli più venduti.
The End