Unità D1 Archivi: i concetti fondamentali Obiettivi • Conoscere le diverse organizzazioni logiche degli archivi • Conoscere le operazioni di base che si possono effettuare sugli archivi • Sapere come progettare un archivio a seconda delle proprie esigenze • Sapere quale tipo di archivio utilizzare a seconda delle proprie esigenze Necessità di dati persistenti • Nelle prime applicazioni informatiche non vi era nulla che dovesse essere registrato o mantenuto in memoria per una successiva elaborazione; il risultato era semplicemente acquisito da chi ne aveva necessità e l’algoritmo veniva conservato su un qualche supporto digitale solo se necessario. • Oggi, soprattutto nei software gestionali, ma non solo, risulta necessario il mantenimento dell’informazione (bolle, fatture, appuntamenti, dati di magazzino). Persistenza – archivi e file • La persistenza dei dati è la proprietà che li rende durevoli nel tempo, consentendo a essi di essere riutilizzati. • Un archivio è un’entità all’interno della quale sono memorizzati dati, che garantisce la persistenza degli stessi. • Il termine archivio in inglese può essere considerato equivalente a file, anche se in realtà un archivio è un elemento molto più complesso: può essere sia un file, sia un insieme di file. I dati negli archivi: record • In un archivio, i dati sono mantenuti mediante strutture predefinite, che consentono di connettere logicamente gruppi di dati tra loro attinenti. • Un record è un insieme di informazioni attinenti a una stessa entità • Un dato è una qualsiasi stringa, numero o altro tipo di valore, mantenuto in un archivio. • L’informazione è un dato che, inserito in uno specifico contesto, acquisisce un preciso significato. Un esempio di record • Si immagini di voler memorizzare l’anagrafica degli studenti di una scuola, e quindi di voler salvare per ogni studente le seguenti informazioni: – – – – nome; cognome; classe; ripetente. • In questo caso, un record è una struttura che comprende tutte le informazioni attinenti a uno studente (nome, cognome, classe …) Il concetto di chiave • La chiave è un campo o insieme di campi che individua in modo univoco un singolo record. • Nell’esempio si potrebbe scegliere come chiave l’insieme dei campi: nome + cognome + classe. Chiavi artificiali • In alternativa, si potrebbe semplicemente aggiungere un codice identificatore, in genere abbreviato con la sigla id, che identifichi univocamente ogni studente della scuola. Organizzazioni logiche degli archivi • • • • File di testo File CSV File XML Archivi binari File di testo • Un archivio organizzato come file di testo contiene un insieme di i caratteri e può essere scritto mediante qualsiasi editor di testo. • È di un tipo di archivio molto semplice, è ancora oggi estesamente utilizzato. • Può essere utilizzato per esempio come file di configurazione per un’applicazione. I caratteri:ASCII - UNICODE • Il codice ASCII è il più diffuso e utilizza 8 bit per rappresentare un carattere • Java utilizza il codice UNICODE in cui i caratteri vengono rappresentati con 16 bit. Un esempio di file di testo • Windows utilizza il file di testo per salvare alcuni dati di configurazione nel file win.ini: … [fonts] [extensions] [mci extensions] [files] [MCI Extensions.BAK] aif=MPEGVideo aifc=MPEGVideo aiff=MPEGVideo asf=MPEGVideo asx=MPEGVideo au=MPEGVideo ... File CSV • Un file CSV (Comma Separeted Values), è un file di testo in cui ogni riga rappresenta un record, composta da campi divisi da un carattere separatore, solitamente una virgola. • Ogni riga contenga un record, quindi ogni record è separato dalla sequenza di caratteri CR + LF (Carriage Return + Line Feed), rispettivamente per ritornare all’inizio della riga e per aggiungere una riga al file. • Ogni riga contiene i campi da memorizzare separati tra loro da una virgola. Nel caso in cui la virgola sia un carattere utilizzato nei campi, si può sostituire il carattere separatore utilizzando, per esempio, il punto e virgola. Un esempio di file CSV Andrea,Rossi,4B,No Gianluca,Verdi,3B,Si Andrea,Rossi,5A,No Sonia,Rossi,4C,No Romina,Verdi,4B,No • I file di tipo CSV sono attualmente utilizzati per lo scambio di dati tra sistemi differenti, come per esempio vecchie applicazioni DOS e moderne applicazioni con interfacce grafiche, che operano su piattaforme completamente incompatibili. File XML • Un file XML (eXtensible Markup Language) è un file di testo composto da tag e con una struttura ad albero con un solo nodo radice. • I tag servono per esplicitare il significato del contenuto, e che sono precedute dal simbolo di minore (“<”) e seguite da quello di maggiore (“>”). • Per esempio, <studente> è un tag. • Per ogni tag di apertura ne esiste uno di chiusura, formalizzato nel modo seguente: </studente>. • I file XML sono utilizzati per memorizzare dati, per scambiare dati e messaggi tra applicazioni, o come file di configurazione. Un esempio di file XML <?xml version=”1.0” encoding=”ISO-8859-1”?> <studenti> <studente> <nome>Andrea</nome> <cognome>Rossi</cognome> <classe>4B</classe> <ripetente>No</ripetente> </studente> <studente> <nome>Gianluca</nome> <cognome>Verdi</cognome> <classe>3B</classe> <ripetente>Si</ripetente> </studente> … <studente> <nome>Romina</nome> <cognome>Verdi</cognome> <classe>4B</classe> <ripetente>No</ripetente> </studente> </studenti> Archivi binari • Un archivio binario è composto da una sequenza di byte continua • Per identificare i record, è necessario sapere a priori la loro esatta posizione. • Se i record sono di lunghezza fissa, per saltare al record N, con N >= 0, è sufficiente applicare la formula seguente: posizioneRecordN = N * (lunghezzaRecordInbyte) Tipi di accesso ai dati • Archivi ad accesso sequenziale • Archivi ad accesso diretto • Archivi indicizzati Archivi ad accesso sequenziale • Gli archivi ad accesso sequenziale consentono di accedere a un record solo partendo dall’inizio e scorrendo tutti quelli che lo precedono. • E’ opportuno solo per archivi di piccole dimensioni, o per archivi utilizzati da applicazioni particolari che hanno bisogno di leggere i dati solo in modo sequenziale. • Nel caso in cui la lunghezza dei record sia fissa, scorrere l’archivio risulta abbastanza semplice utilizzando la formula vista in precedenza. • Nel caso di record a dimensione variabile è necessario utilizzare vari accorgimenti, per esempio scrivere prima del record un numero che indica la quantità di byte occupati, in modo da sapere quanti se ne devono ancora leggere per caricare un record intero. Archivi ad accesso diretto • Un archivio ad accesso diretto consente di accedere direttamente a qualsiasi record senza dovere scorrere l’intero file. • Gli archivi ad accesso diretto (detto anche casuale o random) risolvono i problemi di utilizzo e di prestazioni degli archivi ad accesso sequenziale. • Se i record dell’archivio sono a lunghezza fissa è possibile “saltare” direttamente al primo byte di un record posizioneRecordN = N * (lunghezzaRecordInbyte) • Se i record sono a lunghezza variabile è necessaria l’indicizzazione Archivi indicizzati • Un file indice di un archivio memorizza in modo ordinato rispetto alle chiavi, la chiave stessa del record e la posizione di questo nel file dei dati. • Se la dimensione dei record è fissa, il file indice potrà contenere solo il numero del record nel file di dati; se invece la dimensione è variabile, è necessario indicare la posizione espressa in byte. • Un archivio indicizzato consente di ordinare i record rispetto a una chiave. • Questa soluzione rende necessaria solo la modifica del file indice ogniqualvolta si effettua un inserimento di un nuovo record, una cancellazione o un riordinamento dei dati. Approfondimento: XML • Il formato XML ha avuto nel corso degli ultimi anni un grande impulso, dovuto alla necessità sempre più diffusa di trovare uno standard utilizzabile su piattaforme e sistemi operativi differenti. • Questo formato, infatti, può essere letto e compreso dall’uomo ma è anche facilmente interpretabile mediante i parser, ovvero componenti specifici già presenti nella maggior parte dei linguaggi di programmazione, che consentono di leggere e aggiornare direttamente i nodi di un file XML. • Il .NET Framework mette a disposizione delle librerie dedicate alla gestione dei contenuti XML • Anche in Java esistono diversi package che consentono di gestire file XML, (es. javax.xml della Sun e Xerces di Apache Group) Esempio di file indicizzato • Il primo campo del file indice rappresenta la chiave numerica adottata e corrisponde al primo campo del file di dati; il secondo campo del file indice indica invece la posizione del record (partendo da 0) all’interno del file di dati. Più indici • È possibile creare più di un file indice per ogni file di dati, ciascuno di questi ordina i record in base a chiavi diverse • In questo modo, si potrà utilizzare l’indice più opportuno a seconda dell’ordinamento desiderato. Operazioni sugli archivi • Il modo in cui si effettuano le operazioni sugli archivi può variare in base al linguaggio di programmazione utilizzato, ma prevede sempre le seguenti operazioni fondamentali: – – – – – – apertura dell’archivio; lettura di un record; scrittura di un record; modifica di un record; cancellazione di un record; chiusura dell’archivio. Apertura di un archivio • L’apertura di un archivio è un’operazione che deve essere necessariamente effettuata prima di poter eseguire qualsiasi tipo di operazione su di esso. • Un archivio non è necessariamente composto da un singolo file, ma può essere costituito da un insieme di questi. • Qualsiasi operazione si esegua, deve essere sempre compresa tra una di apertura e una di chiusura dell’archivio. Chiusura di un archivio • La chiusura in alcuni casi è fondamentale per confermare le modifiche effettuate; senza di essa l’archivio rimarrebbe immutato rispetto al suo stato precedente l’apertura. • Talvolta però i sistemi che eseguono i programmi agevolano il programmatore chiudendo l’archivio nel caso in cui termini il programma, senza che sia stata effettuata una chiusura esplicita. Lettura, scrittura e modifica • La lettura di un record è un’operazione che si può definire invariante, in quanto non modifica lo stato dell’archivio, ma si limita a leggere dati contenuti al suo interno. • Al contrario, le operazioni di scrittura, modifica e cancellazione alterano lo stato dell’archivio modificando i dati in esso contenuti. Cancellazione • Cancellazione fisica – Il record cancellato viene definitivamente eliminato dall’archivio. – Può comportare la riorganizzazione di tutto l’archivio, a seconda del tipo di organizzazione logica implementata ed eventuali indicizzazioni presenti. – Nel caso di archivi di notevoli dimensioni risulta onerosa in termini di tempo di CPU. • Cancellazione logica – Il record viene marcato logicamente ma non eliminato dall’archivio. – In un secondo momento, quando vi è un carico limitato di lavoro (spesso di notte), o su indicazione esplicita di un addetto alla base di dati, questi record sono cancellati fisicamente e l’archivio viene riorganizzato, per esempio compattando le parti vuote lasciate dalle cancellazioni. Fattori che influenzano la scelta di organizzazione di un archivio • I fattori da tenere in considerazione per la scelta della tipologia di organizzazione di un archivio sono i seguenti: – quantità di dati; – tipi di dato; – relazioni tra i dati.