es1-progetto.

Transcript

es1-progetto.
1. Analisi dei requisiti
1a. Requisiti espressi in linguaggio naturale
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Si vuole realizzare una base di dati per la gestione di una biblioteca di medie dimensioni. La base di dati sarà
rivolta al personale delle biblioteca, in modo da facilitare e velocizzare le comuni operazioni di gestione dei
prestiti e rendere più immediata la loro visualizzazione. La base di dati quindi conterrà tutte le informazioni
riguardanti i volumi gestiti dalla biblioteca, gli utenti e i prestiti.
I volumi sono divisi in due categorie: libri e manuali. Questi a sua volta si possono dividere in due
sottocategorie: i libri, in quelli di narrativa e quelli di saggistica; mentre i manuali, in dizionari e tutti gli altri
tipi che non rientrano nei dizionari.
La biblioteca gestisce solo libri e manuali (niente riviste, giornali o altro), di ognuno dei quali vogliamo poter
conoscere il codice (che deve essere univoco), il titolo, l’edizione, la lingua in cui è scritto (o le due lingue nel
caso del dizionario), gli autori, l’editore e l’anno di pubblicazione. Inoltre deve essere possibile risalire ad
altri eventuali volumi che sono citati da quest’ultimo.
Di ogni volume possono esistere più copie identiche, queste avranno lo stesso codice del volume, ma
dovranno essere dotate di un codice della copia che le differenzia dalle altre riproduzioni. I codici della copia
potranno essere simili per volumi diversi.
Di ciascuna casa editrice registrata nel nostro archivio, vogliamo conoscere la denominazione e la città di
appartenenza. Di ciascun scrittore, invece, desideriamo conoscere i dati anagrafici: nome, cognome, data di
nascita e, se è deceduto, la data della morte (che potrebbe essere anche sconosciuta).
I volumi della biblioteca sono catalogati in modo da poterli ricercare facilmente: ad ogni libro di narrativa
dovrà essere associato un genere (es. giallo, horror, avventura, ...), mentre ad ogni libro di saggistica, o
manuale che non sia un dizionario, dovrà essere associata una materia (es. informatica, elettronica, chimica,
...).
Un volume potrà far parte di una particolare collana ed in tal caso vogliamo poter risalire al numero che il
volume occupa al suo interno.
L’indicazione della collocazione di ogni testo è suddivisa in tre parti: numero della sezione, numero dello
scaffale e numero di registrazione. Se di un volume esistono più copie, queste saranno poste fisicamente una
di fianco all’altra.
Gli utenti della biblioteca sono registrati in base ai dati anagrafici (nome, cognome, indirizzo, numero di
telefono). A ciascuno di loro, inoltre, è associato un numero di tessera.
A seguito di una richiesta, viene dapprima verificata la presenza di almeno una copia del volume, e se questo
è disponibile si procede con il prestito.
Quando un cliente ottiene un volume in prestito, la base di dati registra la data di inizio del prestito, il volume
prelevato e i dati dell’utente che lo ha preso. Quando il libro viene riconsegnato, la base di dati completa le
informazioni sul prestito inserendo anche la data di riconsegna. Ad ogni volume è associata una durata
massima del prestito. Se un utente riconsegna un volume in ritardo, riceve un avviso, se arriva a dieci avvisi
la sua scheda viene bloccata e riceve una multa. Gli avvisi dovranno essere cumulativi.
Le operazioni più importanti previste sulla base di dati sono:
1- Ricerca di tutti i volumi attualmente in possesso di un utente, restituendo il codice del volume, il codice
della copia e il titolo;
Frequenza stimata: 5 volte al giorno
2- Verifica del numero di volumi riconsegnati in ritardo da un utente;
Frequenza stimata: 2 volte al giorno
3- Inserimento di un nuovo libro di narrativa con autori ed editore che non sono presenti nella base di dati,
associato ad un genere ed a una collana già presenti nell’archivio;
Frequenza stimata: 2 volte alla settimana
4- Trova la collocazione di un volume catalogato come “libro”, partendo dal codice del volume e
visualizzando, oltre alla posizione, il titolo, la lingua, l’edizione, l’editore e il nome e cognome dell’autore;
Frequenza stimata: 120 volte al giorno
5- Ricerca tutti i volumi citati da un altro volume restituendone il titolo, l’edizione e il nome e cognome
dell’autore;
Frequenza stimata: 20 volte al giorno
6- Ricerca tutti i volumi scritti da un autore visualizzando il codice del volume, il titolo, l’edizione, l’editore e
l’anno di pubblicazione;
Frequenza stimata: 80 volte al giorno
7- Cancellazione di un autore che non si riferisce a nessun volume;
Frequenza stimata: 1 volta al mese
8- Ricerca di tutti i volumi appartenenti a un genere (solo per libri di narrativa);
Frequenza stimata: 40 volte al giorno
9- Registrazione di un nuovo prestito (si dovrà prima vedere se c’è almeno una copia disponibile del volume
e se la tessera non è bloccata);
Frequenza stimata: 100 volte al giorno
10- Registrazione dell’avvenuta riconsegna di un volume (fine del prestito);
Frequenza stimata: 100 volte al giorno
11- Ricerca di tutte le copie di tutti i volumi in prestito visualizzando oltre ai codici anche il titolo e
l’edizione (considerando che in media ce ne sono 500 alla settimana);
Frequenza stimata: 1 volta alla settimana
12- Invio multa e blocco della tessera per tutti gli utenti che hanno raggiunto dieci o più avvisi (considerando
che mediamente ce ne sono due alla settimana).
Frequenza stimata: 3 volte alla settimana
1b. Glossario dei termini
Termine
Volume
Libro
Manuale
Libro di narrativa
Libro di saggistica
Dizionario
Altro manuale
Editore
Autore
Genere
Materia
Collana
Utente
Descrizione
Sinonimi
Materiale cartaceo gestito dalla
Testo
biblioteca. Può essere un libro o un
manuale
Particolare categoria di volume. Può essere di narrativa o saggistica
Particolare categoria di volume. Può
essere un dizionario o un qualunque
altro tipo di manuale
Particolare categoria di libro e sottocategoria di volume
Particolare categoria di libro e sottocategoria di volume
Particolare categoria di manuale e
sotto-categoria di volume
Particolare categoria di manuale e
sotto-categoria di volume
Colui che ha pubblicato il volume
-
Collegamenti
Editore, autore, collana
Volume, libro di
saggistica e libro di
narrativa
Volume, dizionario e
altro manuale
-
Libro e genere
-
Libro e materia
-
Manuale
-
Manuale e materia
Casa
editrice
Scrittore
Colui che ha scritto un volume
Es. giallo, horror, avventura,ecc.
E’ associato ad ogni libro di narrativa
Es. informatica, chimica, meccanica, ecc. E’ associata ad ogni libro di
saggistica e ad ogni manuale che non
sia un dizionario
Raccolta di volumi aventi tra loro una certa analogia
Colui che prende in prestito dei volumi Cliente
dalla biblioteca
Volume
Volume
Libro di narrativa
Libro di saggistica e altro
manuale
Volume
Volume
1c. Rilevamento delle ambiguità e correzioni proposte
2
Nel testo sono presenti diversi casi di ambiguità, procurati la maggior parte da sinonimi, che devono essere chiariti.
Linea
9
13
15
16
22
24
25
31
32
35
Termine
Nuovo termine
Ragione della correzione
Codice
Riproduzioni
Casa editrice
Scrittore
Numero
Testo
Numero di registrazione
Cliente
Libro
Scheda
Codice del volume
Copie
Editore
Autore
Numero d’ordine
Volume
Codice del volume
Utente
Volume
Tessera
Codice volume è più specifico
Sinonimo per riproduzione in linea 12
Sinonimo per casa editrice in linea 10
Sinonimo per scrittore in linea 10
Numero d’ordine è più specifico
Sinonimo per testo in linea 4
Codice del volume è più specifico
Sinonimo per cliente in linea 4
Libro è troppo specifico
Sinonimo per scheda in linea 28
1d. Requisiti in linguaggio naturale con correzione ambiguità
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Si vuole realizzare una base di dati per la gestione di una biblioteca di medie dimensioni. La base di dati sarà
rivolta al personale delle biblioteca, in modo da facilitare e velocizzare le comuni operazioni di gestione dei
prestiti e rendere più immediata la loro visualizzazione. La base di dati quindi conterrà tutte le informazioni
riguardanti i volumi gestiti dalla biblioteca, gli utenti e i prestiti.
I volumi sono divisi in due categorie: libri e manuali. Questi a sua volta si possono dividere in due
sottocategorie: i libri, in quelli di narrativa e quelli di saggistica; mentre i manuali, in dizionari e tutti gli altri
tipi che non rientrano nei dizionari.
La biblioteca gestisce solo libri e manuali (niente riviste, giornali o altro), di ognuno dei quali vogliamo poter
conoscere il codice del volume (che deve essere univoco), il titolo, l’edizione, la lingua in cui è scritto (o le
due lingue nel caso del dizionario), gli autori, l’editore e l’anno di pubblicazione. Inoltre deve essere possibile
risalire ad altri eventuali volumi che sono citati da quest’ultimo.
Di ogni volume possono esistere più copie identiche, queste avranno lo stesso codice del volume, ma
dovranno essere dotate di un codice della copia che le differenzia dalle altre copie. I codici della copia
potranno essere simili per volumi diversi.
Di ciascun editore registrato nel nostro archivio, vogliamo conoscere la denominazione e la città di
appartenenza. Di ciascun autore, invece, desideriamo conoscere i dati anagrafici: nome, cognome, data di
nascita e, se è deceduto, la data della morte (che potrebbe essere anche sconosciuta).
I volumi della biblioteca sono catalogati in modo da poterli ricercare facilmente: ad ogni libro di narrativa
dovrà essere associato un genere (es. giallo, horror, avventura, ...), mentre ad ogni libro di saggistica, o
manuale che non sia un dizionario, dovrà essere associata una materia (es. informatica, elettronica, chimica,
...).
Un volume potrà far parte di una particolare collana ed in tal caso vogliamo poter risalire al numero d’ordine
che il volume occupa al suo interno.
L’indicazione della collocazione di ogni volume è suddivisa in tre parti: numero della sezione, numero dello
scaffale e codice del volume. Se di un volume esistono più copie, queste saranno poste fisicamente una di
fianco all’altra.
Gli utenti della biblioteca sono registrati in base ai dati anagrafici (nome, cognome, indirizzo, numero di
telefono). A ciascuno di loro, inoltre, è associato un numero di tessera.
A seguito di una richiesta, viene dapprima verificata la presenza di almeno una copia del volume, e se questo
è disponibile si procede con il prestito.
Quando un utente ottiene un volume in prestito, la base di dati registra la data di inizio del prestito, il volume
prelevato e i dati dell’utente che lo ha preso. Quando il volume viene riconsegnato, la base di dati completa le
informazioni sul prestito inserendo anche la data di riconsegna. Ad ogni volume è associata una durata
massima del prestito. Se un utente riconsegna un volume in ritardo, riceve un avviso, se arriva a dieci avvisi
la sua tessera viene bloccata e riceve una multa. Gli avvisi dovranno essere cumulativi.
1e. Filtraggio dei concetti fondamentali
3
¾ Frasi di carattere generale
Si vuole realizzare una base di dati per la gestione di una biblioteca di medie dimensioni. La base di dati sarà
rivolta al personale delle biblioteca, in modo da facilitare e velocizzare le comuni operazioni di gestione dei prestiti
e rendere più immediata la loro visualizzazione. La base di dati quindi conterrà tutte le informazioni riguardanti i
volumi gestiti dalla biblioteca, gli utenti e i prestiti.
¾ Frasi relative a volume
I volumi sono divisi in due categorie: libri e manuali. Di ogni volume vogliamo poter conoscere il codice del
volume (che deve essere univoco), il titolo, l’edizione, la lingua in cui è scritto (o le due lingue nel caso del
dizionario), gli autori, l’editore e l’anno di pubblicazione. Inoltre deve essere possibile risalire ad altri eventuali
volumi che sono citati da quest’ultimo.
¾ Frasi relative alle copie del volume
Di ogni volume possono esistere più copie identiche, queste avranno lo stesso codice del volume, ma dovranno
essere dotate di un codice della copia che le differenzia dalle altre copie. I codici della copia potranno essere simili
per volumi diversi.
¾ Frasi relative a libri e manuali
Si possono dividere in due sottocategorie: i libri, in quelli di narrativa e quelli di saggistica; mentre i manuali, in
dizionari e tutti gli altri tipi che non rientrano nei dizionari.
Ad ogni libro di narrativa dovrà essere associato un genere (es. giallo, horror, avventura, ...), mentre ad ogni libro
di saggistica, o manuale che non sia un dizionario, dovrà essere associata una materia (es. informatica, elettronica,
chimica, ...).
¾ Frasi relative all’editore
Di ciascun editore registrato nel nostro archivio, vogliamo conoscere la denominazione e la città di appartenenza.
¾ Frasi relative all’autore
Di ciascun autore desideriamo conoscere i dati anagrafici: nome, cognome, data di nascita e, se è deceduto, la data
della morte (che potrebbe essere anche sconosciuta).
¾ Frasi relative alla collana
Un volume potrà far parte di una particolare collana ed in tal caso vogliamo poter risalire al numero d’ordine che il
volume occupa al suo interno.
¾ Frasi relative alla posizione del volume
L’indicazione della collocazione di ogni volume è suddivisa in tre parti: numero della sezione, numero dello
scaffale e codice del volume. Se di un volume esistono più copie, queste saranno poste fisicamente una di fianco
all’altra.
¾ Frasi relative agli utenti
Gli utenti della biblioteca sono registrati in base ai dati anagrafici (nome, cognome, indirizzo, numero di telefono).
A ciascuno di loro, inoltre, è associato un numero di tessera.
¾ Frasi relative al prestito
A seguito di una richiesta, viene dapprima verificata la presenza di almeno una copia del volume, e se questo è
disponibile si procede con il prestito.
Quando un utente ottiene un volume in prestito, la base di dati registra la data di inizio del prestito, il volume
prelevato e i dati dell’utente che lo ha preso. Quando il volume viene riconsegnato, la base di dati completa le
informazioni sul prestito inserendo anche la data di riconsegna. Ad ogni volume è associata una durata massima
del prestito. Se un utente riconsegna un volume in ritardo, riceve un avviso, se arriva a dieci avvisi la sua tessera
viene bloccata e riceve una multa. Gli avvisi dovranno essere cumulativi.
2. Progettazione concettuale
4
2a. Strategia di progetto
Come strategia di progetto è stata scelta la strategia mista.
Si può introdurre inizialmente uno schema scheletro composto dalle entità UTENTE, VOLUME e PRESTITO che
sono i concetti principali di questa applicazione, e poi approfondire tutti gli altri concetti procedendo in maniera
inside-out. Infine ci sarà un passo d’integrazione per ottenere lo schema concettuale finale.
2b. Schema scheletro
Come già detto i concetti fondamentali che emergono in una prima analisi delle specifiche sono: VOLUME,
UTENTE e PRESTITO. Questi possono essere rappresentati considerando utente e volume come entità, e prestito
come un’associazione che li collega:
VOLUME
UTENTE
PRESTITO
Un’altra soluzione poteva essere quella di rappresentare i tre concetti tutti come entità, ma la prima scelta è da
preferire perché rende più evidente la relazione che lega utente e volume quando avviene un prestito.
2c. Schemi concettuali parziali (procedendo in maniera inside-out)
Con riferimento allo schema sopra possiamo a questo punto decidere di analizzare separatamente le due entità.
Utente:
Questa entità dovrà possedere i seguenti attributi: Nome, Cognome, Data_nascita, Indirizzo e Numero_telefonico
(supponiamo quest’ultimo unico e quindi con una cardinalità 1,1). Questi saranno considerati come un attributo
composto chiamato Dati anagrafici. Lo stesso attributo Indirizzo sarà un attributo composto, i cui attributi semplici
saranno: Città, Via, Numero_civico e CAP.
Occorrerà inoltre aggiungere un attributo #Tessera che identifica un certo cliente in modo univoco ed altri tre
attributi che hanno a che fare con i prestiti scaduti: Tot_avvisi, il numero totale degli avvisi ricevuti, che saranno
cumulativi e faranno scattare sanzioni non appena arrivano a dieci; Multa, indica se ad un utente è stata inviata
oppure no una multa; Tessera_bloccata, è lo stato della tessera (attiva o bloccata), una volta bloccata la tessera, ad
un utente viene impedito di prelevare ulteriori libri.
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
UTENTE
Dati anagrafici
Data_nascita
Città
Via
Indirizzo
Numero_civico
Numero_telefonico
CAP
Volume:
5
Innanzi tutto si dovranno inserire gli attributi nell’entità VOLUME, che sono: Codice_volume, identifica
univocamente ogni volume, Titolo, #Edizione e Durata_max_prestito, specifica la durata massima (in giorni) del
prestito per ogni volume.
A questo punto possiamo notare dalle specifiche, che ogni volume può citare altri volumi, perciò inseriamo
un’associazione CITAZIONE che è di tipo ricorsivo (collega l’entità volume a se stessa). Verranno inseriti due
identificatori (CITA A e CITATO DA) che specificano il ruolo dell’associazione nei due sensi di lettura. Le
cardinalità saranno entrambe (0, N), perché ogni volume può citare o essere citato da 0 ad n volumi.
CITA A
(0, N)
Codice_volume
Titolo
#Edizione
Durata_max_prestito
CITAZIONI
VOLUME
(0, N)
CITATO DA
Tra i volumi si individuano due categorie: i libri e i manuali. Questi concetti sono rappresentabili come entità
LIBRO e MANUALE, figlie dell’entità VOLUME: la generalizzazione che ne risulta è totale.
A sua volte le entità figlie si dividono in due sotto-categorie: i libri, in NARRATIVA e SAGGISTICA, e i manuali,
in DIZIONARIO e ALTRO (manuali che non sono dizionari). Queste verranno rappresentate come altre due
generalizzazioni totali.
Nelle specifiche viene richiesto di tenere conto anche della lingua con cui un volume è stato scritto; non è possibile
però inserire un attributo lingua in volume, perché, a causa della gerarchia, diventerebbe un attributo anche
dell’entità DIZIONARIO. Questa infatti dovrà averne due di attributi: Prima_lingua e Seconda_lingua, in modo da
riportare entrambe le lingue della traduzione. L’attributo Seconda_lingua avrà cardinalità (0, 1), perchè può
assumere il valore NULL nel caso in cui il volume è, ad esempio, un dizionario dei sinonimi.
L’attributo lingua sarà necessario a questo punto nelle entità LIBRO e ALTRO.
Possiamo notare dalle specifiche che i libri di narrativa sono associati ad un genere, mentre quelli di saggistica e gli
“altri manuali” sono associati ad una materia. Per questo motivo provvediamo ad inserire l’entità GENERE e di
conseguenza l’associazione INCLUSO che andrà a collegare l’entità creata con l’entità NARRATIVA. La stessa
cosa la facciamo per le entità SAGGISTICA ed ALTRO che colleghiamo ad un’entità MATERIA tramite,
rispettivamente, le relazioni ABBINATO e ASSOCIATO. Le cardinalità di relazione, che saranno le stesse per tutte
e tre le associazioni, sono: (1, 1) dalla parte delle entità della generalizzazione, perché un certo “volume” sarà
associato ad una, ed una sola materia/genere; (0, N) dall’altra parte , perché ad una materia/genere sono associati da
0 ad N “volumi”.
CITA A
(0, N)
Codice_volume
CITAZIONI
Titolo
#Edizione
Durata_max_prestito
Lingua
VOLUME
(0, N)
CITATO DA
MANUALE
LIBRO
Lingua
NARRATIVA
SAGGISTICA
DIZIONARIO
ALTRO
(1, 1)
Nome
(1, 1)
(0, N)
GENERE
INCLUSO
Prima_lingua
Seconda_lingua (0, 1)
ASSOCIATO
(1, 1)
ABBINATO
(0, N)
(0, N)
MATERIA
Nome
Di ogni volume devono essere considerate anche le copie. Questo è un concetto importante, infatti un utente non
prende in prestito un volume, ma una copia di un certo volume, perciò, più che introdurre un attributo, inseriamo
6
una nuova entità COPIA che ha come attributo Codice_copia. Decidiamo quindi di creare una relazione chiamata
RELATIVA, con l’attributo Disponibilità, che lega le entità COPIA e VOLUME. L’attributo ci dice se una copia di
un volume è disponibile, oppure è attualmente in mano ad un utente. Ci possono essere da una a più copie di un
volume (cardinalità 1, N). Una copia, invece, sarà relativa a zero, uno, o più volumi (cardinalità 0, N).
Procedendo sempre a macchia d’olio, possiamo introdurre un’entità AUTORE con attributi Nome, Cognome,
Data_nascita e Data_morte, dove i primi tre individuano univocamente un autore. L’attributo Data_morte avrà una
cardinalità (0, 1), questo perché può essere NULL nel caso in cui un autore è ancora in vita oppure è sconosciuta la
data della sua morte. L’entità creata sarà collegata all’entità VOLUME tramite l’associazione SCRITTO. Le
cardinalità della relazione sono: (1, N), perché un volume può essere scritto da uno o più autori (deve essere sempre
conosciuto almeno un autore di un volume), e (0, N), perché nella base di dati possono comparire anche autori che
non hanno scritto nessun testo.
Procediamo ora con la creazione di un entità EDITORE, provvista degli attributi Nome, che ne identifica
univocamente le tuple, e Città_di_appartenenza, che avrà una cardinalità (0, 1) in quanto potrebbe essere anche
sconosciuta. L’entità EDITORE sarà collegata a VOLUME dalla relazione PUBBLICAZIONE, che a sua volta è
provvista dell’attributo Anno_pubblicazione; la cardinalità di quest’ultimo sarà (0, 1) per tenere conto anche di quei
volumi più antichi per i quali è probabile che l’anno di pubblicazione non si conosca. Un editore registrato
nell’archivio non necessariamente deve aver pubblicato almeno un volume, al contrario, per ogni volume deve
essere presente nella base di dati la casa editrice che lo ha pubblicato. Le cardinalità saranno, quindi, quelle riportate
nello schema seguente.
Nome
Cognome
AUTORE
Codice_copia
COPIA
Data_morte (0, 1)
Data_nascita
(0, N)
(0, N)
(1, N)
Disponibilità
SCRITTO
(1, N)
RELATIVA
Anno_pubblicazione (0, 1)
(0, N)
(1, 1)
PUBBLICAZIONE
EDITORE
CITA A
(0, N)
CITAZIONI
Codice_volume
Nome
Città_di_appartenenza
(0, 1)
Titolo
#Edizione
Durata_max_prestito
Lingua
VOLUME
(0, N)
CITATO DA
MANUALE
LIBRO
Lingua
NARRATIVA
SAGGISTICA
DIZIONARIO
ALTRO
(1, 1)
Nome
(1, 1)
(0, N)
GENERE
INCLUSO
Prima_lingua
Seconda_lingua (0, N)
ASSOCIATO
(1, 1)
ABBINATO
(0, N)
(0, 1)
MATERIA
Nome
Analizzando le specifiche si può notare che mancano ancora due concetti da rappresentare: la collana, a cui può
appartenere un volume, e la collocazione dei volumi nella biblioteca.
7
Per quanto riguarda il primo, possiamo introdurre un entità COLLANA, provvista di un attributo Nome che sarà
anche la chiave dell’entità, ed una relazione APPARTENENZA tra l’entità appena creata e l’entità VOLUME.
L’associazione dovrà inoltre possedere l’attributo #Ordine_nella_collana, che occorre per specificare il numero che
il volume possiede all’interno della collana. Le cardinalità della relazione saranno: (1, N), perché ad ogni collana
presente nel database apparterrà almeno un libro, e (0, 1), in quanto un volume potrebbe anche non appartenere a
nessuna collana.
L’ultimo concetto lo rappresentiamo tramite l’entità POSIZIONE, che sarà collegata all’entità VOLUME sfruttando
la relazione COLLOCAZIONE. Ogni volume sarà collocato in una posizione univoca e, inversamente, in una
posizione ci potrà stare un solo tipo di volume (con tutte le sue copie), perciò le cardinalità saranno entrambe (1, 1).
Ogni posizione è individuata dal numero della sezione, dal numero dello scaffale e dal codice del volume, perciò
introduciamo nella relazione gli attributi #Sezione, #Scaffale e Codice_volume. L’ultimo di questi è l’attributo
chiave dell’entità VOLUME, e quindi attributo esterno per l’entità POSIZIONE. E’ possibile usare un attributo
esterno perché la cardinalità è (1,1).
L’entità POSIZIONE è stata legata all’entità VOLUME e non a COPIA, perché nei requisiti è stato specificato che
le copie sono poste una di fianco all’altra, quindi basta solo il codice del volume per identificare una posizione al
cui interno sono contenute tutte le sue copie.
Lo schema parziale che si ottiene è il seguente:
Codice_copia
COPIA
Nome
Cognome
AUTORE
Data_morte (0, 1)
Data_nascita
(0, N)
(1, N)
(0, N)
Nome
(1, N)
SCRITTO
(0, 1)
Città_di_appartenenza
Disponibilità
RELATIVA
#Sezione
Anno_pubblicazione (0, 1)
(0, N)
EDITORE
#Scaffale
(1, 1)
PUBBLICAZIONE
COLLOCAZIONE
(1, 1)
(1, 1)
POSIZIONE
#Ordine_nella_collana
CITA A
(0, 1)
APPARTENENZA
(0, N)
(1, N)
CITAZIONI
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
(0, N)
CITATO DA
COLLANA
Lingua
MANUALE
LIBRO
Nome
Lingua
NARRATIVA
SAGGISTICA
DIZIONARIO
ALTRO
(1, 1)
Nome
(1, 1)
(0, N)
GENERE
INCLUSO
Prima_lingua
Seconda_lingua (0, 1)
ASSOCIATO
(1, 1)
ABBINATO
(0, N)
(0, N)
MATERIA
Nome
2d. Integrazione di schemi
8
Integrando i due schemi parziali ci si accorge che l’associazione PRESTITO, che era stata specificata come binaria
nello schema scheletro, in realtà è una relazione ternaria tra COPIA, UTENTE e VOLUME. Questo perché in un
prestito un utente preleverà una certa copia di un determinato volume. La relazione dovrà inoltre possedere i
seguenti attributi: Data_inizio, Data_riconsegna e #Avvisi (specifica, per ogni prestito, quanti avvisi vengono
inviati all’utente, avendo costui superato la durata massima del prestito). L’attributo Data_riconsegna avrà
cardinalità (0, 1) perché può essere NULL nel caso in cui il libro non sia stato ancora riconsegnato. Per quanto
riguarda le cardinalità della relazione queste sono tutte (0, N): un utente può aver preso in prestito da 0 ad N copie
di 0 o N volumi, di un volume possono essere prese in prestito da 0 ad N copie da 0 ad N utenti, ed infine, una copia
può essere relativa a 0 o N volumi e prelevata da 0 ad N utenti.
Lo schema concettuale finale è il seguente.
2e. Schema concettuale finale
Data_morte (0, 1)
#Tessera
Nome
Cognome
Tessera_bloccata
Nome
Cognome
AUTORE
Multa
Tot_Avvisi
Data_nascita
Data_nascita
Dati anagrafici
UTENTE
Città
Via
Indirizzo
(0, N)
Data_riconsegna
Numero_civico
Numero_telefonico
Data_inizio
CAP
#Avvisi
(0, N)
Codice_copia
(0, N)
PRESTITO
Disponibilità
SCRITTO
(0, N)
(1, N)
(1, N)
Nome
COPIA
(0, N)
RELATIVA
(0, 1)
Città_di_appartenenza
#Sezione
#Scaffale
Anno_pubblicazione (0, 1)
(0, N)
EDITORE
PUBBLICAZIONE
(1, 1)
COLLOCAZIONE
(1, 1)
(1, 1)
CITA A
#Ordine_nella_collana
(0, N)
(0, 1)
APPARTENENZA
CITAZIONI
Codice_volume
Titolo
#Edizione
Durata_max_prestito
(1, N)
COLLANA
POSIZIONE
Lingua
VOLUME
(0, N)
CITATO DA
MANUALE
LIBRO
Nome
Lingua
NARRATIVA
SAGGISTICA
ALTRO
DIZIONARIO
(1, 1)
Nome
(1, 1)
(0, N)
GENERE
INCLUSO
Prima_lingua
Seconda_lingua (0, 1)
ASSOCIATO
(1, 1)
ABBINATO
(0, N)
(0, N)
MATERIA
Possiamo notare nello schema che ci sono due attributi Lingua relativi alle entità ALTRO e LIBRO,Nome
che oltre ad
avere lo stesso nome, indicano anche la stessa cosa. Per questo motivo si potrebbe pensare di aggiungere un’entità
LINGUA legata poi ad ALTRO e LIBRO tramite due associazioni. In realtà questo non è stato fatto, perché in un
9
secondo momento, nella fase di semplificazione, verranno prese in considerazione le generalizzazioni e, nel caso del
collassamento dei figli nel padre (come è probabile che avvenga), i due attributi diventeranno un unico attributo
risolvendo il problema.
2f. Dizionario dei dati
Entità:
Nome entità
Descrizione
VOLUME
Testo che si trova nella tabella
LIBRO
Particolare categoria di volume
MANUALE
Particolare categoria di volume
NARRATIVA Particolare categoria di libro
SAGGISTICA Particolare categoria di libro
DIZIONARIO Particolare categoria di manuale
ALTRO
Particolare categoria di manuale
EDITORE
Soggetto che ha pubblicato un
volume
AUTORE
Soggetto che ha scritto un
volume
GENERE
Es. giallo, horror, avventura,
ecc.
E’ associato ad ogni libro di
narrativa
Es.
informatica,
chimica,
meccanica, ecc. E’ associata ad
ogni libro di saggistica e ad ogni
manuale che non sia un
dizionario
Raccolta di volumi aventi tra
loro una certa analogia
Colui che prende in prestito dei
volumi dalla biblioteca
MATERIA
COLLANA
UTENTE
Attributi
Identificatore
Codice_volume (numerico a 6 cifre)
Titolo (stringa a 80 caratteri)
#Edizione (numerico a 2 cifre)
Durata_max_prestito (numerico a 3 cifre)
Lingua (stringa a 15 caratteri)
Codice_volume
Nome (stringa a 25 caratteri)
Nome
Nome (stringa a 30 caratteri)
Nome
#Tessera (numerico a 6 cifre)
Dati anagrafici:
- Nome (stringa a 15 caratteri)
- Cognome (stringa a 15 caratteri)
- Data_nascita (stringa a 10 caratteri)
#Tessera
Nessuno, perché
è un’entità figlia
Nessuno, perché
è un’entità figlia
Nessuno, perché
è un’entità figlia
Nessuno, perché
è un’entità figlia
Prima_lingua (stringa a 15 caratteri)
Nessuno, perché
Seconda_lingua (stringa a 15 caratteri; è un’entità figlia
cardinalità 0, 1)
Lingua (stringa a 15 caratteri)
Nessuno, perché
è un’entità figlia
Nome (stringa a 40 caratteri)
Nome
Città_di_appartenenza (stringa a 30 caratteri;
cardinalità 0, 1)
Nome,
Nome (stringa a 15 caratteri)
Cognome e
Cognome (stringa a 15 caratteri)
Data_nascita
Data_nascita (stringa a 10 caratteri)
Data_morte (stringa a 10 caratteri; cardinalità
0, 1)
Nome (stringa a 15 caratteri)
Nome
- Indirizzo:
o Città (stringa a 30 caratteri)
o Via (stringa a 30 caratteri)
o Numero_civico (numerico a 4 cifre)
10
POSIZIONE
COPIA
o CAP (numerico a 5 cifre)
- Numero_telefonico (numerico a 10 cifre)
Tessera_bloccata (booleano)
Tot_avvisi (numerico a 2 cifre)
Multa (booleano)
Locazione della biblioteca dove #Sezione (numerico a 3 cifre)
si trova un certo volume
#Scaffale (numerico a 5 cifre)
Indica le copie di ogni volume
Codice_copia (numerico a 2 cifre)
Codice_volume
Codice_copia
Relazioni:
Nome relazione
Descrizione
Entità coinvolte
Attributi
PRESTITO
Associa un utente ad una certa copia VOLUME,
Data_inizio (stringa a10 caratteri)
di un volume presa in prestito
UTENTE e COPIA Data_riconsegna (stringa a 10
caratteri; cardinalità 0, 1)
#Avvisi (numerico a 2 cifre)
RELATIVA
Associa, ad ogni volume, tutte le sue COPIA e
Disponibilità (booleano)
copie
VOLUME
COLLOCAZIONE Associa, ad un volume, una certa VOLUME e
posizione della biblioteca, che sarà POSIZIONE
la stessa per tutte le sue copie
CITAZIONI
Associa un volume ad altri volumi VOLUME
da lui citati
SCRITTO
Associa un volume agli autori che lo VOLUME e
hanno scritto
AUTORE
PUBBLICAZIONE Associa un volume all’editore che lo VOLUME e
Anno_pubblicazione (numerico a
ha pubblicato
EDITORE
4 cifre; cardinalità 0, 1)
APPARTENENZA Associa un volume alla collana a cui VOLUME e
#Ordine_nella_collana (numerico
questo appartiene (sempre se il COLLANA
a 4 cifre)
volume appartiene ad una collana)
INCLUSO
Associa ad un libro di narrativa un NARRATIVA e
certo genere
GENERE
ABBINATO
Associa ad un libro di saggistica una SAGGISTICA e
materia
MATERIA
ASSOCIATO
Associa, ad un manuale che non sia ALTRO e
un dizionario, una certa materia
MATERIA
3. Ristrutturazione dello schema concettuale
3a. Tavola delle operazioni
11
Operazione
1
2
3
4
5
6
7
8
9
10
11
12
Tipo operazione
I
I
I
I
I
I
I
I
I
I
B
B
Frequenza
5 volte al giorno ≈ 150 volte al mese
2 volte al giorno ≈ 60 volte al mese
2 volte alla settimana ≈ 8 volte al mese
120 volte al giorno ≈ 3600 volte al mese
20 volte al giorno ≈ 600 volte al mese
80 volte al giorno ≈ 2400 volte al mese
1 volta al mese
40 volte al giorno ≈ 1200 volte al mese
100 volte al giorno ≈ 3000 volte al mese
100 volte al giorno ≈ 3000 volte al mese
1 volta alla settimana ≈ 4 volte al mese
3 volte alla settimana ≈ 12 volte al mese
3b. Tavola dei volumi
Concetto
VOLUME
LIBRO
MANUALE
NARRATIVA
SAGGISTICA
DIZIONARIO
ALTRO
EDITORE
AUTORE
GENERE
MATERIA
COLLANA
UTENTE
POSIZIONE
COPIA
PRESTITO
RELATIVA
COLLOCAZIONE
CITAZIONI
SCRITTO
PUBBLICAZIONE
APPARTENENZA
INCLUSO
ABBINATO
ASSOCIATO
Tipo
Volume
E
E
E
E
E
E
E
E
E
E
E
E
E
E
E
R
R
R
R
R
R
R
R
R
R
60000
40000
20000
25000
15000
1000
19000
200
10000
25
50
480
20000
60000
15
300000
120000
60000
180000
120000
60000
12000
25000
15000
19000
3c. Costo delle operazioni e schemi di navigazione
Operazione 1:
12
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
Dati anagrafici
UTENTE
20000
(0, N)
Data_nascita
Città
Via
Indirizzo
AVG = 15
Data_inizio
Data_riconsegna
Numero_civico
Numero_telefonico
CAP
#Avvisi
Codice_copia
(0, N)
PRESTITO
300000
(0, N)
COPIA
AVG = 5
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
60000
Tavola degli accessi
Operazione 1
Concetto
UTENTE
VOLUME
COPIA
Costo operazione
Totale costo
Costrutto
Entità
Entità
Entità
Accessi
Tipo operazione
1
R
15
R
15
R
31 R
31 * 150 (frequenza operazione) = 4650
Operazione 2:
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
Dati anagrafici
UTENTE
20000
(0, N)
Data_nascita
Città
Via
Indirizzo
AVG = 15
Data_inizio
Data_riconsegna
Numero_telefonico
Numero_civico
CAP
#Avvisi
Codice_copia
(0, N)
PRESTITO
300000
(0, N)
COPIA
AVG = 5
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
60000
Tavola degli accessi
Operazione 2
Concetto
UTENTE
PRESTITO
Costrutto
Entità
Relazione
Accessi
1
15
Tipo operazione
R
R
13
16 R
16 * 60 (frequenza operazione) = 960
Costo operazione
Totale costo
Operazione 3:
Data_morte (0, 1)
Nome
Cognome
AUTORE
10000
Data_nascita
Codice_copia
AVG = 12
(0, N)
Disponibilità
SCRITTO
120000
AVG = 2
(1, N)
Nome
AVG = 2
AVG = 8000
RELATIVA
(1, N)
120000
COPIA
15
(0, N)
(0, 1)
Città_di_appartenenza
#Sezione #Scaffale
Anno_pubblicazione (0, 1)
EDITORE
AVG = 300
200
AVG = 1
PUBBLICAZIONE
60000
(0, N)
(1, 1)
AVG = 1
COLLOCAZIONE
60000
(1, 1) AVG = 1
(1, 1)
480
AVG = 3
AVG = 0,2
CITAZIONI
Codice_volume
180000
Titolo
#Edizione
Durata_max_prestito
AVG = 25
COLLANA
(0, N)
(0, 1)
(1, N)
60000
CITA A
#Ordine_nella_collana
APPARTENENZA
12000
POSIZIONE
Lingua
VOLUME
60000
(0, N)
AVG = 3
CITATO DA
MANUALE
LIBRO
40000
Nome
NARRATIVA
SAGGISTICA
25000
Nome
AVG = 1
(1, 1)
AVG = 1000
(0, N)
GENERE
25
INCLUSO
25000
Tavola degli accessi
14
Operazione 3
Concetto
VOLUME
LIBRO
COPIA
RELATIVA
AUTORE
EDITORE
PUBBLICAZIONE
POSIZIONE
CITAZIONI
COLLANA
APPARTENENZA
GENERE
INCLUSO
Costo operazione
Totale costo
Costrutto
Entità
Entità
Entità
Relazione
Entità
Entità
Relazione
Entità
Relazione
Entità
Relazione
Entità
Relazione
Accessi
Tipo operazione
1
W
1
W
2
L
2
W
2
W
1
W
1
W
1
W
3
W
1
L
1
W
1
L
1
W
14 W + 4 R = 18
18 * 8 (frequenza operazione) = 144
Operazione 4:
Data_morte (0, 1)
Nome
Cognome
AUTORE
10000
Data_nascita
AVG = 12 (0, N)
AVG = 2
(1, N)
SCRITTO
120000
#Sezione #Scaffale
(0, 1)
Nome Città_di_appartenenza
AVG = 1
Anno_pubblicazione (0, 1)
(0, N)
EDITORE
200
AVG = 300
PUBBLICAZIONE
60000
(1, 1)
COLLOCAZIONE
60000
AVG = 1
(1, 1)
POSIZIONE
60000
(1, 1)
AVG = 1
Codice_volume
Titolo
#Edizione
Durata_max_prestito
Lingua
VOLUME
60000
MANUALE
LIBRO
40000
Tavola degli accessi
Operazione 4
Concetto
VOLUME
LIBRO
AUTORE
Costrutto
Entità
Entità
Entità
Accessi
1
1
2
Tipo operazione
R
R
R
15
EDITORE
POSIZIONE
Costo operazione
Totale costo
Entità
Entità
1
R
1
R
6R
6 * 3600 (frequenza operazione) = 21600
Operazione 5:
Nome
Cognome
AUTORE
Data_morte (0, 1)
10000
Data_nascita
AVG = 12
(0, N)
(1, N)
CITA A
AVG = 3
SCRITTO
(0, N)
120000
AVG = 2
CITAZIONI
Codice_volume
180000
Titolo
#Edizione
Durata_max_prestito
VOLUME
60000
AVG = 3
(0, N)
CITATO DA
Tavola degli accessi
Operazione 5
Concetto
VOLUME
CITAZIONI
AUTORE
Costo operazione
Totale costo
Costrutto
Entità
Relazione
Entità
Operazione 6:
Accessi
Tipo operazione
1
R
3
R
2*3=6
R
10 R
10 * 600 (frequenza operazione) = 6000
Data_morte (0, 1)
Nome
Cognome
Data_nascita
AUTORE
10000
AVG = 12 (0, N)
(1, N)
SCRITTO
(0, 1)
Nome Città_di_appartenenza
AVG = 2
120000
Anno_pubblicazione (0, 1)
(0, N)
EDITORE
200
AVG = 300
PUBBLICAZIONE
60000
(1, 1)
AVG = 1
Codice_volume
Titolo
#Edizione
Tavola
degli accessi
Durata_max_prestito
VOLUME
60000
Operazione 6
16
Concetto
AUTORE
VOLUME
PUBBLICAZIONE
EDITORE
Costo operazione
Totale costo
Costrutto
Entità
Entità
Relazione
Entità
Accessi
Tipo operazione
1
R
12
R
1 * 12 = 12
R
1 * 12 = 12
R
37 R
37 * 2400 (frequenza operazione) = 88800
Operazione 7:
Prima di procedere alla cancellazione, si dovrà verificare se nell’associazione SCRITTO esiste almeno una tupla in
cui compare quell’autore.
Data_morte (0, 1)
Nome
Cognome
Data_nascita
AUTORE
10000
AVG = 12
(0, N)
SCRITTO
(1, N)
AVG = 2
120000
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
60000
Tavola degli accessi
Operazione 7
Concetto
AUTORE
SCRITTO
AUTORE
Costo operazione
Totale costo
Costrutto
Entità
Relazione
Entità
Accessi
Tipo operazione
1
R
12
R
1
W
13 R + 1W = 14
14 * 1 (frequenza operazione) = 14
Operazione 8:
17
Codice_volume
Titolo
#Edizione
Durata_max_prestito
Lingua
VOLUME
60000
MANUALE
LIBRO
40000
NARRATIVA
SAGGISTICA
25000
Nome
AVG = 1
(1, 1)
AVG = 1000
(0, N)
GENERE
INCLUSO
25000
25
Tavola degli accessi
Operazione 8
Concetto
GENERE
VOLUME
Costo operazione
Totale costo
Costrutto
Entità
Entità
Accessi
Tipo operazione
1
R
1000
R
1001 R ≈ 1000
1000 * 1200 (frequenza operazione) = 1200000
Operazione 9:
In realtà questa operazione è composta da due fasi (o sotto-operazioni). Nella prima fase si visualizzano tutte le
copie di un volume, specificando per ognuna se è disponibile per il prestito e si verifica se la tessera dell’utente è
attiva o bloccata. Nella seconda fase, che verrà eseguita solo se la tessera è attiva ed è presente almeno una copia di
quel volume, verrà registrato il prestito.
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
UTENTE
Dati anagrafici
20000
(0, N)
Data_nascita
Città
Via
Indirizzo
AVG = 15
Data_inizio
Data_riconsegna
Numero_civico
Numero_telefonico
CAP
#Avvisi
PRESTITO
300000
Codice_copia
(0, N)
AVG = 20000
Disponibilità
(0, N)
(1, N)
AVG = 5
AVG = 2
COPIA
(0, N)
RELATIVA
120000
AVG = 8000
15
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
Prima fase
60000
Seconda fase
Tavola degli accessi
Operazione 9
Concetto
Costrutto
Accessi
Tipo operazione
18
Prima fase
VOLUME
Entità
RELATIVA
Relazione
COPIA
Entità
UTENTE
Entità
Costo prima fase
Seconda fase
VOLUME
Entità
COPIA
Entità
UTENTE
Entità
PRESTITO
Relazione
Costo seconda fase
Costo operazione (entrambe le due fasi)
Totale costo
1
2
2
1
6R
R
R
R
R
1
R
1
R
1
R
1
W
3R+1W
9 R + 1 W = 10
10 * 3000 (frequenza operazione) = 30000
Operazione 10:
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
UTENTE
Dati anagrafici
20000
(0, N)
Numero_telefonico
300000
(0, N)
AVG = 5
Via
Numero_civico
CAP
#Avvisi
PRESTITO
Città
Indirizzo
AVG = 15
Data_inizio
Data_riconsegna
Data_nascita
Codice_copia
(0, N)
AVG = 20000
Disponibilità
(1, N)
AVG = 2
(0, N)
RELATIVA
120000
AVG = 8000
COPIA
15
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
60000
Tavola degli accessi
Operazione 10
Concetto
VOLUME
UTENTE
COPIA
PRESTITO
RELATIVA
Costo operazione
Totale costo
Costrutto
Entità
Entità
Entità
Relazione
Relazione
Accessi
Tipo operazione
1
R
1
R
1
R
1
W
1
W
3R+2W=5
5 * 3000 (frequenza operazione) = 15000
Operazione 11:
#Tessera
Nome
19
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
UTENTE
Dati anagrafici
Data_nascita
Città
Via
Indirizzo
(0, N)
Numero_telefonico
Data_inizio
Data_riconsegna
Numero_civico
CAP
#Avvisi
PRESTITO
300000
(0, N)
AVG = 5
Codice_copia
(0, N)
AVG = 20000
Disponibilità
(1, N)
(0, N)
AVG = 2
RELATIVA
120000
COPIA
15
AVG = 8000
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
60000
Considerando, ogni settimana, di avere in media 500 volumi in prestito, si ottiene:
Tavola degli accessi
Operazione 11
Concetto
PRESTITO
VOLUME
UTENTE
Costo operazione
Totale costo
Costrutto
Relazione
Entità
Entità
Accessi
Tipo operazione
300000
R
500
R
500
R
301000 R ≈ 300000
30000 * 4 (frequenza operazione) = 1200000
Operazione 12:
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
UTENTE
Dati anagrafici
20000
Data_nascita
Città
Via
Indirizzo
Numero_telefonico
Numero_civico
CAP
Considerando, ogni settimana, di avere in media 2 utenti che hanno accumulato dieci o più avvisi, si ottiene:
Tavola degli accessi
Operazione 12
Concetto
UTENTE
UTENTE
Costo operazione
Totale costo
Costrutto
Entità
Entità
Accessi
Tipo operazione
20000
R
2
W
20000 R + 2 W ≈ 20000
20000 * 12 (frequenza operazione) = 240000
3d. Analisi delle ridondanze
Analizzando lo schema concettuale finale, due sono gli attributi ridondanti: Tot_avvisi (nell’entità UTENTE) e
Disponibilità (nell’associazione RELATIVA).
Il primo è ridondante in quanto nell’associazione PRESTITO è presente l’attributo #Avvisi che, per ogni prestito, ci
dice quanti avvisi ha ricevuto quell’utente per avere riconsegnato in ritardo quel volume. Il totale degli avvisi è
20
quindi facilmente ottenibile analizzando tutti i prestiti di un utente e sommando via via il valore memorizzato nello
attributo #Avvisi.
Il secondo, invece, ci indica se una certa copia di un volume è, oppure no, disponibile. Senza l’attributo sarebbe
ugualmente possibile avere questa informazione, basterà infatti analizzare l’associazione PRESTITO per vedere se
la copia del volume cercata è attualmente in mano ad un utente (se esiste almeno una tupla di PRESTITO dove
compare quella copia, quel volume e l’attributo Data_riconsegna è uguale a NULL) oppure è presente in biblioteca
(tutte le tuple di prestito relative a quella copia ed a quel volume hanno la Data_riconsegna diversa da NULL).
Analisi dell’attributo Tot_avvisi:
L’attributo viene usato nell’operazione 12, quindi guardiamo in quale caso, con o senza attributo, questa ha il costo
minore.
con l’attributo:
Lo schema di navigazione e la tavola degli accessi sono gli stessi della pagina 21. La stessa cosa vale per il costo
dell’operazione che è 240000.
senza l’attributo:
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Dati anagrafici
UTENTE
20000
Data_nascita
Città
Via
Indirizzo
AVG = 15
(0, N)
Data_inizio
Data_riconsegna
Numero_telefonico
Numero_civico
CAP
#Avvisi
Codice_copia
(0, N)
PRESTITO
300000
COPIA
(0, N)
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
Tavola degli accessi
Operazione 12
Concetto
UTENTE
PRESTITO
UTENTE
Costo operazione
Totale costo
Costrutto
Entità
Relazione
Entità
Accessi
Tipo operazione
20000
R
20000 * 15 = 300000
R
2
W
320000 R + 2 W ≈ 320000
320000 * 12 (frequenza operazione) = 3840000
Guardando i costi in entrambi i casi, risulta che è conveniente tenere l’attributo Tot_avvisi, perché ci risparmia quasi
3500000 letture. Questa soluzione, però, comporterà un aumento dell’occupazione di memoria.
Tenendo conto che ci basta memorizzare fino a 10 avvisi, l’attributo potrà essere codificato con 4 bit; lo spazio in
più che viene richiesto è pari a:
20000 (numero di tuple di UTENTE) * 4 bit = 80000 bit = 10kB
Prezzo che si paga volentieri per risparmiare tutte quelle letture.
21
Analisi dell’attributo Disponibilità:
L’attributo viene usato nell’operazione 9, o meglio nella prima fase di questa operazione. Procediamo, quindi, a
verificare in quale caso, con o senza attributo, questa ha il costo minore.
con l’attributo:
Lo schema di navigazione e la tavola degli accessi sono gli stessi della pagina 19. La stessa cosa vale per il costo
della prima fase dell’operazione che è 6.
senza l’attributo:
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
UTENTE
Dati anagrafici
20000
(0, N)
300000
Via
Numero_civico
Numero_telefonico
CAP
#Avvisi
PRESTITO
Città
Indirizzo
AVG = 15
Data_inizio
Data_riconsegna
Data_nascita
Codice_copia
(0, N)
AVG = 20000
(0, N)
(1, N)
AVG = 5
AVG = 2
COPIA
(0, N)
RELATIVA
120000
AVG = 8000
15
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
Prima fase
60000
Tavola degli accessi
Operazione 9
Concetto
Prima fase
VOLUME
COPIA
UTENTE
PRESTITO
Costo prima fase
Costrutto
Accessi
Tipo operazione
Entità
Entità
Entità
Relazione
1
2
1
2
6R
R
R
R
R
Se guardiamo al numero degli accessi, avere oppure no l’attributo è insignificante.
Se guardiamo all’occupazione di area che introduce:
120000 (tuple della relazione RELATIVA) * 1 bit (1 = disponibile e 0 = non disponibile) = 120000 bit = 15kB
Lasciare l’attributo non comporta vantaggi dal punto di vista degli accessi e inoltre occupa anche memoria, ma
siccome l’occupazione di memoria è minima e la presenza dell’attributo ci semplificherà la traduzione in query
mysql dell’operazione 9, decidiamo di lasciarlo.
3e. Eliminazione delle gerarchie
Ci sono più metodi per eliminare le generalizzazioni. Tenendo conto che VOLUME, ossia l’entità padre, ha quattro
attributi, e che quasi tutte le operazioni si riferiscono ad essa piuttosto che ai suoi figli, è sconveniente sia
l’eliminazione del padre, che l’introduzione di relazioni tra il padre e i figli. Una soluzione migliore è quella di
collassare le entità figlie, LIBRO e MANUALE, nell’entità padre, aggiungendo in quest’ultimo un attributo
selettore chiamato Categoria che non sarà mai NULL perché la generalizzazione è totale.
22
Per quanto riguarda le altre due generalizzazioni, che ora passano all’entità VOLUME, anche queste saranno
collassate nell’entità VOLUME, alla quale si dovrà aggiungere un altro attributo chiamato Sottocategoria che sarà
anch’esso sempre diverso da NULL, perché le generalizzazioni sono totali.
Si può notare che VOLUME preleva dai figli attributi che hanno lo stesso significato, quindi tra gli attributi Lingua
(di LIBRO), Lingua (di ALTRO), Prima_lingua e Seconda_lingua (di DIZIONARIO) lasciamo solo gli ultimi due
(rinominando Prima_lingua in Lingua), perché inglobano anche i primi. La cardinalità di Lingua e di
Seconda_lingua resteranno le stesse.
Per quanto riguarda le associazioni che collegavano i figli alle entità GENERE e MATERIA, queste passeranno ora
a VOLUME, eliminando una relazione tra ABBINATO e ASSOCIATO, perché due sarebbero ridondanti. Lasciamo
l’associazione ASSOCIATO (che avrà un volume dei dati pari ad ASSOCIATO più ABBINATO), ma la cardinalità
tra la relazione e l’entità VOLUME dovrà cambiare da (1, 1) a (0, 1), questo perché ad esempio un dizionario, o un
libro di narrativa, non sono associati a nessuna materia. La stessa cosa vale per la relazione INCLUSO, la cui
cardinalità passa ugualmente da (1, 1) a (0, 1).
Dopo le ultime modifiche lo schema diventa:
Data_morte (0, 1)
#Tessera
Nome
Cognome
Tessera_bloccata
Nome
Cognome
AUTORE
Multa
Tot_Avvisi
Data_nascita
Data_nascita
Dati anagrafici
UTENTE
Città
Via
Indirizzo
(0, N)
Data_riconsegna
Numero_civico
Numero_telefonico
Data_inizio
CAP
#Avvisi
Codice_copia
(0, N)
(0, N)
PRESTITO
Disponibilità
SCRITTO
(0, N)
(1, N)
(1, N)
Nome
COPIA
(0, N)
RELATIVA
(0, 1)
Città_di_appartenenza
#Sezione
#Scaffale
Anno_pubblicazione (0, 1)
(0, N)
EDITORE
(1, 1)
PUBBLICAZIONE
(1, 1)
COLLOCAZIONE
CITA A
#Ordine_nella_collana
(0, N)
(0, 1)
APPARTENENZA
(0, N)
Codice_volume
Titolo
#Edizione
Durata_max_prestito
(1, N)
COLLANA
Nome
CITAZIONI
CITATO DA
Categoria
Sottocategoria
VOLUME
Seconda_lingua
(0, 1)
Lingua
(0, 1)
(0, N)
Nome
POSIZIONE
(1, 1)
(0, 1)
(0, N)
ASSOCIATO
INCLUSO
GENERE
MATERIA
Nome
3f. Eliminazione degli attributi composti
Si presentano i seguenti attributi composti:
#Tessera
Nome
Cognome
Tessera_bloccata
Multa
Tot_Avvisi
UTENTE
Dati anagrafici
Data_nascita
Indirizzo
Numero_telefonico
Città
Via
Numero_civico
23
Per quanto riguarda l’attributo composto Indirizzo, verrà privato di tutti i suoi attributi semplici e verrà trasformato
esso stesso in un attributo semplice. Questo dovrà comunque inglobare tutte le altre informazioni eliminate.
L’attributo composto Dati anagrafici verrà invece collassato e tutti i suoi attributi passeranno direttamente all’entità
UTENTE. Si ottiene così:
#Tessera
Tessera_bloccata
Multa
Tot_Avvisi
Nome
UTENTE
Cognome
Data_nascita
Indirizzo
Numero_telefonico
3g. Eliminazione degli identificatori esterni
E’ presente il seguente identificatore esterno:
#Sezione
#Scaffale
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
COLLOCAZIONE
(1, 1)
(1, 1)
POSIZIONE
Per eliminarlo basta aggiungere la chiave dell’entità VOLUME, ossia Codice_volume, nell’entità posizione. Dopo
questa modifica si ottiene:
#Sezione #Scaffale Codice_volume
Codice_volume
Titolo
#Edizione
Durata_max_prestito
VOLUME
COLLOCAZIONE
(1, 1)
(1, 1)
POSIZIONE
3h. Scelta delle chiavi
Le chiavi sono le stesse della tabella a pagina 11 e 12. Ma ci sono alcuni aspetti da chiarire per tre entità.
UTENTE: Come chiavi candidate c’erano il numero della tessera (#Tessera) e la chiave composta dai
seguenti attributi: Nome, Cognome e Data_Nascita. Si è scelta la prima perché è migliore una
chiave semplice di una composta.
VOLUME: Come chiavi candidate c’erano il codice del volume (Codice_volume) e la chiave composta dai
seguenti attributi: Titolo, #Edizione, Autore ed Editore, dove gli ultimi due sono attributi esterni.
Anche in questo caso, per lo stesso motivo precedente, la prima ipotesi è la migliore.
AUTORE: Le specifiche non richiedevano in questo caso un particolare attributo codice, che identificasse
univocamente gli elementi, quindi l’unica chiave candidata è quella composta dagli attributi:
Nome, Cognome e Data_nascita. In realtà si può prendere in considerazione l’inserimento di un
attributo Codice_autore che identifichi univocamente un autore, in modo da ottenere una chiave
semplice invece di una composta. Oltretutto questa soluzione, incrementerebbe si l’occupazione
24
di area dell’entità AUTORE, ma ridurrebbe quella dell’associazione SCRITTO.
Calcolando di aver bisogno di 40 byte per la chiave composta e 16 bit per il nuovo attributo (che
ci bastano per memorizzare fino a circa 65000 autori):
Occupazione di memoria senza Codice_autore
SCRITTO Æ 120000 (numero tuple) * 40 byte = 4,8MB
Occupazione di memoria con Codice_autore
SCRITTO Æ 120000 (numero tuple) * 16 bit = 240kB
AUTORE Æ 10000 (numero tuple) * 16 bit = 20kB
Guardando ai valori ottenuti si conclude che conviene inserire l’attributo Codice_autore e verrà
usato come chiave dell’entità AUTORE.
4. Progettazione logica
4a. Traduzione di entità e associazioni in relazioni del modello relazionale
Entità/Relazione
Utente
Volume
Autore
Scritto
Copia
Relativa
Editore
Prestito
Posizione
Collana
Appartenenza
Citazioni
Genere
Materia
Incluso
Associato
Traduzione
Utente (Tessera, Nome, Cognome, Data_nascita, Indirizzo, Numero_telefonico, Tot_avvisi,
Multa, Tessera_bloccata)
Nota: E’ stato rinominato #Tessera in Tessera.
Volume (Codice_volume, Titolo, Edizione, Editore, Anno_pubblicazione, Categoria,
Sottocategoria, Lingua, Seconda_lingua, Durata_max_prestito)
Nota: E’ stato rinominato #Edizione in Edizione.
Autore (Codice_autore, Nome, Cognome, Data_nascita, Data_morte)
Volume_Autore (Volume, Autore)
Nota: Sono stati rinominati Codice_volume e Codice_autore in Volume e Autore. Inoltre la
relazione non è stata chiamata Scritto ma Volume_Autore.
Copia (Codice_copia)
Volume_Copie (Volume, Copia, Disponibilità)
Nota: Sono stati rinominati Codice_volume e Codice_copia in Volume e Copia. Inoltre la
relazione non è stata chiamata Relativa ma Volume_Copie.
Editore (Nome, Città_di_appartenenza)
Prestito (Volume, Copia, Utente, Data_inizio, Data_riconsegna, Avvisi)
Nota: Sono stati rinominati Codice_volume, Codice_copia, #Tessera e #Avvisi in Volume,
Copia, Utente e Avvisi. Per identificare un prestito non basterà solo Volume, Copia e Utente,
ma anche Data_inizio, perché lo stesso utente potrebbe aver affittato la stessa copia dello
stesso volume per più volte.
Posizione (Codice_volume, Sezione, Scaffale)
Nota: Sono stati rinominati #Sezione e #Scaffale in Sezione e Scaffale.
Collana (Nome)
Volume_Collana (Volume, Collana, Ordine_nella_collana)
Nota: Sono stati rinominati Nome (della relazione Collana), #Ordine_nella_collana e
Codice_volume in Collana, Ordine_nella_collana e Volume.
Inoltre la relazione non è stata chiamata Appartenenza ma Volume_Collana.
Citazioni (Volume, Volume_citato)
Nota: Sono stati rinominati i due Codice_volume in Volume e Volume_citato.
Genere (Nome)
Materia (Nome)
Volume_Genere (Volume, Genere)
Nota: Sono stati rinominati Codice_volume e Nome (della relazione Genere) in Volume e
Genere. Inoltre la relazione non è stata chiamata Incluso ma Volume_Genere.
Volume_Materia (Volume, Materia)
Nota: Sono stati rinominati Codice_volume e Nome (della relazione Materia) in Volume e
25
Materia. Inoltre la relazione non è stata chiamata Associato ma Volume_Materia.
4b. Normalizzazione
Le relazioni Volume, Autore, Volume_Copie, Editore, Prestito, Posizione, Volume_Collana, Volume_Genere, e
Volume_Materia sono in forma normale di Boyce e Codd, perché le uniche dipendenze funzionali sono o quelle
banali o dipendenze tra un qualunque attributo non primo e la chiave.
Le relazioni Volume_Autore, Copia, Collana, Citazioni, Genere e Materia hanno solo attributi primi, quindi le
uniche dipendenze funzionali sono quelle banali e pertanto anche queste relazioni sono in forma normale di Boyce e
Codd.
L’unica relazione che non è in forma di Boyce e Codd è Utente, perché è presente una dipendenza funzionale tra
Indirizzo e Numero_telefonico: Numero_telefonico -> Indirizzo, e il primo non fa parte di una chiave. La soluzione
sarà di decomporre la relazione Utente in due relazioni, la prima identica ad Utente senza il numero di telefono e la
seconda del tipo: Rubrica (Utente, Numero_telefonico) dove è stato rinominato l’attributo Tessera in Utente.
Tutte le relazioni ora sono in BCNF e non presenteranno anomalie in fase di inserimento, modifica e cancellazione.
4c. Vincoli di integrità referenziale
Attributo
Editore (relazione Volume)
Volume (relazione Volume_Autore)
Autore (relazione Volume_Autore)
Volume (relazione Volume_Copie)
Copia (relazione Volume_Copie)
Volume (relazione Prestito)
Copia (relazione Prestito)
Utente (relazione Prestito)
Codice_volume (relazione Posizione)
Collana (relazione Volume_Collana)
Volume (relazione Collana)
Volume (relazione Citazioni)
Volume_citato (relazione Citazioni)
Volume (relazione Volume_Genere)
Genere (relazione Volume_Genere)
Volume (relazione Volume_Materia)
Materia (relazione Volume_Genere)
Vincolato a
Nome (relazione Editore)
Codice_volume (relazione Volume)
Codice_autore (relazione Autore)
Codice_Volume (relazione Volume)
Codice_copia (relazione Copia)
Codice_volume (relazione Volume)
Codice_copia (relazione Copia)
Tessera (relazione Utente)
Codice_volume (relazione Volume)
Nome (relazione Collana)
Codice_volume (relazione Volume)
Codice_volume (relazione Volume)
Codice_volume (relazione Volume)
Codice_volume (relazione Volume)
Nome (relazione Genere)
Codice_volume (relazione Volume)
Nome (relazione Materia)
4d. MySQL: definizione dello schema
Si dovranno definire le tabelle in modo da consentire la cancellazione dei volumi, ed in tal caso si dovrà cancellare
ogni riferimento a quel volume. Non importerà se si perdono le informazioni sui prestiti che lo riguardano, perché,
non facendo più parte della biblioteca, non interessa più la sua “storia”.
create database Biblioteca;
create table Utente (
Tessera numeric(6) primary key,
Nome char varying(15) not null,
Cognome char varying(15) not null,
Data_nascita date not null,
Indirizzo char varying(70) not null,
Tot_avvisi numeric(2) not null default 0,
Multa enum (‘0’, ‘1’) not null default 0,
26
Tessera_bloccata enum (‘0’, ‘1’) not null default 0,
unique (Nome, Cognome, Data_nascita)
)type = InnoDB;
create table Rubrica (
Utente numeric(6) primary key,
Numero_telefonico numeric(12) not null,
index Ut_index (Utente),
foreign key (Utente) references Utente(Tessera)
on delete cascade
on update cascade
)type = InnoDB;
create table Autore (
Codice_autore numeric(6) primary key,
Nome char varying(15) not null,
Cognome char varying(15) not null,
Data_nascita date not null,
Data_morte date not null
)type = InnoDB;
create table Editore (
Nome char varying(40) primary key,
Città_di_appartenenza char varying(30) default null
)type = InnoDB;
create table Volume (
Codice_volume numeric(6) primary key,
Titolo char varying(80) not null,
Edizione numeric(2) not null,
Editore char varyng(40) not null,
Anno_pubblicazione numeric(4),
Categoria enum (‘Libro’, ‘Manuale’) not null,
Sottocategoria enum (‘Narrativa’, ‘Saggistica’, ‘Dizionario’, ‘Altro’) not null,
Lingua char varying(15) not null,
Seconda_lingua char varying(15),
Durata_max_prestito numeric(3) not null default 40,
index Ed_index (Editore),
foreign key (Editore) references Editore(Nome)
on delete no action
on update cascade
)type = InnoDB;
create table Volume_Autore (
Volume numeric(6) not null,
Autore numeric(6) not null,
primary key (Volume, Autore),
index Vol_index (Volume),
index Aut_index (Autore),
foreign key (Volume) references Volume (Codice_volume)
on delete cascade
on update cascade,
foreign key (Autore) references Autore (Codice_autore)
on delete no action
on update cascade
)type = InnoDB;
create table Copia (
27
Codice_copia numeric(2) primary key
)type = InnoDB;
create table Volume_Copie (
Volume numeric(6) not null,
Copia numeric(2) not null,
Disponibilita enum (‘0’, ‘1’) not null default 1,
primary key (Volume, Copia),
index Vol_index (Volume),
index Copia_index (Copia),
foreign key (Volume) references Volume (Codice_volume)
on delete cascade
on update cascade,
foreign key (Copia) references Copia (Codice_copia)
on delete cascade
on update cascade
)type = InnoDB;
create table Prestito (
Volume numeric(6) not null,
Copia numeric(2) not null,
Utente numeric(6) not null,
Data_inizio date not null,
Data_riconsegna date default null,
Avvisi numeric(2) not null default 0,
primary key (Volume, Copia, Utente, Data_inizio),
index Vol_index (Volume),
index Copia_index (Copia),
index Utente_index (Utente),
foreign key (Volume) references Volume (Codice_volume)
on delete cascade
on update cascade,
foreign key (Copia) references Copia (Codice_copia)
on delete cascade
on update cascade,
foreign key (Utente) references Utente (Tessera)
on delete no action
on update cascade
)type = InnoDB;
create table Posizione (
Volume numeric(6) primary key,
Sezione numeric(3) not null,
Scaffale numeric(5) not null,
index Vol_index (Volume),
foreign key (Volume) references Volume (Codice_volume)
on delete cascade
on update cascade
)type = InnoDB;
create table Collana (
Nome char varying(30) primary key,
)type = InnoDB;
create table Volume_Collana (
Collana char varying(30) not null,
Volume numeric(6) not null,
Ordine_nella_Collana numeric(4) not null,
28
primary key (Collana, Volume),
index Vol_index (Volume),
index Col_index (Collana),
foreign key (Volume) references Volume (Codice_volume)
on delete cascade
on update cascade,
foreign key (Collana) references Collana (Nome)
on delete no action
on update cascade
)type = InnoDB;
create table Citazioni (
Volume numeric(6) not null,
Volume_citato numeric(6) not null,
primary key (Volume, Volume_citato),
index Vol_index (Volume),
index Citato_index (Volume_citato),
foreign key (Volume) references Volume (Codice_volume)
on delete cascade
on update cascade,
foreign key (Volume_citato) references Volume (Codice_volume)
on delete cascade
on update cascade
)type = InnoDB;
create table Genere (
Nome char varying(15) primary key
)type = InnoDB;
create table Materia (
Nome char varying(25) primary key
)type = InnoDB;
create table Volume_Genere (
Genere char varying(15) not null,
Volume numeric(6) not null,
primary key (Genere, Volume),
index Vol_index (Volume),
index Gen_index (Genere),
foreign key (Volume) references Volume (Codice_volume)
on delete cascade
on update cascade,
foreign key (Genere) references Genere (Nome)
on delete no action
on update cascade
)type = InnoDB;
create table Volume_Materia (
Materia char varying(25) not null,
Volume numeric(6) not null,
primary key (Materia, Volume),
index Vol_index (Volume),
index Mat_index (Materia),
foreign key (Volume) references Volume (Codice_volume)
on delete cascade
on update cascade,
foreign key (Materia) references Materia (Nome)
29
on delete no action
on update cascade
)type = InnoDB;
Una volta create le tabelle potranno essere riempite una ad una con l’istruzione:
LOAD DATA LOCAL INFILE “<nome_file>” INTO TABLE <nome_tabella>;
dove <nome_file> dovrà essere il nome del file che contiene le tuple da inserire in quella tabella, scritte una per riga
e con gli attributi separati dal carattere TAB. Gli attributi dovranno rispettare il formato della tabella. Un valore null
si esprime con \N.
4e. MySQL: query
1- Ricerca di tutti i volumi attualmente in possesso di un utente, restituendo il codice del volume, il codice della
copia e il titolo.
SELECT Codice_volume, Titolo FROM Volume, Prestito
WHERE Utente = <numero_tessera> AND
Codice_Volume = Volume AND
Data_riconsegna IS NULL;
2- Verifica del numero di volumi riconsegnati in ritardo da un utente.
Un volume in prestito è stato riconsegnato in ritardo se ha almeno un avviso:
SELECT COUNT(*) AS Num_Volumi_in_Prestito FROM Prestito
WHERE Utente = <numero_tessera> AND Avvisi > 0;
3- Inserimento di un nuovo libro di narrativa con autori ed editore che non sono presenti nella base di dati,
associato ad un genere ed a una collana già presenti nell’archivio);
Supponiamo di inserire un solo autore e un solo libro citato.
Siccome l’operazione è composta da diverse sotto-operazioni quali l’inserimento di un editore e di un autore,
ricorriamo alle transazioni per renderle un'unica operazione atomica:
BEGIN;
INSERT INTO Autore VALUES ( <codice_autore>, ‘<nome>’, ‘<cognome>’, DATE ‘<data_di_nascita>’,
DATE ‘<data_della_morte>’);
INSERT INTO Editore VALUES (‘<nome>’, ‘<città_di_appartenenza>’);
INSERT INTO Volume VALUES (<codice_volume>, ‘<titolo>’, <numero_edizione>, ‘<nome_editore>’,
<anno_di_pubblicazione>, ‘Libro’, ‘Narrativa’, ‘<lingua>’, NULL,
<durata_max_del_prestito>);
INSERT INTO Posizione VALUES (<codice_volume>, <numero_sezione>, <numero_scaffale>);
INSERT INTO Volume_Copie VALUES (<codice_volume>, <codice_copia>);
INSERT INTO Volume_Autore VALUES (<codice_volume>, <codice_autore>);
INSERT INTO Volume_Collana VALUES (<codice_volume>, ‘<nome_della_collana>’,
<numero_d’ordine_del_volume_nella_collana>);
INSERT INTO Volume_Genere VALUES (<codice_volume>, ‘<nome_del_genere>’);
INSERT INTO Citazioni VALUES (<codice_volume>, <codice_del_volume_citato>);
COMMIT;
4- Trova la collocazione di un volume catalogato come “libro”, partendo dal codice del volume e visualizzando,
oltre alla posizione, il titolo, la lingua, l’edizione, l’editore e il nome e cognome dell’autore.
SELECT Codice_volume, Sezione, Scaffale, Titolo, Edizione, Lingua, Editore, Autore.Nome, Autore.Cognome
FROM Volume, Posizione, Autore, Volume_Autore
WHERE Codice_volume = <codice_volume> AND
Volume_Autore.Volume = Codice_volume AND
Codice_autore = Volume_Autore.Autore AND
Posizione.Volume = Codice_volume;
30
5- Ricerca tutti i volumi citati da un altro volume restituendone il titolo, l’edizione e il nome e cognome dell’autore.
SELECT Codice_volume, Titolo, Edizione, Nome, Cognome FROM Citazioni, Volume, Autore, Volume_Autore
WHERE Citazioni.Volume = <codice_volume> AND
Codice_volume = Volume_citato AND
Volume_Autore.Volume = Codice_volume AND
Autore.codice_autore = Volume_Autore.Autore;
6- Ricerca tutti i volumi scritti da un autore visualizzando il codice del volume, il titolo, l’edizione, l’editore e
l’anno di pubblicazione.
SELECT Codice_volume, Titolo, Edizione, Editore, Anno_pubblicazione FROM Volume, Autore, Volume_Autore
WHERE Codice_autore = <codice_dell’autore> AND
Autore = Codice_autore AND
Codice_volume = Volume;
7- Cancellazione di un autore che non si riferisce a nessun volume.
Possiamo andare a cancellare direttamente l’autore senza verificare se questo sia associato ad un volume, perché nel
caso in cui lo fosse, avendo settato “on delete no action” nella tabella Volume_Autore, l’operazione non verrebbe
eseguita.
DELETE FROM Autore WHERE Codice_Autore = <codice_autore>;
8- Ricerca di tutti i volumi appartenenti a un genere (solo per libri di narrativa).
SELECT Volume.* FROM Volume, Volume_Genere
WHERE Genere = ‘<nome_genere>’ AND
Codice_volume = Volume;
9- Registrazione di un nuovo prestito (si dovrà prima vedere se c’è almeno una copia disponibile del volume e se la
tessera non è bloccata);
Questa operazione dovrà essere effettuata in due passi. Per prima cosa si verificherà la presenza di copie del volume
e se la tessera dell’utente è bloccata, poi, se ci sono copie disponibili e la tessera è valida, si potrà eseguire il
secondo passo. Quest’ultimo prevede la registrazione del prestito e l’aggiornamento dell’indisponibilità della copia,
operazioni rese atomiche tramite le transazioni.
Passo1: BEGIN;
SELECT Copia FROM Volume_Copie
WHERE Volume = <codice_volume> AND
Disponibilita = ‘1’;
SELECT Tessera, Tessera_bloccata FROM Utente
WHERE Tessera = <numero_della_tessera>;
COMMIT;
Passo2: BEGIN;
INSERT INTO Prestito VALUES (<codice_volume>, <codice_copia>, <numero_tessera>, Current_Date,
NULL, 0);
UPDATE Volume_Copie SET Disponibilita = ‘0’ WHERE Volume = <codice_volume> AND
Copia = <codice_copia>;
COMMIT;
10- Registrazione dell’avvenuta riconsegna di un volume (fine del prestito).
UPDATE Prestito SET Data_riconsegna = Current_Date
WHERE Volume = <codice_volume> AND
Copia = <codice_copia> AND
Data_riconsegna IS NULL;
11- Ricerca di tutte le copie di tutti i volumi in prestito visualizzando oltre ai codici anche il titolo e l’edizione.
SELECT Codice_Volume, Copia, Titolo, Edizione FROM Volume, Prestito
WHERE Data_riconsegna IS NULL AND
31
Codice_volume = Volume;
12- Invio multa e blocco della tessera per tutti gli utenti che hanno raggiunto dieci o più avvisi.
UPDATE Utente SET Multa = '1', Tessera_bloccata = '1' WHERE Tot_avvisi >= 10;
5. Progettazione fisica
Analizziamo, ora, dal punto di vista fisico, qual’è la scelta migliore dell’accesso al file.
Mettiamo a confronto un accesso fisico di tipo sequenziale, ed un accesso tramite indice, per vedere se conviene
utilizzare quest’ultimo per migliorare le prestazioni.
La verifica verrà effettuata sull’operazione 8 che, assieme all’operazione 11, è quella con un costo maggiore (vedi
pagina 19). La query in mysql è la seguente:
SELECT Volume.* FROM Volume Volume_Genere
WHERE Genere = ‘<nome_genere>’ AND
Codice_volume = Volume;
Supponiamo di avere pagine di 1kB e:
Volume:
Numero tuple (NT) = 60000
Dimensione di una tupla ≈ 180 byte
Numero di valori distinti di chiave (dell’attributo Codice_volume) (NKvol) = 60000
Numero di pagine (NP) = ⎡(60000 * 180) / 1000⎤ = 10800 (supponendo un utilizzo del 100% delle
pagine)
Volume_Genere:
Numero tuple (NT) = 25000
Dimensione di una tupla ≈ 21 byte
Numero di valori distinti di chiave (dell’attributo Genere) (NKGen) = 25
Numero di pagine (NP) = ⎡(25000 * 21) / 1000⎤ = 525 (supponendo un utilizzo del 100%
delle pagine)
Accesso sequenziale:
Il costo di un accesso sequenziale sulla tabella Volume sarà:
costo medio: (NP + 1) / 2 = (10800 + 1) / 2 ≈ 5400
costo pessimo: NP = 10800
Il costo di un accesso sequenziale sulla tabella Volume_Genere sarà:
costo medio: (NP + 1) / 2 = (525 + 1) / 2 = 263
costo pessimo: NP = 525
Il costo della query (valutato nel caso pessimo) sarà:
costo_query = costo accesso tabella Volume_Genere*accessi alla tabella Volume_Genere +
+ costo accesso tabella Volume*accessi alla tabella Volume = 525*1 + 10800*1000 ≈ 10.8 * 106
Accesso con indice:
Supponiamo di costruire un indice primario e unclustered, organizzato come un B+-tree e costruito sull’attributo
Codice_volume (perché il costo più grande con l’accesso sequenziale si ha in questo caso). Supponiamo inoltre che:
1 nodo = 1 blocco = 1 foglia = 1kB,
lunghezza fisica del puntatore (len(p)) = 4 byte,
lunghezza fisica di una chiave (len(k)) = 6 byte,
utilizzazione media delle foglie (u) = 0,69.
Si può calcolare il numero di chiavi in un nodo (l), che è pari a:
32
l = [DP – len(p)] / (len(k) + len(p) = [1000 – 4] / (6 + 4) ≈ 100
dove: DP = dimensione di una pagina.
Dovendo essere g ≤ l ≤ 2g, dove g è l’ordine del B+-tree, si può supporre g = 50.
Si può calcolare ora il numero di foglie (NL), che sarà uguale a:
NL = ⎡[(len(p) + len(k)) * NR] / D * u⎤ = ⎡[(6 + 4) *60000] / 1000 * 0.69⎤ ≈ 870
dove: NR = numero di record del file;
D = dimensione di una foglia.
Trovati g e NL si può calcolare l’altezza h del B+-tree. Prendiamo quella minima perché abbiamo supposto che i
nodi intermedi sono pieni (supponendo g = 50):
h = hmin = ⎡log2g + 1 NL + 1⎤ = ⎡log 2 * 50 + 1 870 + 1⎤ = 3
Il costo di ricerca con indice (CInd) sarà dato da:
CInd = costo di accesso all’indice (CI) + costo di accesso ai dati (CD).
Sappiamo che l’operazione 8, in media, dovrebbe reperire 1000 valori distinti di chiave (EK = 1000) su un totale di
NC = 60000 valori distinti. Quindi il costo di accesso all’indice varrà:
CI = h – 1 + [(EK / NC) * NL] = 3 – 1 + [(1000 / 60000) * 870] = 14.5
Siccome l’indice è unclustered, mi occorrerà la formula di Cardenas per calcolarmi il valore della componente CD:
CD = EK * Φ(NR / NC, NP) = EK * ⎡NP * (1 – (1 – 1 / NP)NR / NC)⎤ =
= 1000 * ⎡10800 * (1 – (1 – 1 / 10800)60000 / 60000)⎤ = 1000
Quindi si ottiene:
CInd = CI + CD = 14.5 + 1000 = 1016.3
Il costo della query sarà:
Costo_query = costo accesso tabella Volume_Genere*accessi alla tabella Volume_Genere +
+ costo accesso tabella Volume*accessi alla tabella Volume = 525*1 + 1016.3*1000 ≈ 1 * 106
Si conclude che, guardando al numero di accessi, è molto vantaggioso creare ed usare un indice sull’attributo
Codice_volume.
Chiaramente la costruzione di un B+-tree comporterà un occupazione di memoria che sarà pari a:
Mem_ind = (numero massimo di nodi + numero di foglie) * loro dimensione + dimensione radice
questo perché la dimensione dei nodi e delle foglie è la stessa. Sapendo che il numero massimo di nodi è:
Nmax = [(2g + 1)h – 1] / 2g = [(2 * 50 + 1)3 – 1] / 2 * 50 = 10303
e trascurando la dimensione della radice si ottiene:
Mem_ind = (10303 + 870) * 1000 ≈ 11,2MB
6. Interfaccia con C
Per quanto riguarda l’interfaccia tramite un programma in C per il database Mysql, l’abbiamo realizzata solo per
alcune operazioni, ossia la: 1, 2, 7, 8, 9, 11.
Il file sorgente del programma in C è il seguente:
33