< Home
Stampa

Tecnologie di persistenza

Sommario

Persistenza dei dati

Un sistema informatico deve sottostare ad un insieme di vincoli tecnologici. La memoria di un computer è, a basso livello, un array di celle ad accesso casuale che possono esclusivamente contenere valori numerici in forma binaria. Tramite algoritmi e la velocità interna è possibile utilizzare la memoria centrale per rappresentare strutture dati molto complesse, come tabelle, liste, grafi ed alberi e poter quindi utilizzare un livello di astrazione più alto e più vicino al mondo reale.

Tuttavia la memoria centrale è di dimensioni limitate e non memorizza i dati in modo permanente (ovvero non è dotata di persistenza). Inoltre la memoria è protetta, e non consente di condividere i dati tra più applicazioni.

Filesystem

La soluzione individuata fin dagli anni 50 e perfezionata poi coi moderni sistemi operativi, è quella di memorizzare all’interno di strutture dati gerarchiche, i file system, gli archivi dati sotto forma di unità chiamate file, a cui è assegnato un nome, una posizione nell’albero (detto anche cartella) e dei metadati (ad esempio permessi utente). Il file è indipendente dal programma che lo ha creato, ed è progettato per essere accessibile da differenti programmi anche in più sessioni, con un suo ciclo di vita indipendente. I files possono essere copiati, spostati, cancellati, inviati via Internet, ecc.

Le operazioni possibili sono di norma la lettura, la scrittura in append, la sovrascrittura. I file possono essere aperti da più programmi in contemporanea, ma se c’è un accesso in scrittura, di norma il sistema operativo questo rende esclusivo l’accesso ad un solo programma alla volta, per evitare inconsistenze.

Siccome un file è in ultima analisi un array di byte, l’accesso, a livello fisico, è di norma sequenziale, ovvero il file viene letto un byte alla volta. Questo può non costituire un problema per molte applicazioni: il file viene caricato (interamente o parzialmente) in memoria, elaborato e poi salvato interamente o modificato in parte. Ad esempio questo sistema è utilizzato dai software che elaborano testi, fogli di calcolo, immagini, ecc come anche quelle di riproduzione multimediale.

Tuttavia vi sono applicazioni che devono gestire archivi di grandi dimensioni, con un accesso diretto e non sequenziale ai singoli elementi, ad esempio l’accesso ad un tabella con milioni di anagrafiche, o un archivio di log. Un accesso sequenziale è computazionalmente inaccettabile (ha complessità O(n) ). In questo scenario è possibile sfruttare il fatto che ogni riga della tabella ha le stesse dimensioni fisiche, e quindi in base al numero di record ricercato, il sistema calcola la posizione dello stesso nel file. Ad esempio se cerchiamo il record 928 in un archivio dove ogni record occupa 820 bytes, la posizione dove si troverà sarà al byte 760960 (ovvero 928×820). In questo modo è possibile ottenere accesso diretto senza caricare tutto il file, con complessità O(1).

Una soluzione più sofisticata è quella di utilizzare un file indice di dimensioni più piccole, che memorizza la posizione di tutti i record associandola da un attributo chiave (es. cognome oppure data-ora). In questo caso il software carica in memoria il solo indice, ed accede al singolo record a partire dalla posizione nell’indice. La complessità è leggermente superiore a quella dell’accesso diretto, ma viene garantita maggiore flessibilità nelle ricerche ad esempio su stringhe.

Il sistema a filesystem deve il suo punto di forza al fatto che è trasparente per l’utente, che vi può accedere direttamente con applicazioni dedicate (ad esempio “gestione risorse” su Windows o “Finder” su Mac) che consentono all’utente di organizzare i files secondo i propri bisogni, con una struttura ad albero che grazie all’interfaccia del sistema operativo ed opportuni scheumorfismi ricordano la scrivania tradizionale, con i nodi dell’albero denominati “cartelle”, la cartella principale chiamata “scrivania”, la cartella dei files cancellati “cestino”, i documenti di testo rappresentati con icone di un foglio di carta, ecc.

Tuttavia presenta una serie di limitazioni importanti

Questo significa trovarsi di fronte a tre importanti limitazioni:

  • Strutture di dati complesse
    Un file può essere organizzato per memorizzare qualsiasi struttura dati, quindi anche con molte tabelle, o alberi o grafi. Tuttavia questo implica una creazione di indici molto complessa che ha un impatto importante sulle prestazioni. E’ possibile scrivere software dedicati alla gestione di queste strutture dati, ma maggiore è la complessità di questi, minori i vantaggi dell’utilizzo del filesystem, perché i files diventano leggibili solo da questi software, vista la complessità del software che li deve gestire, che di norma, come visto sopra, suddividono l’informazione anche in più file per ottimizzarne l’elaborazione, pertanto un modello dati si trova distribuito su più files. Ad esempio un file di testo può essere modificato da molti programmi, ed anche letto direttamente dall’utente con un semplice editor. Già un file Excel è internamente un XML che per quanto leggibile richiede un software compatibile per essere aperto. E così via per software più complessi, dove è sconsigliato che l’utente editi manualmente il file o anche solo lo sposti da una cartella all’altra.
  • La sicurezza.
    Un filesystem gestisce i permessi di accesso a livello di singolo file o cartella, ma se questo può andare bene per applicazioni semplici, in un sistema di gestione dati complesso la sicurezza ed i permessi di accesso di files complessi richiedono una gestione più granulare sia perché ci sono files multipli, sia perché all’interno dello stesso file ci sono dati di differente livello di accesso. E’ necessario utilizzare software dedicati, gli unici ad avere accesso, che ne controllano il modo in cui l’utente può manipolare i dati.
  • La concorrenza.
    In un sistema informativo complesso deve essere previsto l’accesso in contemporanea agli stessi dati. Si pensi ad un sistema bancario o un ecommerce: in ogni istante sono molti gli utenti che stanno usando il sistema ed è necessario quindi gestire l’integrità, la coerenza dei dati, in un contesto dove l’accesso è in parallelo. Tuttavia in un file l’accesso in scrittura è esclusivo per singola operazione, e quindi anche in questo caso il filesystem presenta limiti logici e tecnologici strutturali che limitano queste funzionalità.

Database e RDBMS

Tutte queste problematiche sono emerse sin dagli anni 60, da quando sono stati sviluppati prodotti software per gestire grandi strutture dati, come le banche dati della pubblica amministrazione americana, o il programma spaziale della NASA. La soluzione individuata sono software dedicati alla gestione dei dati, ovvero i DBMS (DataBase Management System), che possiamo definire come sistemi informatici in grado di gestire grandi collezioni di dati collegati tra loro, condivise tra più utenti e con una gestione diretta della persistenza e della sicurezza.

La caratteristica fondamentale di un DBMS è che non è un prodotto specifico per risolvere uno specifico problema software, ma è un sistema che consente di definire di creare strutture dati specifiche per singoli modelli concettuali, chiamate database. In pratica il DBMS consente sia di creare la struttura dati specifica per uno specifico database, sia di gestire visualizzazione, ricerca, inserimento, cancellazione e modifica dei dati del database stesso. Il DMBS è in grado poi di gestire internamente utenti, permessi, concorrenza, eventi ed operazioni multiple sulla base dati.

A partire dagli anni 70 è stato introdotto il database relazionale (RDBMS), che si basa sulla creazione di grafi dove i nodi sono tabelle di entità e gli archi sono le relazioni tra tabelle. Questo modello, pur subendo migliorie e perfezionamenti nel tempo, nonché diverse varianti, è il sistema che si usa ancora oggi nella quasi totalità dei sistemi di gestione dati.

SQL

La grande differenza tra un database ed un file, è che mentre con i file il modulo software che li gestisce è interno all’applicazione che li gestisce, parte di un ecosistema che gestisce manipolazione logica e fisica nello stesso software, nel database la separazione è netta: il software si occupa di gestione e manipolazione dati, ma per la persistenza non li scrive direttamente, ma comunica col database tramite un linguaggio di interrogazione del database.

Questo linguaggio si chiama SQL (Structured Query Language) è stato standardizzato (fin dal 1972!). Gli RDBMS moderni sono, e tra questi citiamo i due prodotti commerciali Oracle DB e Sql Server, rispettivamente di Oracle e Microsoft, ed i due prodotti open-source più noti, ovvero Mysql/MariaDB e PostgreSQL. Mysql è anch’esso di proprietà di Oracle, con licenza libera, MariaDB è invece totalmente open. Ognuno di questi RDBMS ha una propria variante di SQL, ma rispetta comunque lo standard ufficiale, proponendo delle proprie estensioni (alcuni sono dei veri e propri linguaggi secondo il teorema di Bohm-Jacopini, come PL-SQL per Oracle, T-SQL per Sql Server).

SQL è diviso in due parti:

  • DDL (Data Definition Language): permette di creare la struttura di database
  • DML (Data Manipulation Language): permette la gestione dei dati, ricerche, modifiche, ecc.

Anatomia di un RDBMS

Vediamone le caratteristiche principali:

  • un RDBMS garantisce netta separazione tra il layer logico e quello fisico: l’utente non ha accesso diretto ai dati dei file che internamente usa il database.
  • Viene garantita integrità e consistenza: le query sui dati sono eseguite secondo le regole stabilite per quel database;
  • E’ supportata la concorrenza: due o più utenti possono accedere al database in parallelo. E’ il RDBMS a garantire il rispetto delle condizioni di Bernstein e delle race conditions in generale;
  • La sicurezza: è possibile creare utenti che hanno accesso a singole porzioni del database.
  • Accesso diretto: l’utente che dispone di accesso può eseguire manualmente le query sul database, controllandolo direttamente e verificando il contenuto dei dati.
  • Accesso automatizzato: sono disponibili API che consentono di accedere database, e scambiare dati. Queste sono usate dai software applicativi per accedere al database esclusivamente tramite SQL.

Di norma un database prevede tre tipologie di accesso:

  • il DBA (DB Admin): si occupa dell’uso del DDL per creare la struttura del database;
  • lo sviluppatore/utente esperto: usa DML per leggere e scrivere sul database;
  • il software applicativo: usa sia DDL che DML secondo la sua programmazione per creare modificare il database (in fase di setup) e di gestire i dati (in fase di produzione).

Conclusioni

Per gestire la persistenza dei dati abbiamo visto le due tecnologie principalmente utilizzate:

  • il filesystem: consente di memorizzare gli archivi dati in unità chiamate files, dotate di nome, metadati e posizione in una struttura gerarchica ad albero, gestita dal sistema operativo. L’utente ha accesso ai files, ed i files di norma sono accessibili a diverse applicazioni, anche in contemporanea (se in lettura) o esclusiva (se il scrittura). Il file è adatto a molte applicazioni per la sua immediatezza e semplicità, ma non va bene per gestire strutture complesse, sicurezza granulare, concorrenza e integrità.
  • RDBMS: software dedicati che consentono di creare strutture dati persistenti e personalizzate per risolvere un determinato modello di realtà. Usano grafi di tabelle collegate tramite relazioni, e consentono l’accesso tramite un linguaggio standardizzato, SQL, che consente di creare il database e di manipolare i dati. Possono essere utilizzati sia dagli utenti che da sistemi automatici tramite API.