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