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 Descrizione Sinonimi Collegamenti Volume Materiale cartaceo gestito dalla Testo Editore, autore, collana biblioteca. Può essere un libro o un manuale Libro Particolare categoria di volume. Può - Volume, libro di essere di narrativa o saggistica saggistica e libro di Manuale Libro di narrativa Libro di saggistica Dizionario Altro manuale 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 narrativa - Volume, dizionario e altro manuale - Libro e genere - Libro e materia - Manuale - Manuale e materia Editore Colui che ha pubblicato il volume Casa Volume editrice Autore Colui che ha scritto un volume Scrittore Volume Genere Es. giallo, horror, avventura,ecc. - Libro di narrativa E associato ad ogni libro di narrativa Materia Es. informatica, chimica, meccanica, - Libro di saggistica e altro ecc. E associata ad ogni libro di saggistica e ad ogni manuale che non sia un dizionario manuale Collana Utente Raccolta di volumi aventi tra loro una certa analogia Colui che prende in prestito dei volumi dalla biblioteca - Volume Cliente 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 Termine Nuovo termine Ragione della correzione 9 Codice Codice del volume Codice volume è più specifico 13 Riproduzioni Copie Sinonimo per riproduzione in linea 12 15 Casa editrice Editore Sinonimo per casa editrice in linea 10 16 Scrittore Autore Sinonimo per scrittore in linea 10 22 Numero Numero d ordine Numero d ordine è più specifico 24 Testo Volume Sinonimo per testo in linea 4 25 Numero di registrazione Codice del volume Codice del volume è più specifico 31 Cliente Utente Sinonimo per cliente in linea 4 32 Libro Volume Libro è troppo specifico 35 Scheda Tessera 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, 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:, UTENTE e PRESTITO. Questi possono essere rappresentati considerando utente e volume come entità, e prestito come un associazione che li collega: PRESTITO UTENTE 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:,,, 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 Tessera_bloccata Multa Tot_Avvisi UTENTE Dati anagrafici Indirizzo Città Via Numero_telefonico CAP Numero_civico Volume: 5
Innanzi tutto si dovranno inserire gli attributi nell entità, che sono:, identifica univocamente ogni volume,, e, 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, perché ogni volume può citare o essere citato da 0 ad n volumi. CITA A CITAZIONI 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à : 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: dalla parte delle entità della generalizzazione, perché un certo volume sarà associato ad una, ed una sola materia/genere; dall altra parte, perché ad una materia/genere sono associati da 0 ad N volumi. CITA A CITAZIONI CITATO DA Lingua LIBRO MANUALE Lingua NARRATIVA SAGGISTICA DIZIONARIO ALTRO GENERE Prima_lingua Seconda_lingua (0, 1) INCLUSO ABBINATO MATERIA ASSOCIATO 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. 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,, 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à 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, 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, 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 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. AUTORE Data_morte (0, 1) COPIA Codice_copia SCRITTO Anno_pubblicazione (0, 1) (1, N) (1, N) RELATIVA Disponibilità EDITORE PUBBLICAZIONE CITA A CITAZIONI Città_di_appartenenza (0, 1) CITATO DA Lingua LIBRO MANUALE Lingua NARRATIVA SAGGISTICA DIZIONARIO ALTRO GENERE Prima_lingua Seconda_lingua (0, 1) INCLUSO ABBINATO MATERIA ASSOCIATO 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 che sarà anche la chiave dell entità, ed una relazione APPARTENENZA tra l entità appena creata e l entità. 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à 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. 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. L ultimo di questi è l attributo chiave dell entità, 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à 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: AUTORE Data_morte (0, 1) COPIA Codice_copia Disponibilità (0, 1) Città_di_appartenenza (1, N) (1, N) SCRITTO RELATIVA Anno_pubblicazione (0, 1) #Sezione #Scaffale EDITORE PUBBLICAZIONE COLLOCAZIONE POSIZIONE #Ordine_nella_collana APPARTENENZA (0, 1) CITA A (1, N) COLLANA CITAZIONI CITATO DA Lingua LIBRO MANUALE Lingua NARRATIVA SAGGISTICA DIZIONARIO ALTRO GENERE Prima_lingua Seconda_lingua (0, 1) INCLUSO ABBINATO MATERIA ASSOCIATO 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. 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 : 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 AUTORE Tessera_bloccata Multa Tot_Avvisi UTENTE Dati anagrafici Indirizzo Città Via SCRITTO (1, N) Data_riconsegna PRESTITO Data_inizio #Avvisi Numero_telefonico RELATIVA Disponibilità (1, N) Numero_civico CAP Codice_copia COPIA (0, 1) Città_di_appartenenza #Sezione #Scaffale Anno_pubblicazione (0, 1) EDITORE PUBBLICAZIONE COLLOCAZIONE POSIZIONE APPARTENENZA (1, N) #Ordine_nella_collana (0, 1) CITA A CITAZIONI CITATO DA COLLANA Lingua LIBRO MANUALE Lingua NARRATIVA SAGGISTICA DIZIONARIO ALTRO Prima_lingua Seconda_lingua (0, 1) ASSOCIATO GENERE INCLUSO ABBINATO MATERIA Possiamo notare nello schema che ci sono due attributi Lingua relativi alle entità ALTRO e LIBRO, 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à: entità Descrizione Attributi Identificatore Testo che si trova nella tabella (numerico a 6 cifre) (stringa a 80 caratteri) (numerico a 2 cifre) (numerico a 3 cifre) LIBRO Particolare categoria di volume Lingua (stringa a 15 caratteri) Nessuno, perché è un entità figlia MANUALE Particolare categoria di volume - Nessuno, perché è un entità figlia NARRATIVA Particolare categoria di libro - Nessuno, perché è un entità figlia SAGGISTICA Particolare categoria di libro - Nessuno, perché è un entità figlia DIZIONARIO Particolare categoria di manuale Prima_lingua (stringa a 15 caratteri) Nessuno, perché Seconda_lingua (stringa a 15 caratteri; è un entità figlia cardinalità 0, 1) ALTRO Particolare categoria di manuale Lingua (stringa a 15 caratteri) Nessuno, perché EDITORE AUTORE GENERE Soggetto che ha pubblicato un volume Soggetto che ha scritto un volume Es. giallo, horror, avventura, ecc. E associato ad ogni libro di narrativa MATERIA Es. informatica, chimica, meccanica, ecc. E associata ad ogni libro di saggistica e ad ogni manuale che non sia un dizionario COLLANA UTENTE Raccolta di volumi aventi tra loro una certa analogia Colui che prende in prestito dei volumi dalla biblioteca (stringa a 40 caratteri) Città_di_appartenenza (stringa a 30 caratteri; cardinalità 0, 1) (stringa a 15 caratteri) (stringa a 15 caratteri) (stringa a 10 caratteri) Data_morte (stringa a 10 caratteri; cardinalità 0, 1) (stringa a 15 caratteri) (stringa a 25 caratteri) (stringa a 30 caratteri) #Tessera (numerico a 6 cifre) Dati anagrafici: - (stringa a 15 caratteri) - (stringa a 15 caratteri) - (stringa a 10 caratteri) è un entità figlia, e #Tessera - Indirizzo: o Città (stringa a 30 caratteri) o Via (stringa a 30 caratteri) o Numero_civico (numerico a 4 cifre) 10
o CAP (numerico a 5 cifre) - Numero_telefonico (numerico a 10 cifre) Tessera_bloccata (booleano) Tot_avvisi (numerico a 2 cifre) Multa (booleano) POSIZIONE Locazione della biblioteca dove #Sezione (numerico a 3 cifre) si trova un certo volume #Scaffale (numerico a 5 cifre) COPIA Indica le copie di ogni volume Codice_copia (numerico a 2 cifre) Codice_copia Relazioni: relazione Descrizione Entità coinvolte Attributi PRESTITO Associa un utente ad una certa copia di un volume presa in prestito, UTENTE e COPIA Data_inizio (stringa a10 caratteri) 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 COLLOCAZIONE Associa, ad un volume, una certa posizione della biblioteca, che sarà la stessa per tutte le sue copie CITAZIONI Associa un volume ad altri volumi da lui citati SCRITTO Associa un volume agli autori che lo hanno scritto PUBBLICAZIONE Associa un volume all editore che lo ha pubblicato APPARTENENZA Associa un volume alla collana a cui questo appartiene (sempre se il volume appartiene ad una collana) INCLUSO ABBINATO ASSOCIATO Associa ad un libro di narrativa un certo genere Associa ad un libro di saggistica una materia Associa, ad un manuale che non sia un dizionario, una certa materia e POSIZIONE - e AUTORE e EDITORE e COLLANA NARRATIVA e GENERE SAGGISTICA e MATERIA ALTRO e MATERIA - - Anno_pubblicazione (numerico a 4 cifre; cardinalità 0, 1) #Ordine_nella_collana (numerico a 4 cifre) - - - 3. Ristrutturazione dello schema concettuale 3a. Tavola delle operazioni 11
Operazione Tipo operazione Frequenza 1 I 5 volte al giorno 150 volte al mese 2 I 2 volte al giorno 60 volte al mese 3 I 2 volte alla settimana 8 volte al mese 4 I 120 volte al giorno 3600 volte al mese 5 I 20 volte al giorno 600 volte al mese 6 I 80 volte al giorno 2400 volte al mese 7 I 1 volta al mese 8 I 40 volte al giorno 1200 volte al mese 9 I 100 volte al giorno 3000 volte al mese 10 I 100 volte al giorno 3000 volte al mese 11 B 1 volta alla settimana 4 volte al mese 12 B 3 volte alla settimana 12 volte al mese 3b. Tavola dei volumi Concetto Tipo Volume E 60000 LIBRO E 40000 MANUALE E 20000 NARRATIVA E 25000 SAGGISTICA E 15000 DIZIONARIO E 1000 ALTRO E 19000 EDITORE E 200 AUTORE E 10000 GENERE E 25 MATERIA E 50 COLLANA E 480 UTENTE E 20000 POSIZIONE E 60000 COPIA E 15 PRESTITO R 300000 RELATIVA R 120000 COLLOCAZIONE R 60000 CITAZIONI R 180000 SCRITTO R 120000 PUBBLICAZIONE R 60000 APPARTENENZA R 12000 INCLUSO R 25000 ABBINATO R 15000 ASSOCIATO R 19000 3c. Costo delle operazioni e schemi di navigazione Operazione 1: 12
#Tessera Tessera_bloccata Multa Tot_Avvisi Data_riconsegna UTENTE 20000 PRESTITO 300000 AVG = 15 Data_inizio #Avvisi Dati anagrafici Numero_telefonico Indirizzo Città Via Numero_civico CAP Codice_copia AVG = 5 COPIA 60000 Tavola degli accessi Operazione 1 Concetto Costrutto Accessi Tipo operazione UTENTE Entità 1 R Entità 15 R COPIA Entità 15 R Costo operazione 31 R Totale costo 31 * 150 (frequenza operazione) = 4650 Operazione 2: #Tessera Tessera_bloccata Multa Tot_Avvisi Data_riconsegna UTENTE 20000 AVG = 15 Data_inizio PRESTITO 300000 #Avvisi Dati anagrafici Numero_telefonico Indirizzo Città Via Numero_civico CAP Codice_copia AVG = 5 COPIA 60000 Tavola degli accessi Operazione 2 Concetto Costrutto Accessi Tipo operazione UTENTE Entità 1 R PRESTITO Relazione 15 R 13
Costo operazione 16 R Totale costo 16 * 60 (frequenza operazione) = 960 Operazione 3: Data_morte (0, 1) AUTORE AVG = 12 10000 SCRITTO 120000 (1, N) (0, 1) Città_di_appartenenza Anno_pubblicazione (0, 1) AVG = 2 AVG = 2 AVG = 8000 RELATIVA 120000 (1, N) Codice_copia Disponibilità COPIA 15 #Sezione #Scaffale EDITORE 200 AVG = 300 AVG = 1 PUBBLICAZIONE COLLOCAZIONE 60000 AVG = 1 60000 AVG = 1 60000 POSIZIONE APPARTENENZA 12000 (1, N) AVG = 25 #Ordine_nella_collana (0, 1) AVG = 0,2 60000 CITA A AVG = 3 CITAZIONI 180000 AVG = 3 CITATO DA COLLANA 480 Lingua LIBRO 40000 MANUALE GENERE 25 NARRATIVA 25000 AVG = 1 AVG = 1000 INCLUSO 25000 SAGGISTICA Tavola degli accessi 14
Operazione 3 Concetto Costrutto Accessi Tipo operazione Entità 1 W LIBRO Entità 1 W COPIA Entità 2 L RELATIVA Relazione 2 W AUTORE Entità 2 W EDITORE Entità 1 W PUBBLICAZIONE Relazione 1 W POSIZIONE Entità 1 W CITAZIONI Relazione 3 W COLLANA Entità 1 L APPARTENENZA Relazione 1 W GENERE Entità 1 L INCLUSO Relazione 1 W Costo operazione 14 W + 4 R = 18 Totale costo 18 * 8 (frequenza operazione) = 144 Operazione 4: Data_morte (0, 1) AUTORE 10000 AVG = 12 SCRITTO 120000 (1, N) AVG = 2 #Sezione #Scaffale (0, 1) Città_di_appartenenza Anno_pubblicazione (0, 1) AVG = 1 AVG = 1 COLLOCAZIONE 60000 60000 POSIZIONE PUBBLICAZIONE AVG = 300 200 60000 EDITORE AVG = 1 60000 Lingua LIBRO 40000 MANUALE Tavola degli accessi Operazione 4 Concetto Costrutto Accessi Tipo operazione Entità 1 R LIBRO Entità 1 R AUTORE Entità 2 R 15
EDITORE Entità 1 R POSIZIONE Entità 1 R Costo operazione 6 R Totale costo 6 * 3600 (frequenza operazione) = 21600 Operazione 5: AUTORE 10000 Data_morte (0, 1) AVG = 12 SCRITTO 120000 (1, N) AVG = 2 AVG = 3 CITA A 60000 AVG = 3 CITAZIONI 180000 CITATO DA Tavola degli accessi Operazione 5 Concetto Costrutto Accessi Tipo operazione Entità 1 R CITAZIONI Relazione 3 R AUTORE Entità 2 * 3 = 6 R Costo operazione 10 R Totale costo 10 * 600 (frequenza operazione) = 6000 Operazione 6: Data_morte (0, 1) AUTORE 10000 AVG = 12 (0, 1) Città_di_appartenenza SCRITTO 120000 (1, N) AVG = 2 Anno_pubblicazione (0, 1) PUBBLICAZIONE AVG = 300 200 60000 EDITORE AVG = 1 Tavola degli accessi 60000 Operazione 6 16
Concetto Costrutto Accessi Tipo operazione AUTORE Entità 1 R Entità 12 R PUBBLICAZIONE Relazione 1 * 12 = 12 R EDITORE Entità 1 * 12 = 12 R Costo operazione 37 R Totale costo 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) AUTORE 10000 AVG = 12 SCRITTO 120000 (1, N) AVG = 2 60000 Tavola degli accessi Operazione 7 Concetto Costrutto Accessi Tipo operazione AUTORE Entità 1 R SCRITTO Relazione 12 R AUTORE Entità 1 W Costo operazione 13 R + 1W = 14 Totale costo 14 * 1 (frequenza operazione) = 14 Operazione 8: 17
60000 Lingua LIBRO 40000 MANUALE GENERE 25 NARRATIVA 25000 AVG = 1 AVG = 1000 INCLUSO 25000 SAGGISTICA Tavola degli accessi Operazione 8 Concetto Costrutto Accessi Tipo operazione GENERE Entità 1 R Entità 1000 R Costo operazione 1001 R 1000 Totale costo 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 Tessera_bloccata Multa Tot_Avvisi Data_riconsegna UTENTE PRESTITO Dati anagrafici (1, N) RELATIVA Tavola degli accessi Indirizzo AVG = 15 Data_inizio Numero_telefonico #Avvisi 300000 AVG = 20000 Disponibilità AVG = 5 20000 60000 AVG = 2 120000 AVG = 8000 Città Via Numero_civico CAP Codice_copia COPIA 15 Prima fase Seconda fase Operazione 9 Concetto Costrutto Accessi Tipo operazione 18
Prima fase Entità 1 R RELATIVA Relazione 2 R COPIA Entità 2 R UTENTE Entità 1 R Costo prima fase 6 R Seconda fase Entità 1 R COPIA Entità 1 R UTENTE Entità 1 R PRESTITO Relazione 1 W Costo seconda fase 3 R + 1 W Costo operazione (entrambe le due fasi) 9 R + 1 W = 10 Totale costo 10 * 3000 (frequenza operazione) = 30000 Operazione 10: #Tessera Tessera_bloccata Multa Tot_Avvisi Data_riconsegna UTENTE PRESTITO AVG = 5 20000 300000 60000 AVG = 15 Data_inizio #Avvisi Dati anagrafici AVG = 20000 RELATIVA Numero_telefonico Disponibilità (1, N) AVG = 2 120000 Indirizzo AVG = 8000 Città Via Numero_civico CAP Codice_copia COPIA 15 Tavola degli accessi Operazione 10 Concetto Costrutto Accessi Tipo operazione Entità 1 R UTENTE Entità 1 R COPIA Entità 1 R PRESTITO Relazione 1 W RELATIVA Relazione 1 W Costo operazione 3 R + 2 W = 5 Totale costo 5 * 3000 (frequenza operazione) = 15000 Operazione 11: #Tessera 19
Tessera_bloccata Multa Tot_Avvisi Data_riconsegna UTENTE Dati anagrafici Indirizzo Numero_telefonico Data_inizio PRESTITO AVG = 5 300000 60000 #Avvisi AVG = 20000 Disponibilità (1, N) AVG = 2 RELATIVA 120000 AVG = 8000 Città Via Numero_civico CAP Codice_copia COPIA 15 Considerando, ogni settimana, di avere in media 500 volumi in prestito, si ottiene: Tavola degli accessi Operazione 11 Concetto Costrutto Accessi Tipo operazione PRESTITO Relazione 300000 R Entità 500 R UTENTE Entità 500 R Costo operazione 301000 R 300000 Totale costo 30000 * 4 (frequenza operazione) = 1200000 Operazione 12: #Tessera Tessera_bloccata Multa Tot_Avvisi UTENTE 20000 Dati anagrafici Indirizzo Città Via 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 Costrutto Accessi Tipo operazione UTENTE Entità 20000 R UTENTE Entità 2 W Costo operazione 20000 R + 2 W 20000 Totale costo 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_bloccata Multa Data_riconsegna #Tessera UTENTE PRESTITO 20000 AVG = 15 Data_inizio #Avvisi 300000 Dati anagrafici Indirizzo Numero_telefonico Città Via Numero_civico CAP Codice_copia COPIA Tavola degli accessi Operazione 12 Concetto Costrutto Accessi Tipo operazione UTENTE Entità 20000 R PRESTITO Relazione 20000 * 15 = 300000 R UTENTE Entità 2 W Costo operazione 320000 R + 2 W 320000 Totale costo 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_bloccata Multa Tot_Avvisi Data_riconsegna #Tessera UTENTE 20000 PRESTITO 300000 AVG = 15 Data_inizio #Avvisi Dati anagrafici AVG = 20000 Numero_telefonico Indirizzo Città Via Numero_civico CAP Codice_copia AVG = 5 60000 (1, N) RELATIVA AVG = 2 120000 AVG = 8000 COPIA 15 Prima fase Tavola degli accessi Operazione 9 Concetto Costrutto Accessi Tipo operazione Prima fase Entità 1 R COPIA Entità 2 R UTENTE Entità 1 R PRESTITO Relazione 2 R Costo prima fase 6 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, 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à, anche queste saranno collassate nell entità, 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 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, 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à dovrà cambiare da 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 a (0, 1). Dopo le ultime modifiche lo schema diventa: Data_morte (0, 1) #Tessera AUTORE Tessera_bloccata Multa Tot_Avvisi UTENTE Dati anagrafici Indirizzo Città Via SCRITTO (1, N) Data_riconsegna PRESTITO Data_inizio #Avvisi Numero_telefonico (1, N) RELATIVA Disponibilità Numero_civico CAP Codice_copia COPIA (0, 1) Città_di_appartenenza #Sezione #Scaffale Anno_pubblicazione (0, 1) EDITORE PUBBLICAZIONE COLLOCAZIONE POSIZIONE #Ordine_nella_collana CITA A APPARTENENZA (1, N) COLLANA (0, 1) Seconda_lingua (0, 1) Lingua CITATO DA Categoria Sottocategoria CITAZIONI GENERE INCLUSO 3f. Eliminazione degli attributi composti (0, 1) (0, 1) ASSOCIATO MATERIA Si presentano i seguenti attributi composti: #Tessera Tessera_bloccata Multa Tot_Avvisi UTENTE Dati anagrafici Indirizzo Città Via 23 Numero_telefonico Numero_civico
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 UTENTE Indirizzo Numero_telefonico 3g. Eliminazione degli identificatori esterni E presente il seguente identificatore esterno: #Sezione #Scaffale COLLOCAZIONE POSIZIONE Per eliminarlo basta aggiungere la chiave dell entità, ossia, nell entità posizione. Dopo questa modifica si ottiene: #Sezione #Scaffale COLLOCAZIONE 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:, e Data_Nascita. Si è scelta la prima perché è migliore una chiave semplice di una composta. : Come chiavi candidate c erano il codice del volume () e la chiave composta dai seguenti attributi:,, 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:, e. 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,,,, Indirizzo, Numero_telefonico, Tot_avvisi, Multa, Tessera_bloccata) Nota: E stato rinominato #Tessera in Tessera. Volume (,, Edizione, Editore, Anno_pubblicazione, Categoria, Sottocategoria, Lingua, Seconda_lingua, ) Nota: E stato rinominato in Edizione. Autore (Codice_autore,,,, Data_morte) Volume_Autore (Volume, Autore) Nota: Sono stati rinominati 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 e Codice_copia in Volume e Copia. Inoltre la relazione non è stata chiamata Relativa ma Volume_Copie. Editore (, Città_di_appartenenza) Prestito (Volume, Copia, Utente, Data_inizio, Data_riconsegna, Avvisi) Nota: Sono stati rinominati, 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 (, Sezione, Scaffale) Nota: Sono stati rinominati #Sezione e #Scaffale in Sezione e Scaffale. Collana () Volume_Collana (Volume, Collana, Ordine_nella_collana) Nota: Sono stati rinominati (della relazione Collana), #Ordine_nella_collana e 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 in Volume e Volume_citato. Genere () Materia () Volume_Genere (Volume, Genere) Nota: Sono stati rinominati e (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 e (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) (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 (relazione Editore) (relazione Volume) Codice_autore (relazione Autore) Codice_Volume (relazione Volume) Codice_copia (relazione Copia) (relazione Volume) Codice_copia (relazione Copia) Tessera (relazione Utente) (relazione Volume) (relazione Collana) (relazione Volume) (relazione Volume) (relazione Volume) (relazione Volume) (relazione Genere) (relazione Volume) (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, char varying(15) not null, char varying(15) not null, 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 (,, ) )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, char varying(15) not null, char varying(15) not null, date not null, Data_morte date not null )type = InnoDB; create table Editore ( char varying(40) primary key, Città_di_appartenenza char varying(30) default null )type = InnoDB; create table Volume ( numeric(6) primary key, 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), numeric(3) not null default 40, index Ed_index (Editore), foreign key (Editore) references Editore() 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 () 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 () 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 () 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 () on delete cascade on update cascade )type = InnoDB; create table Collana ( 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 () on delete cascade on update cascade, foreign key (Collana) references Collana () 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 () on delete cascade on update cascade, foreign key (Volume_citato) references Volume () on delete cascade on update cascade )type = InnoDB; create table Genere ( char varying(15) primary key )type = InnoDB; create table Materia ( 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 () on delete cascade on update cascade, foreign key (Genere) references Genere () 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 () on delete cascade on update cascade, foreign key (Materia) references Materia () 29
)type = InnoDB; on delete no action on update cascade 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, 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, Sezione, Scaffale,, Edizione, Lingua, Editore, Autore., Autore. FROM Volume, Posizione, Autore, Volume_Autore WHERE = <codice_volume> AND Volume_Autore.Volume = AND Codice_autore = Volume_Autore.Autore AND Posizione.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,, Edizione,, FROM Citazioni, Volume, Autore, Volume_Autore WHERE Citazioni.Volume = <codice_volume> AND = Volume_citato AND Volume_Autore.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,, Edizione, Editore, Anno_pubblicazione FROM Volume, Autore, Volume_Autore WHERE Codice_autore = <codice_dell autore> AND Autore = Codice_autore AND = 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 = 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,, Edizione FROM Volume, Prestito WHERE Data_riconsegna IS NULL AND 31
= 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 = 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 ) (NK vol ) = 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) (NK Gen ) = 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 * 10 6 Accesso con indice: Supponiamo di costruire un indice primario e unclustered, organizzato come un B + -tree e costruito sull attributo (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 = h min = log 2g + 1 NL + 1 = log 2 * 50 + 1 870 + 1 = 3 Il costo di ricerca con indice (C Ind ) sarà dato da: C Ind = costo di accesso all indice (C I ) + costo di accesso ai dati (C D ). 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à: C I = 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 C D : C D = EK * Φ(NR / NC, NP) = EK * NP * (1 (1 1 / NP) NR / NC ) = = 1000 * 10800 * (1 (1 1 / 10800) 60000 / 60000 ) = 1000 Quindi si ottiene: C Ind = C I + C D = 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 * 10 6 Si conclude che, guardando al numero di accessi, è molto vantaggioso creare ed usare un indice sull attributo. 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 è: N max = [(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