Tesi di Lamuraglia Federica

Transcript

Tesi di Lamuraglia Federica
Sommario
Sommario .......................................................................................................................... 1
CAPITOLO 1: DBMS ....................................................................................................... 2
Introduzione ...................................................................................................................... 2
1.1 DBMS ...................................................................................................................... 4
1.2 Il modello relazionale ............................................................................................... 5
1.3 Il modello non relazionale ........................................................................................ 8
1.3.1 Classificazione dei database non relazionali ..................................................... 13
1.3.2 Vantaggi e svantaggi dei db non relazionali ...................................................... 15
1.4 Dbms relazionali e non: elementi a confronto ........................................................ 17
CAPITOLO 2: MYSQL E MONGODB ........................................................................ 19
2.1 MySql ..................................................................................................................... 19
2.1.1 Caratteristiche.................................................................................................. 19
2.2 Mongo DB ............................................................................................................. 24
2.2.1 La nuova filosofia di MongoDB ...................................................................... 28
2.3 Comparazione tra MongoDB e MySQL ................................................................. 30
CAPITOLO 3: CASO STUDIO EFFICIENTOMETRO ............................................... 32
Introduzione .................................................................................................................... 32
3.1 Database dell’efficientometro ................................................................................. 33
3.2 Principi di progettazione ........................................................................................ 34
3.3 Siope ...................................................................................................................... 37
3.4 Megafile ................................................................................................................. 38
3.5 Aggregazione dei dati ............................................................................................. 39
3.6 Piattaforma Web .................................................................................................... 40
3.7 Ulteriore sviluppo .................................................................................................. 41
Conclusioni...................................................................................................................... 42
BIBLIOGRAFIA ............................................................................................................ 43
SITOGRAFIA................................................................................................................. 44
1
CAPITOLO 1: DBMS
Introduzione
L'affermarsi e il dispiegarsi della diffusione della tecnologia digitale ci ha proiettati in
una nuova era: quella dell'informazione veloce e del capitalismo informazionale. Si tratta di
una nuova forma di organizzazione produttiva e sociale legata all'economia delle reti digitali
e dei flussi informazionali.
E' la New Economy che porta a definire quella attuale come l’era dell’informazione: il
mondo economico si rende sempre più conto che vince sul mercato globale chi meglio sa
accumulare e gestire l’informazione.
La società dell'informazione trova la sua origine in quella di "società post-industriale"
ed è stata usata per la prima volta nel 1973 da Daniel Bell, ordinario di sociologia a Harvard,
che sta ad indicare una società moderna che, giunta al culmine del processo di
industrializzazione, deve, per continuare a crescere, concentrare i propri sforzi verso la
produzione non più di beni materiali bensì di servizi immateriali. Servizi immateriali che si
identificano maggiormente nelle tecnologie informatiche che hanno cambiato sia il mondo
della produzione che quello dei consumi dando luogo ad un nuovo mercato
dell'informazione. Il carattere fondamentale del progresso scientifico-tecnologico non sta
solo nell'aver accesso alle informazioni e nel consultarle, selezionarle ed estrarle, ma
soprattutto nel saperle mettere in relazione tra loro ed elaborarle in maniera creativa per
restituire un prodotto innovativo. Tutto ciò fa dell'informazione una merce pregiata, una
risorsa strategica capace di incidere pesantemente sullo sviluppo e sugli assetti socioeconomici di ogni Paese.
Di conseguenza il valore dell’azienda non è più determinato solo dagli asset fisici ma
soprattutto dalle informazioni che possiede. I progressi della tecnologia informatica ed in
particolare dei database hanno permesso di gestire grandi quantità di dati da cui ottenere
sempre maggiori informazioni.
L'obiettivo del presente lavoro è la definizione di un sistema informatico costituito da
un modello di dati (DBMS) e da una piattaforma web, focalizzando sia le questioni teoriche
sia gli aspetti operativi.
La presente trattazione ha origine dall’esperienza professionale nel campo
dell’Information Technology e dalla collaborazione con SER and Practices Srl nella
2
realizzazione di un sistema informatico, “l’Efficientometro”. Si tratta di un sistema che ha
l’obiettivo di mettere in evidenza entrate e uscite degli enti pubblici. Uno strumento che ora
tocca soprattutto ai cittadini imparare ad utilizzare per giungere ad una cultura del controllo
diffuso sull’utilizzo del denaro pubblico. Ovviamente occorre ancora lavorare per rendere
l’efficientometro più efficace.
Nel presente lavoro si è partiti da una descrizione approfondita dei DBMS per mettere
in luce le caratteristiche fondamentali di questi strumenti di archiviazione dati. In particolare
sono stati messi a confronto il modello relazionale e non relazionale in quanto modelli
utilizzati nel progetto svolto in azienda. Successivamente si è passati all’analisi del caso
studio, l’Efficientometro, dove sono stati messi in luce gli elementi che compongono questo
sistema informatico: database e piattaforma web.
Ho cercato di unire le mie consolidate conoscenze di teoria e pratica dei Database e
del Project Management acquisite durante l'esecuzione del master, con le nuove conoscenze
acquisite in azienda riguardo definizione, reperimento, aggregazione e strutturazione dati ma
anche competenze riguardanti la sfera organizzativa; quindi organizzazione del lavoro,
rispetto delle scadenze e tutto ciò che serve per rispettarle.
3
1.1 DBMS
Nello svolgimento di qualunque attività, sono fondamentali la disponibilità di
informazioni e la capacità di gestirle in modo efficace. Ed è proprio con questo scopo che la
tecnologia dei database è oggi largamente utilizzata. Nel corso degli ultimi 40 anni l’utilizzo
dei database ha avuto uno sviluppo esponenziale. Si è passati dal suo uso in grandi computer
limitato ad un impiego da parte di poche persone molto specializzate alla situazione attuale
che vede installato su ogni PC Workstation un qualche applicativo che si basa su database.
Persino navigare in Internet significa sempre più avere a che fare con siti Web che spesso
basano il loro funzionamento su di un database. Gli stessi motori di ricerca non sono altro
che enormi database di catalogazione di pagine web.
Il termine database è perciò diventato di largo utilizzo, alle volte impropriamente. Urge
pertanto, prima di iniziare a parlarne nei dettagli, una sua definizione. Un database è una
collezione di dati associati tra loro, conservati in modo persistente in file. I dati sono
rappresentazioni di fatti registrabili che hanno un significato implicito.
La precedente definizione è alquanto generale e permetterebbe di considerare anche
questo stesso testo, essendo un insieme di dati collegati tra loro, come un database.
Solitamente però il termine database ha un significato più ristretto. Implicitamente il concetto
di database porta con sé le seguenti proprietà:
-
Un database è concepito per modellare un qualche aspetto del mondo reale,
che alcuni autori chiamano miniworld. Modifiche al miniworld sono
rispecchiate nel database;
-
L’ insieme dei dati che compone un database è logicamente coerente e possiede
un significato. Un assortimento casuale di dati non può essere considerato un
database;
-
Un database è disegnato, costruito e popolato di dati per uno scopo ben
definito. Un gruppo di utilizzatori è designato al suo uso, essi sono interessati
alle applicazioni per le quali il database è stato concepito.
I meccanismi e i dettagli operativi necessari alla registrazione fisica dei dati sono astratti
dagli utenti tramite un DBMS (database management system) che è un insieme di programmi
che permette di creare, mantenere e modificare un database. Esistono diverse modalità
tramite le quali un DBMS può implementare queste funzionalità ma, negli anni, la tipologia
che è risultata di gran lunga più popolare è quella che si basa sul modello dati relazionale.
4
1.2 Il modello relazionale
Il modello relazionale organizza i dati in un database tramite una collezione di relazioni.
Informalmente ogni relazione è rappresentata da una tabella. Formalmente, una
relazione è un insieme di definizioni di predicati, come per esempio “Michele è di Bari”, dove
“Michele” è il soggetto e “è di Bari” è il predicato. I dati “Michele” e “Bari” sono collegati
tra loro da una relazione (nel senso che un dato è relativo all’altro).
Il modello relazionale fu definito per la prima volta da E. F. Codd (1970)1 e
successivamente esteso da altri autori. Lo scopo di Codd fu di superare le limitazioni dei
modelli dell’epoca che non permettevano di realizzare la proprietà di indipendenza tra le
strutture fisiche dei dati e la loro descrizione logica.
Il modello relazionale è basato sul concetto di relazione, che ha solide fondamenta
nella teoria degli insiemi. Tuttavia, nonostante derivi da una formalizzazione molto precisa e
apparentemente complessa, è ricondotto ad alcuni concetti di natura più semplice ed intuitiva
che ne hanno decretato il successo.
Nel definire il modello relazionale, Codd fornì 13 regole per la visualizzazione della
relazione nella forma di tabella, numerate da 0 a 12:
1. Perché un sistema si possa qualificare come un database relazionale esso deve
usare le sue funzioni relazionali per gestire il database;
2. Regola dell’informazione: tutta l’informazione nel database deve essere
rappresentata in un unico modo, nominalmente, da valori posizionati in
colonne nelle righe delle tabelle;
3. Regola della garanzia di accesso: ogni valore memorizzato in un DataBase
relazionale deve essere accessibile indicando il nome della tabella in cui si trova,
il nome della colonna e il valore della chiave primaria che definisce la riga in
cui è memorizzato;
4. Gestione sistematica dei valori nulli (NULL): il DBMS (il sistema di gestione
del database) deve supportare una rappresentazione dei valori mancanti e delle
informazioni inapplicabili che sia sistematica, distinta da altri valori regolari e
indipendente dal tipo di dato (Codd pensava a due distinte rappresentazioni,
Edgar F. Codd nacque a Portland su un’isola nella contea del Dorset in Inghilterra e studiò matematica e
chimica all’Exeter College dell’Università di Oxford. Nel 1948 si trasferì a New York per lavorare per l’IBM
come programmatore matematico. Negli anni ’60-’70, mentre lavorava per IBM, creò il modello relazionale per
la gestione delle basi di dati, pubblicando “A Relational Model of Data for Large Shared Data Banks”, nel 1970.
1
5
token, per i valori mancanti e le informazioni inapplicabili, mentre poi l’Sql le
ha unificate);
5. Dizionario basato sul modello relazionale: la descrizione logica del DataBase
relazionale deve essere rappresentata allo stesso modo di un dato ordinario, in
modo che gli strumenti del sistema di gestione del DataBase relazionale si
possano usare per gestire la descrizione stessa del DataBase;
6. Linguaggio dei dati: un sistema di gestione di DataBase relazionale può offrire
molti tipi di linguaggi di descrizione dei dati e di accesso al database; comunque
ci deve essere almeno un linguaggio che (a) ha una sintassi lineare; (b) può
essere utilizzato sia interattivamente che all’interno di programmi; (c) supporta
la definizione dei dati e delle viste, la loro manipolazione, i vincoli di integrità
dei dati, la gestione delle informazioni riguardanti le autorizzazioni e le
operazioni di gestione delle transazioni;
7. Aggiornamento delle viste: deve essere possibile al sistema di gestione del
database aggiornare qualunque vista che possa essere definita usando
combinazioni di tabelle base che, in teoria sono aggiornabili a loro volta
(l’aggiornamento delle viste è un problema complesso);
8. Inserimento, Aggiornamento e Cancellazione: qualunque operando che
descriva il risultato di una singola operazione di lettura deve poter essere
applicato ad una singola operazione di inserzione, aggiornamento o
cancellazione;
9. Indipendenza fisica dei dati: le modifiche che vengono apportati alla struttura
fisica di memorizzazione e ai meccanismi di accesso non devono comportare
cambiamenti nei programmi applicativi;
10. Indipendenza logica dei dati: i cambiamenti effettuati sulle tabelle che non
modificano nessuno dei dati già memorizzati non devono comportare
cambiamenti ai programmi applicativi;
11. Regole di Integrità: le regole che si applicano all' integrità di entità e all' integrità
referenziale devono essere esprimibili nel linguaggio dei dati implementato dal
sistema di gestione del database e non con i comandi codificati nei programmi
applicativi;
12. Distribuzione del database: il linguaggio dei dati implementato dal sistema di
gestione del database deve offrire la possibilità di distribuire il database senza
richiedere modifiche ai programmi applicativi. Questa opportunità deve essere
6
fornita indipendentemente dalla capacità del DBMS di supportare i database
distribuiti;
13. Non-sovversione: se il sistema di gestione del database offre strumenti che
consentano ai programmi applicativi di operare sulle tabelle una riga alla volta,
ad un programma applicativo che usa questo tipo di accesso al database deve
essere impedito di infrangere le regole di integrità di entità o integrità
referenziale definite per quello stesso database.
La lista appena riportata identifica le 13 regole originarie, che nella seconda versione
del modello relazionale divennero ben 333. Codd specificò, inoltre, altri elementi necessari,
che non verranno trattati in questo elaborato (tra questi, 9 funzioni strutturali, 3 funzioni di
integrità e 18 funzioni di manipolazione).
7
1.3 Il modello non relazionale
I sistemi di gestione di basi di dati relazionali oggi sono la tecnologia predominante
per la memorizzare di dati strutturati per applicazioni web e aziendali. Da quando Codds
pubblicò l’articolo “A relational model of data for large shared data banks” del 1970, questo metodo
di archiviazione di dati è stato ampiamente adottato ed è stato spesso considerato come la
migliore alternativa per la memorizzazione di dati.
Negli ultimi anni una serie di nuovi sistemi sono stati progettati per fornire una buona
scalabilità orizzontale al fine di ottenere elevate prestazioni nelle operazioni di
scrittura/lettura su database distribuiti su più server, in contrasto con i database tradizionali
che hanno poche possibilità di essere scalabili orizzontalmente2.
Molti di questi nuovi sistemi sono chiamati NoSQL data stores. La definizione di
NoSQL, che sta per “Not Only SQL” o “Not Relational”, fu usata per la prima volta nel 1998
per una base di dati relazionale open source che non usava un’interfaccia SQL. Il termine fu
reintrodotto nel 2009 dall’impiegato di Rackspace, Eric Evans, quando Johan Oskarsson di
Last.fm volle organizzare un evento per discutere di basi di dati distribuite open source. Il
nome fu un tentativo per descrivere l’emergere di un numero consistente di sistemi di
archiviazione dati distribuiti non relazionali che spesso non tentano di fornire le classiche
garanzie ACID riferendosi a sistemi come MySQL, MS SQL e PostgreSQL.
NO-SQL è un movimento che negli ultimi anni si è molto affermato, producendo dei
risultati soddisfacenti con la creazione di progetti e iniziative utilizzate anche su larga scala.
Tale movimento vuole “rompere” la storica linea dei database relazionali e definire delle
nuove linee guida per l’implementazione di database che non utilizzano il linguaggio di
interrogazione SQL e non siano strettamente legati ad una definizione “rigida” dello schema
dati.
Generalmente i sistemi NoSQL hanno delle caratteristiche in comune che possono
essere riassunte nei seguenti punti:

Abilità di scalare orizzontalmente semplici operazioni su più server, con il
vantaggio di supportare un gran numero di semplici operazioni in
lettura/scrittura, questo metodo di elaborazione dati è chiamato OLTP, Online
Transaction Processing, che ha lo scopo di supportare un gran numero di
Con il termine scalabilità orizzontale si intende l’abilità di distribuire i dati e il carico di queste semplici
operazioni su molti server, senza RAM o dischi di archiviazione condivisi.
2
8
piccole transazioni on-line, con un’elevata velocità nell’elaborazione delle
interrogazioni, mantenendo l’integrità dei dati in ambienti multiaccesso e
l’efficacia di esecuzione di un gran numero di transazioni al secondo;

Abilità di replicare e distribuire i dati su più server;

Un modello di concorrenza delle transazioni non basato sulle proprietà ACID
della maggior parte dei database relazionali. Alcuni suggeriscono l’acronimo
BASE (Basically, Available, Soft state, Enetually consistent). L’idea è che
rinunciando ai vincoli ACID si possano ottenere prestazioni elevate e maggiore
scalabilità;

Un uso efficiente di indici distribuiti e RAM per la memorizzazione dei dati;

Abilità di aggiungere dinamicamente nuovi attributi ai record di dati.
Negli ultimi due anni il movimento NoSQL ha attirato un gran numero di imprese e
aziende, che sono passate dai database relazionali agli archivi di dati non relazionali. Alcuni
esempi sono Cassandra3 originariamente sviluppato all’interno di Facebook e oggi usato
anche da Twitter e Digg, Project Voldemort4 sviluppato e usato da Linkedln, servizi di cloud
come il database NoSQL di Amazon SimpleDB5, il servizio di memorizzazione e
sincronizzazione Cloud Ubuntu One basato sul database non relazione CouchDB6.
La maggior parte dei database NoSQL hanno adottato le idee di Bigtable di Google e
Dynamo di Amazon, che hanno fornito una serie di concetti che hanno ispirato molti degli
attuali data stores.
Come si può vedere i pionieri del movimento NoSQL sono grandi compagnie web o
imprese che gestiscono importanti siti web come Google, Facebook e Amazon e altri che in
questo campo hanno adottato queste idee per venire incontro alle loro esigenze e requisiti.
Perciò una delle principali motivazioni per l’uso di tali database è la necessità di
sviluppare nuove applicazioni che non possono essere affrontate con il tradizionale
approccio relazionale.
Cassandra è un database management system non relazionale rilasciato con licenza open source e ottimizzato
per la gestione di grandi quantità di dati.
4
Project Voldemort ha come suo punto di forza la propensione allo scaling orizzontale in modo semplice,
veloce e performante. Questo database prevede anche la distribuzione di server in diversi data center dislocati
in qualsiasi parte del globo.
5
SimpleDB è un database presentato da Amazon, basato su servizi web a disposizione di chiunque voglia creare
siti dinamici di (relativamente) piccole dimensioni.
6
Apache CouchDB è scritto in Erlang ed è opensource, usa json per definire la struttura di un elemento, ed è
pensato per ridurre il gap tra database document oriented e database relazionali grazie alla creazione dinamica
di view in Javascript che permettono di visualizzare e manipolare dati in una classica struttura a tabelle.
3
9
La ricerca di alternative ai database relazionali può essere spiegata da due principali
esigenze:

La continua crescita del volume di dati da memorizzare;

La necessità di elaborare grandi quantità di dati in poco tempo.
Queste nuove necessità sono dovute a molti fattori come l’aumento esponenziale del
numero di utenti della rete, la diffusione sempre maggiore dell’OpenID, lo sviluppo di
sinergie tra le varie community e i fornitori di servizi, ma anche la crescente disponibilità di
dispositivi con accesso ad Internet come smartphone, tablet e altri dispositivi portatili.
Per far fronte alla necessità di gestire quantità di dati sempre maggiori e a velocità
sempre più elevate i nuovi sistemi di memorizzazione si sono evoluti per essere più flessibili,
utilizzando modelli di dati meno complessi, cercando di aggirare il rigido modello relazionale
e per aumentare il livello delle prestazioni nella gestione e interrogazione dei dati.
Queste nuove esigenze si connettono al mondo dei sistemi distribuiti. Più precisamente
verso la metà degli anni 90, con l’avvento dei grandi sistemi basati su Internet, si iniziò a
considerare la disponibilità di servizio da parte di un sistema come un requisito importante.
Fino a quel momento infatti, la cosa che più contava era la coerenza e la sicurezza dei dati.
Eric Brewer in un KeyNote alla conferenza “Principle of Distributed Computing” del 2000
presentò il Teorema del CAP7. Il teorema, si basa sulle tre lettere che formano la parola CAP,
ed ogni lettera è una caratteristica del sistema distribuito su cui si sta lavorando:
 Consistency (Coerenza): dopo una modifica tutti i nodi del sistema distribuito
riflettono la modifica;
 Availability (Disponibilità): ad una richiesta, il sistema è sempre in grado di dare
una risposta, in altre parole, il sistema è sempre disponibile;
 Partition Tollerance (Tolleranza al Partizionamento): se le comunicazioni si
interrompono tra due punti del sistema, il sistema non fallisce ma continua ad
essere disponibile.
Il Teorema enuncia l’impossibilità di avere tutte e tre le caratteristiche nello stesso
momento, perciò se ne possono implementare due a discapito della terza.
Pertanto se si sceglie di non avere una tolleranza al partizionamento avremo problemi
sulla scalabilità verticale, proprietà spiegata in seguito, che è sicuramente più costosa.
Se si rinuncia alla disponibilità dobbiamo attendere che vengano risolte alcune richieste
Seth Gilbert and Nancy Lynch, “Brewer's conjecture and the feasibility of consistent, available, partition
tolerant web services”, ACM SIGACT News, Volume 33 Issue 2 (2002), pagg. 51-59.
7
10
a discapito delle prestazioni. Se si rinuncia alla coerenza si avrà per un periodo un
disallineamento dei dati sui nodi. Questi ultimi due problemi sono quelli più noti e
permettono di superare il problema della scalabilità. Per scalabilità orizzontale si intende la
capacità di un'applicazione di crescere e decrescere in base alle necessità richieste dagli utenti,
introducendo o togliendo dei nodi al sistema senza compromettere il suo funzionamento. In
una qualche maniera si riesce dunque a parallelizzare il carico del lavoro.
Grazie a questo approccio, avendo più nodi, l'errore in un nodo non pregiudica il
funzionamento dell'intero database e quindi il sistema risulta più sicuro. Un altro vantaggio
è sicuramente il costo, in quanto con un'applicazione scalabile si possono creare più nodi a
basso costo. Gli unici svantaggi di questa scelta risiedono però nella progettazione
dell'applicazione, che deve rispecchiare questa struttura scalabile e non comportare troppi
problemi nell'installazione.
Con il passare del tempo, oltre alla disponibilità di un sistema un’altra caratteristica
divenne fondamentale, ovvero la capacità di crescere e decrescere in base alle necessità
richieste dagli utenti del sistema, più propriamente chiamata scalabilità orizzontale.
La scalabilità orizzontale si ha se l’aumento delle risorse si riferisce all’aumento dei nodi
nel sistema, cioè il sistema riesce a parallelizzare il carico di lavoro. Il vantaggio più importante
dato da questo tipo di scalabilità è il costo: infatti, con un’applicazione perfettamente
scalabile, si potrebbero impiegare molti nodi a basso costo, ottenendo anche una maggiore
prevedibilità del costo marginale. Un altro vantaggio è la maggior tolleranza ai guasti: l’errore
in un nodo non pregiudica totalmente il funzionamento dell’applicazione. Gli svantaggi
risiedono nei maggiori sforzi in fase di progettazione perché l’applicazione deve innanzitutto
supportare questo modello di scalabilità; inoltre l’applicazione deve essere facile da
amministrare, per ridurre i costi d’installazione.
Importante è il caso di Amazon, che nel 2007 pubblicò un WhitePaper8, nel quale si
spiegava il motivo della nascita ed il funzionamento di Dynamo, un Key/Value Store ad alta
disponibilità.
Leggendo il WhitePaper, e soprattutto il Blog di Werner Vogels9 si capisce come il
modello relazionale non soddisfaceva le sfide che stava affrontando Amazon, o meglio, si
sarebbe potuto adattare il modello relazionale ad Amazon, ma questo avrebbe significato
Dynamo: Amazon’s Highly Available Key-value Store, SOSP 2007, October 14-17, 2007, Stevenson,
Washington, USA.
9
Werner Hans Peter Vogels è il Chief Tecnology Officer e vice presidente di Amazon.com incaricato di
guidare l’innovazione tecnologica all’interno della società.
8
11
creare una soluzione inefficiente soprattutto dal punto di vista economico.
Tradizionalmente infatti, i sistemi di produzione immagazzinano il loro stato in
database relazionali. Ma la maggior parte di questi sistemi immagazzina e legge dati partendo
da un’unica chiave primaria e di conseguenza non richiedono tutta la complessità di
interrogazione che un database relazionale può essere in grado di fornire, producendo uno
spreco di risorse.
La soluzione relazionale è quindi in questo caso sconveniente, ma lo diventa ancora di
più quando una compagnia come Amazon deve scalare il proprio sistema, infatti, nonostante
i passi in avanti fatti negli ultimi anni, resta complicato aggiungere o togliere un nodo ad un
database relazionale distribuito, e questa complessità difficile da abbattere è figlia della
potenza che il database relazionale garantisce nella gestione dei dati, dalla sincronizzazione
spesso non implementata in modo efficiente che richiede protocolli costosi come il commit
a due o tre fasi e cosa più importante dal fatto che i database relazionali inizialmente furono
realizzati per applicazioni centralizzate.
12
1.3.1 Classificazione dei database non relazionali
I database NoSQL possono essere implementati seguendo differenti approcci a
seconda delle strutture dati con cui si rappresentano i record di dato.
Le principali categorie sono le seguenti quattro:
-
Column-oriented database: le informazioni sono memorizzate in colonne. Non c'è
bisogno di definire subito le colonne. Tipicamente sono usati nell’ambito della
memorizzazione distribuita dei dati;
-
Key/Values store: in questo caso i dati vengono immagazzinati in un elemento
che contiene una chiave assieme ai dati veri e propri. É quindi del tutto analogo
ad una Hash Table10. Questo metodo è il più semplice da implementare, ma
anche il più inefficiente se la maggior parte delle operazioni riguardano soltanto
una parte di un elemento;
-
Document store: è l’evoluzione del metodo key/value, rispetto ai normali
database relazionali invece che immagazzinare i dati in tabelle con dei campi
fissi, questi vengono messi in un documento (rappresentato in XML, JSON o
-
BSON) che può contenere illimitati campi di illimitata lunghezza, così se ad
esempio di una persona conosciamo solo nome e cognome, ma magari di
un’altra persona anche indirizzo, data di nascita e codice fiscale, si evita che per
il primo nominativo ci siano campi inutilizzati che occupano inutilmente
spazio;
-
Graph database: i dati vengono immagazzinati sotto forma di strutture a grafi,
rendendo più performante l’accesso a questi da applicativi orientati agli oggetti.
Tipicamente si usa nei social network.
I principali database non relazionali sviluppatisi in questi anni sono riportati nella figura
1, specificandone la categoria.
10
Una Hash table è una struttura dati usata per mettere in corrispondenza una data chiave con un dato valore.
13
Persistent
key/value
Volatile
Key/value
Graph
Column
Documents
neo4j
BigTable
(Google)
MongoDB
(BigTable)
Dynamo
(Amazon)
Memcached
FlockDB
(Twitter)
Hbase
(BigTable)
CouchDB
Voldemort
(Dynamo)
Hazelcast
InfiniteGraph
Cassandra
(Dynamo +
BigTable)
Ryak (Dynamo)
Redis
Hypertable
(BigTable)
Membase
(Memcached)
SimpleDB
(AmazonAWS)
Tokyo Cabinet
Figura 1: I principali database non relazionali suddivisi per categoria
14
1.3.2 Vantaggi e svantaggi dei db non relazionali
I database non relazionali, pur non essendo una novità assoluta, hanno registrato una
crescita esponenziale nel loro sviluppo e utilizzo negli ultimi mesi grazie al sempre più
crescente bisogno di scalare in orizzontale, dove i classici RDBMS (database relazionali)
presentano diverse limitazioni. Si pensi infatti ai sempre più in voga sistemi cloud dove i nodi
possono diventare veramente molti, gestire un RDBMS in un ambiente del genere risulta
complicato e la potenza computazionale non viene sfruttata in modo ottimale11.
Viste le problematiche di cui sopra, i giganti del web, che si trovano a dover gestire
database di dimensioni veramente imponenti, hanno sviluppato (o contribuito allo sviluppo)
vari NRDBMS (database non relazionali) con approcci leggermente diversi, ma tutti con gli
stessi principi di base, si raggruppano infatti sotto la dicitura di movimento NoSQL (Not
Only SQL).
Come in ogni nuovo modello nei database NoSQL si sono riscontrati sia dei vantaggi
che dei svantaggi. Tra i vantaggi si notano sicuramente le performance più alte per i tempi di
risposta, infatti nei database non relazionali un elemento contiene tutte le informazioni
necessarie e dunque non serve usare i dispendiosi “join” come invece avviene per i database
relazionali.
Inoltre la semplicità di questi database è uno degli elementi fondamentali, è proprio
questo che permette di scalare in orizzontale in maniera così efficiente, molti NRDBMS,
infatti, permettono di aggiungere nodi a caldo in maniera impercettibile dall’utente finale.
Infine scegliendo un database adatto alla mappatura più diretta alle object classes del
proprio applicativo si possono ridurre di molto i tempi dedicati allo sviluppo del metodo di
scambio dati tra il database e l’applicativo stesso (il cosiddetto object-relational mapping che
è invece necessario in presenza di database relazionali).
La semplicità di questi database comporta però anche degli svantaggi: mancando i
controlli fondamentali sull’integrità dei dati, il compito ricade quindi totalmente
sull’applicativo che dialoga con il database che ovviamente dovrebbe essere testato in modo
molto approfondito prima di essere messo in produzione. Per fare un esempio, se avessimo
un database dei clienti coi relativi ordini effettuati immagazzinati in elementi diversi, anche
Si pensi per esempio alla replicazione con MySQL dove il log binario costituisce già di per sé un enorme
calo prestazionale.
11
15
se è possibile definire una relazione attraverso le chiavi, in un database non relazionale alla
cancellazione di un cliente tutti gli ordini resterebbero comunque nel database, è quindi
l’applicativo che una volta impartito il comando di cancellazione dell’utente X deve anche
andare a cancellare tutti i relativi ordini, cosa che invece in un database relazionale è gestita
direttamente dal database stesso.
Altra pecca è la mancanza di uno standard universale, come può essere l’SQL. Ogni
database ha infatti le proprie API e il suo metodo di storing e di accesso ai dati. Pertanto il
passaggio da un database ad un altro non è sicuramente immediato, ma richiederebbe alcuni
cambi più o meno radicali da apportare all’applicativo; è quindi necessario tenere in
considerazione la cosa al momento del brainstorming iniziale.
Nonostante ciò, i database non relazionali, seppur non essendo la soluzione definitiva
al problema del salvataggio e recupero dei dati, visto l'avvento di Social Network e del cloud,
risultano la miglior soluzione in questi contesti dove ogni giorno bisogna salvare un numero
elevatissimo di dati e solo grazie alla scalabilità orizzontale dei database No-SQL e quindi
all'aggiunta di server facili da gestire, è possibile ottenere delle performance soddisfacenti,
molto migliori rispetto ai soliti database relazionali. Esempi di applicazioni che utilizzano
questo modello sono infatti Twitter, Facebook e Amazon.
16
1.4 Dbms relazionali e non: elementi a confronto
La conoscenza degli elementi di base di un database relazionale fa parte della cultura
tecnica di buona parte degli sviluppatori ed amministratori di sistema. Riepilogando
brevemente, tutto ruota attorno al concetto di tabella. Ne esisterà una per ogni tipo di
informazione da trattare, ed ognuna sarà costituita da colonne, una per ogni aspetto dei dati.
Una tabella dovrebbe avere una o più colonne che svolgono il ruolo di chiave primaria,
una sorta di indice che permette di riconoscere univocamente quella riga rispetto a tutte le
altre. Tra le tabelle di un database relazionale, inoltre, possono esistere alcune relazioni. Una
riga di una tabella A può fare riferimento ad un’altra riga di un’altra tabella B, e ciò può essere
espresso inserendo la chiave primaria della riga di B tra i dati di quella di B.
Il linguaggio fondamentale usato per impartire comandi ad un DBMS relazionale è
SQL ed una delle operazioni più comuni nonché più onerose in termini di risorse è il
cosiddetto JOIN, un incrocio di tabelle in relazione tra loro che permette di offrire un set di
dati unico con le informazioni complete.
Alla base di un database relazionale, c’è la progettazione della struttura interna, fatta di
tabelle e relazioni. Questo lavoro concettuale iniziale condizionerà lo svolgimento di ogni
operazione sui DB, dall’inserimento dei dati all’interrogazione, alla definizione dei JOIN.
La strutturazione rigida dei contenuti, tipica dei database relazionali fin qui descritti, è
un elemento assente nei database NoSQL, e proprio tale assenza è uno degli aspetti che
maggiormente ne hanno permesso il successo.
Le informazioni non troveranno più posto in righe elencate in tabelle, ma in oggetti
completamente diversi e non necessariamente strutturati, come ad esempio documenti
archiviati in collezioni. Su MongoDB, un database NoSQL basato sui documenti, il formato
del documento è una delle caratteristiche più rilevanti. Si tratta di BSON (Binary JSON), una
variante di JSON che include diversi tipi di dati.
Se, ad esempio, dovessimo inserire le informazioni di una persona (nome, cognome,
età) in un database relazionale, creeremmo una tabella con tre colonne. In JSON, gli stessi
dati verrebbero resi in un formato testuale come il seguente:
{“cognome”:”Rossi”, “nome”:”Carlo”, “età”:25}
17
Più oggetti JSON racchiusi tra parentesi quadre costituiscono invece una lista di
oggetti. Un oggetto JSON, complesso e articolato come vogliamo, rappresenta un
documento da inserire nel database. Non esisteranno più tabelle, ma collezioni di documenti.
La chiave primaria del documento è un campo denominato _id che, se non viene
fornito in fase di inserimento, verrà aggiunto automaticamente dal DBMS.
Nei DBMS NoSQL a documenti, è significativa l’assenza delle relazioni. I meccanismi
con cui vengono collegate le informazioni sono infatti due:
o Embedding: significa annidare un oggetto JSON all’interno di un altro. Questa
tecnica sostituisce molto spesso le relazioni 1-a-1 e 1-a-molti. È tuttavia
sconsigliabile utilizzarla quando i documenti (quello annidato e quello che lo
contiene) crescono di dimensione in maniera sproporzionata tra loro, oppure
se la frequenza di accesso ad uno dei due è molto minore di quella dell’altro;
o Referencing: somiglia molto alle relazioni dei RDBMS, e consiste nel fare in
modo che un documento contenga, tra i suoi dati, l’id di un altro documento.
Molto utile per realizzare strutture complesse, relazioni molti-a-molti oppure
casistiche non rientranti tra quelle consigliate per l’embedding al punto
precedente.
18
CAPITOLO 2: MYSQL E MONGODB
2.1 MySql
Mysql è un relational database management system (RDBMS) composto da un client
a riga di comando e un server. MySQL permette di creare, modificare e usare un database
sul tuo server. E' un software libero, rilasciato a doppia licenza compresa la GNU General
Public License ed è sviluppato per essere il più possibile conforme agli standard ANSI SQL
e ODBC SQL.
2.1.1 Caratteristiche
Scalabilità e flessibilità
MySQL è la soluzione più avanzata a livello di scalabilità, grazie alla sua capacità di
integrarsi con applicazioni le cui dimensioni non devono superare pochi MB, fino ad enormi
data warehouse contenenti terabyte di informazioni. La flessibilità di piattaforma è una
funzionalità chiave di MySQL, che è in grado di supportare Linux, UNIX e Windows.
Ovviamente, la natura open source di MySQL consente inoltre una personalizzazione totale
per chi desidera aggiungere requisiti unici al server database.
Prestazioni elevate
L’eccezionale architettura storage-engine12 consente di configurare il server di MySQL
per applicazioni specifiche, ottenendo prestazioni finali incredibili. Sia che l’applicazione sia
un sistema di elaborazione transazionale ad alta velocità o un sito web che gestisce miliardi
di interrogazioni al giorno, MySQL è in grado di soddisfare le aspettative di qualsiasi sistema
a livello di prestazioni. Grazie alle utility di caricamento dati ad alta velocità, le cache
specializzate, gli indici full text ed altri meccanismi di aumento delle prestazioni, MySQL
offre gli strumenti giusti per i moderni sistemi aziendali di importanza critica.
12
Separa il query processing dai task di memorizzazione e ricerca dati.
19
Alta disponibilità
L’assoluta affidabilità e la costante disponibilità sono i punti di forza di MySQL e i
clienti si affidano a MySQL per garantire l’operatività 24 ore su 24. MySQL offre una varietà
di opzioni ad alta disponibilità, dalle configurazioni di replicazione master/slave ad alta
velocità, ai server cluster specializzati con failover istantaneo, alle soluzioni ad alta
disponibilità di terze parti per il server di database MySQL.
Solido supporto delle transazioni
MySQL offre uno dei motori database transazionali più potenti disponibili sul mercato.
Le funzionalità includono il supporto completo per transazioni ACID13, lock a livello di riga,
gestione delle transazioni distribuite e supporto per transazioni multi versione in cui chi legge
non blocca mai chi scrive e viceversa. La completa integrità dei dati è garantita anche
dall’integrità referenziale controllata dal server, dai livelli di isolamento delle transazioni
specializzati e dall’individuazione istantanea dei deadlock.
Punti di forza per Web e Data Warehouse
MySQL è lo standard di fatto per i siti web con volumi di traffico elevati, grazie al suo
query engine ad alte prestazioni, alla capacità di inserimento dei dati estremamente veloce e
al supporto delle funzioni web specializzate, come ad esempio le ricerche full text rapide.
Questi stessi punti di forza valgono anche per gli ambienti di data warehousing in cui MySQL
deve gestire terabyte di dati per singoli server o per architetture di scale-out. Altre
caratteristiche, come le tabelle in memoria principale, gli indici B-tree, gli indici hash e le
tabelle di archivio compresse, che riducono le necessità di memorizzazione fino all’80%,
rendono MySQL una soluzione unica, sia per le applicazioni web, sia per le applicazioni di
business intelligence.
13
Atomic, Consistent, Isolated, Durable.
20
Elevata protezione dei dati
La protezione dei dati aziendali rappresenta la priorità numero uno dei responsabili dei
database, quindi MySQL offre eccezionali caratteristiche per la sicurezza, che garantiscono
la totale protezione dei dati. Per ciò che riguarda l’autenticazione del database, MySQL offre
potenti meccanismi per assicurare che soltanto gli utenti autorizzati possano accedere al
server di database, con la possibilità di bloccare gli utenti fino al livello della macchina client.
Oltre a ciò, il supporto SSH e SSL garantisce che le connessioni siano sicure. Un sistema
granulare di gestione dei privilegi permette agli utenti di vedere solo i dati per i quali sono
autorizzati, mentre le potenti funzioni di crittografia e decifratura dei dati garantisce che i
dati sensibili siano protetti e non possano essere visualizzati da coloro che non sono
autorizzati. Per finire, le utility di backup e ripristino fornite da MySQL e da software di terze
parti consentono di eseguire il backup fisico e logico completo, così come il ripristino
completo e point-in-time.
Sviluppo completo di applicazioni
Uno dei motivi per cui MySQL è il database open source più diffuso al mondo è che
fornisce supporto completo per le esigenze di sviluppo di tutte le applicazioni. All’interno
del database è possibile trovare supporto per stored procedure, trigger, funzioni, viste,
cursori, standard SQL ANSI e altro ancora. Per le applicazioni integrate sono disponibili
librerie plug-in per espandere l'utilizzo del database MySQL a pressoché tutte le applicazioni.
MySQL fornisce inoltre connettori e driver (ODBC, JDBC, ecc.) che consentono a tutti i tipi
di applicazioni di utilizzare MySQL quale server di gestione dei dati. Non importa che si tratti
di PHP, Perl, Java, Visual Basic o .NET: MySQL offre agli sviluppatori di applicazioni tutto
ciò di cui hanno bisogno per realizzare sistemi informativi basati su database.
Facilità di gestione
I tempi necessari per iniziare a usare MySQL sono incredibilmente ridotti; il tempo
medio che trascorre dal download del software al completamento dell’installazione è inferiore
ai 15 minuti. Ciò vale per qualsiasi piattaforma, sia essa Microsoft Windows, Linux,
21
Macintosh o UNIX. Una volta installato, funzionalità indipendenti come l’espansione
automatica dello spazio, il riavvio automatico e le modifiche di configurazione dinamiche
facilitano il lavoro degli amministratori di database. MySQL offre inoltre una suite completa
di strumenti di migrazione e gestione grafici, che consente ai DBA di gestire, risolvere e
controllare le operazioni di più server MySQL da una singola stazione di lavoro. Sono inoltre
disponibili molti strumenti software di terze parti per MySQL, per gestire attività che vanno
dalla progettazione dei dati e l’ETL, alla completa amministrazione del database, alla gestione
dei job, al monitoraggio delle prestazioni.
La libertà dell'open source e il supporto 24x7
Molte aziende esitano ad adottare solo software open source perché credono di non
poter ricevere il tipo di supporto o di servizi professionali offerti dal software di tipo
proprietario, per garantire il successo delle loro applicazioni di importanza chiave. Un altro
aspetto riguarda la questione degli indennizzi. Queste preoccupazioni possono essere
ignorate grazie a MySQL, che attraverso MySQL Enterprise offre indennizzi e supporto
completo 24 ore su 24. MySQL non è un progetto open source tipico, poiché tutto il software
è di proprietà di Oracle ed è supportato da Oracle; è quindi disponibile un modello di costi
e supporto in grado di offrire una combinazione unica di libertà open source e software
supportato.
Costo totale di proprietà più basso
Migrando le attuali applicazioni basate su database a MySQL, oppure utilizzando
MySQL per i nuovi progetti di sviluppo, le grandi aziende stanno ottenendo risparmi enormi.
Grazie all’uso del server di database MySQL e delle architetture distribuite, che utilizzano
hardware di largo consumo a basso costo, le aziende scoprono di poter raggiungere
incredibili livelli di scalabilità e prestazioni, il tutto ad un costo estremamente inferiore a
quello dei software scale-up di tipo proprietario. Inoltre, l’affidabilità e la gestibilità di MySQL
consentono agli amministratori di database di non sprecare tempo nella risoluzione di
22
problemi legati alle prestazioni e ai tempi di fermo, ma di concentrarsi invece su attività di
livello più strategico che interessano gli aspetti che danno più valore al business.
MySQL è diventato il database open source più conosciuto al mondo grazie a
prestazioni veloci, elevata affidabilità e facilità d'uso. È utilizzato in ogni continente, anche in
Antartide, da singoli sviluppatori Web e da molte delle aziende più grandi e in più rapida
espansione del mondo, tra cui leader di settore come Yahoo!, Google, Alcatel-Lucent, Nokia,
YouTube e Zappos.com, per risparmiare tempo e denaro potenziando siti Web con volumi
d'accesso elevatissimi, sistemi business-critical e pacchetti di soluzioni software.
MySQL non è soltanto il database open source più famoso al mondo. È diventato
anche il database utilizzato per una nuova generazione di applicazioni basate sullo stack
LAMP (Linux, Apache, MySQL, PHP / Perl / Python).
23
2.2 Mongo DB
MongoDB14 è un database sviluppato in C++, open-source, document-oriented,
scalabile e altamente performante. Esso è stato realizzato in maniera tale da avere alte
prestazioni in lettura e scrittura. Le letture più consistenti infatti possono essere distribuite
in più server replicati, le interrogazioni sono più semplici e veloci grazie all'assenza di join e
l'approccio ai documenti rende possibile la rappresentazione di relazioni gerarchiche
complesse attraverso documenti nidificati e array.
Ecco le sua caratteristiche distintive:
 Database document-oriented: i dati vengono archiviati sotto forma di
documenti in stile JSON con schema dinamici, secondo una struttura molto
semplice e potente;
 Supporto completo agli indici: indicizzazione di qualsiasi attributo;
 Replicazione: facilità nella replicazione dei dati attraverso la rete e alta
scalabilità;
 Sharding: scalabilità orizzontale senza compromettere nessuna funzionalità;
 Query document-based.
Database document-oriented
Questo modello di database eredita il meccanismo di storage dal paradigma docoriented che consiste nel memorizzare ogni record come documento che possiede
caratteristiche predeterminate. Si può aggiungere un numero qualsiasi di campi con una
qualsiasi lunghezza.
Nei doc-oriented si segue una metodologia differente rispetto al modello relazionale:
si accorpano quanto più possibile gli oggetti, creando delle macro entità dal massimo
contenuto informativo. Questi oggetti incorporano tutte le notizie di cui necessitano per una
determinata semantica.
Pertanto MongoDB non possiede uno schema e ogni documento non è strutturato, ha
solo una chiave obbligatoria: _id, la quale serve per identificare univocamente il documento;
Deriva da “humongous”, un termine slang con il significato di enorme, immenso. Si riferisce alla capacità di
immagazzinare una grande mole di dati.
14
24
essa è comparabile, semanticamente, alla chiave primaria dei database relazionali.
Supporto completo agli indici
MongoDB utilizza le tecniche di indicizzazione; solitamente il campo _id è indicizzato
automaticamente, inoltre conviene indicizzare anche quei campi dove è tipico eseguire
ricerche o sui quali sono definiti ordinamenti. MongoDB, proprio per favorire
l'indicizzazione, fornisce strumenti in grado di suggerire su quali campi sia opportuno
definire indici.
Per usarli con buoni risultati conviene privilegiare applicazioni read- intensitive, ovvero
collezioni con un alto rapporto letture/scritture per incrementare le letture rispetto alle
scritture.
Nonostante siano molto utili vanno utilizzati solo se il campo è realmente selettivo in
quanto indicizzare dei campi comporta sicuramente dei costi. Il tempo di scrittura infatti
aumenta con l'aumentare degli indici utilizzati, questo perché una modifica o un'aggiunta di
dati può comportare la modifica di molti indici.
Dunque affinché l'uso degli indici risulti veramente performante è importare fare una
scelta ragionata considerando il tipo di interrogazioni che verranno effettuate sul sistema e
quanto spesso quei dati verranno modificato o subiranno delle aggiunte.
In poche parole un indice è una struttura dati che cataloga le informazioni dei campi
specificati nei documenti di una collezione. Attraverso questi indici risulta più facile e meno
dispendioso ordinare i dati di una query e grazie ad essi si velocizzano i tempi di risposta in
quanto per certe ricerche mirate non vengono più scannerizzati tutti i documenti ma si salta
direttamente ai documenti che rispettano la clausola della query.
La maggior parte degli indici seguono la struttura ad albero, B-Tree, grazie alla quale
con un semplice confronto del nodo padre si sceglie se considerare il braccio destro e sinistro
scartando ogni volta un numero consistente di confronti.
Una volta definito un indice su uno o più campi sarà il sistema stesso a mantenere
aggiornato l’indice.
E' possibile definire diverse tipologie di chiavi:
 Chiavi semplici: indicizzano un solo campo di una collezione (insieme di
documenti con le stesse caratteristiche o simili, una sorta di tabella dei database
relazionali);
25
 Chiavi composte: indicizzano due o più campi di una collezione;
 Chiavi documento: considerano come campo dell'indice un campo che
contiene oggetti (utili per query che non richiedono interrogazioni ordinate);
 Chiavi array: considerano come campo dell'indice un campo che contiene un
array.
E’ possibile inoltre definire un indice sparso su un determinato campo, così facendo
nell’indice saranno compresi solo gli oggetti che presentano il campo indicato, mentre quelli
che non lo presentano verranno filtrati.
Caratteristica peculiare di MongoDB è la possibilità di utilizzare indici geospaziali
bidimensionali i quali ci permettono di interrogare il sistema con query basate sulla posizione.
Replicazione
La replicazione è utilizzata per rimediare e prevenire malfunzionamenti. Essa infatti
comporta ad una ridondanza dei documenti, la quale ritorna molto utile in caso di perdita
dei dati. In poche parole consiste nel salvare più copie dei documenti in server diversi in
modo tale di avere dei dati sicuri anche se accorrono degli errori in uno o più server.
Essenzialmente ci sono due tipi di replicazione: la Master-slave semplice e la ReplicaSet. La prima, come suggerito dal nome, presenta un’unità centrale master che è sempre
aggiornata, la quale periodicamente sincronizza tutti gli altri nodi (slave), che risultano quindi
dipendenti ad essa. In questo modo in ambito distribuito si assicura una consistenza assoluta
sul master ed una consistenza relativa sullo slave, nel senso che prima o poi lo slave risulterà
sincronizzato con il master. In caso di malfunzionamento di un nodo, il ripristino deve essere
eseguito manualmente.
La tecnica Replica-Set o insieme di replicazione è una elaborazione del modello MasterSlave che aggiunge il ripristino automatico dopo un malfunzionamento ed il supporto di
cluster di server con membri primari (master) e secondari (slave).
Sharding
Lo sharding è la tecnica usata per partizionare orizzontalmente un database. Mentre
nel partizionamento verticale, chiamato normalizzazione si punta a separare ed isolare
26
semantiche omogenee splittando una tabella in più tabelle dividendo i campi della tabella
stessa, nel partizionamento orizzontale lo split è realizzato in modo da ottenere due o più
insiemi di tuple da sistemare in due o più tabelle.
In MongoDB le tecniche di Sharding estendono proprio il partizionamento orizzontale
permettendo agli shard, cioè alle partizioni ottenute dal database di partenza, di essere slegati
completamente gli uni dagli altri. Questa separazione è possibile in quanto ogni shard può
vivere in una istanza dello schema logico totalmente separato e può essere ospitato da un
server fisico diverso da quello degli altri shard. Pure il data center può essere uno qualsiasi,
addirittura trovarsi in un altro continente. In poche parole ogni shard non dipende dal sistema
logico e fisico sottostante.
Questa tecnica comporta ovviamente dei vantaggi: essendo ridotto il numero di righe
di ogni tabella coinvolta e dunque pure le dimensioni degli indici risultano ridotte, le ricerche
sono più veloci e più efficienti. Si ottengono performance superiori grazie anche al
parallelismo reso possibile dalla possibilità di posizionare ogni shard su hardware differenti.
Inoltre la segmentazione dei dati può seguire in maniera più naturale gli aspetti del mondo
reale che possono coinvolgere spazi completamente separati.
MongoDB prevede un servizio automatico di sharding, grazie al quale una volta
impostata la chiave sulla quale eseguire il partizionamento orizzontale, il sistema segmenta
automaticamente la collezione. Le collezioni che vengono così a crearsi sono strutturalmente
identiche: le dimensioni in termini di oggetti e occupazione di spazio sono bilanciate. Si
generano delle shard key ovvero delle chiavi di frammentazione, partendo dai chunk creati
dai cluster che contengono i dati.
Tutti i metadati si memorizzano in un server di configurazione e si creano dei nodi
router che propagano le richieste ai nodi. Quando ci sarà una richiesta si interroga un nodo
che possiede una tabella con una mappa del sistema per sapere a quali shard rivolgersi per
ottenere gli oggetti richiesti.
Query document-based
Una delle più importanti caratteristiche di MongoDB è la sua capacità di supportare
query dinamiche ad hoc, le quali, essendo caratteristiche dei database relazionali, ci
permettono con facilità di migrare dati da un database relazionale verso un database di MongoDB trasformando in pochi passaggi query SQL in query del linguaggio document-based.
27
Per recuperare i dati in MongoDB esistono varie query-object che rispecchiano i
costrutti principali delle query SQL.
Tra i principali ricordiamo:
o
Il selettore di campo, corrispondente allo SELECT in SQL, il quale recupera un
sottoinsieme dei campi della nostra collezione. (In MongoDB, differentemente a quando
accade in SQL, il campo _id è sempre ritornato.);
o
La selezione, corrispondente alla WHERE in SQL, la quale indica attraverso
dei criteri quali documenti recuperare in una collezione. Come in SQL vengono utilizzati
operatori condizionali (and, or, nor, in, nin, all, exists, mod, size, type, ne), espressioni
regolari, valori in array, valore negli oggetti embedded, meta operatori (not) e l'operato- re di
aggregazione (group). Il processo di selezione potrebbe causare un overhead per la ricerca di
documenti nel database, per questo viene utilizzata la funzione “Map- Reduce”: prima di
tutto per ogni elemento viene invocata la funzione “Map”, che produce delle coppie chiavevalore da passare alla successiva funzione e in seguito viene eseguita la funzione “Reduce”,
che aggrega i risultati ricevuti e restituisce la nuova collezione;
o
Gli ordinamenti, i quali, in maniera analoga alla clausola ORDER BY in SQL,
specificando su quale campo eseguire l'ordinamento, ritornano risultati ordinati in maniera
crescente o decrescente;
o
Skipe limit, i quali permettono una paginazione dei risultati.
E' importante sottolineare come i risultati di una query vengano gestiti: MongoDB usa
tecniche di cursori, i quali sono usati per recuperare iterativamente tutti i documenti ritornati
dalla query eseguita.
2.2.1 La nuova filosofia di MongoDB
Come possiamo ben capire dalle sue caratteristiche, MongoDB, essendo un database
NoSQL, non si preoccupa tanto di soddisfare le proprietà ACID tipiche dei database
relazionali, piuttosto si concentra su aspetti più performanti per quanto riguarda la velocità,
la flessibilità e la facilità d'uso del database.
Esso, organizzando i dati in documenti schemaless, riesce a rispondere alle
interrogazioni con tempi molto inferiori rispetto ai database relazionali dove i dati sono
separati in tabelle multiple e necessitano quindi di join per raggruppare i risultati.
Senz'altro anche l'approccio alla scalabilità orizzontale attraverso lo sharding è un altro
28
punto a favore per la velocità e le prestazioni del database. Lo sharding consente infatti di
gestire più carico di lavoro senza richiedere l'utilizzo di macchine potenti più grandi e quindi
più costose e riesce ad aumentare la capacità senza tempi di inattività, sfaccettatura molto
importante nel web che, a causa dell'aumento di carico dei dati, può essere costretto a
disattivare il servizio per lunghi periodi di manutenzione.
Per quanto riguarda la flessibilità, essa è data dal tipo di formato utilizzato nei
documenti: JSON. Formato che si adatta perfettamente ai vari linguaggi di programmazione
e non avendo uno schema fisso permette di modificare e ampliare il modello di dati in
maniera molto semplice e veloce.
Infine MongoDB punta alla semplicità: è facile da installare, configurare, mantenere e
usare. A tal fine, fornisce poche opzioni di configurazione e cerca automaticamente, quando
possibile, di fare la “cosa giusta” permettendo agli sviluppatori di concentrarsi sulla creazione
dell’applicazione piuttosto che perdere tempo in oscure configurazioni di sistema.
29
2.3 Comparazione tra MongoDB e MySQL
In questo paragrafo, si fornisce una comparazione tra MongoDB e il database
relazionale MySQL. Vengono analizzate le prestazioni di inserimento e interrogazione dei
due database per fornire una serie di risultati che andranno a svelare eventuali punti di forza
e debolezza di entrambi. L’analisi è stata estratta da una tesi di laurea dell’Università di
Padova: “Analisi delle performance dei database non relazionali”15.
L’analisi di benchmarking è stata condotta esaminando, prima di tutto, le prestazioni
di inserimento attraverso diversi metodi di inserimento: ad esempio, utilizzando i prepared
statement per MySQL o i bulk insert per MongoDB. In secondo luogo, si sono testate le
prestazioni dei due metodi interrogazione. In particolare, si sono testate le prestazioni del
map-reduce di MongoDB e poi è stata scritta l’interrogazione speculare in SQL da essere
applicata a MySQL.
NOTA. La macchina su cui sono stati eseguiti i test è un portatile da 4 Giga di RAM
con processore Duo 2 Core.
Su un pc a 32 bit, ecco i tempi di risposta delle query di inserimento su MongoDB e
MySQL, a parità di dati.
Dati inseriti
Query MongoDB
100
78 ms
500
187 ms
1.000
280 ms
5.000
1.19 sec
10.000
2.28 sec
50.000
11.23 sec
100.000
22.35 sec
200.000
45.97 sec
Query MySql
0.05 sec
0.08 sec
0.22 sec
0.91 sec
1.75 sec
35.46 sec
1 min 42.01 sec
3 min 12.33 sec
Su un pc a 64 bit, ecco i tempi di risposta delle query di inserimento su MongoDB e
MySql, a parità di dati.
15
Tesi di laurea a cura di Merelli Luca, Padova 21 settembre 2012, www.tesi.cab.unipd.it.
30
Dati inseriti
Query MongoDB
Query MySql
100
109 ms
0.06 sec
500
202 ms
0.09 sec
1.000
374 ms
0.12 sec
5.000
1.79 sec
0.23 sec
10.000
3.48 sec
0.41 sec
50.000
17.52 sec
2.01 sec
100.000
34.30 sec
9.73 sec
200.000
58.12 sec
14.76 sec
300.000
1 min 43.12 sec
32.23 sec
500.000
2 min 49.53 sec
2 min 16.33 sec
1.000.000
5 min 51.56 sec
5 min 21.05 sec
2.000.000 13 min 56.06 sec
21 min 10.33 sec
3.000.000 19 min 54.55 sec 1 h 2 min 23.69 sec
Dai risultati ottenuti evince che MongoDB è sicuramente più performante di MySQL
per l’inserimento e l’interrogazione di grosse quantità di dati. Su piccole quantità di dati,
presenta una latenza trascurabile, guadagnando esponenzialmente nei tempi quando si
interrogano milioni di documenti/record.
Tuttavia, si nota anche che al crescere dei dati, le operazioni di lettura e inserimento di
MongoDB subiscono un notevole peggioramento delle prestazioni.
Si può concludere che MongoDB risulta essere una valida alternativa ai database
relazionali grazie all’innovativo modello dei dati basato sui documenti che fornisce una
maggiore interazione con i linguaggi di programmazione orientati agli oggetti, all’agile e
semplice linguaggio di interrogazione e alla possibilità di essere facilmente scalabile.
MongoDB è, inoltre, in grado di fornire ottime prestazioni in scrittura e in lettura
addirittura migliori rispetto ai database relazionali.
31
CAPITOLO 3: CASO STUDIO EFFICIENTOMETRO
Introduzione
Finora abbiamo analizzato i concetti teorici inerenti allo studio dei database. Ora
passiamo al caso pratico inerente al lavoro di stage svolto presso la società Software
Engineering Research & Practices (in sigla SER&Practices) Spin-off dell’Università degli
Studi di Bari “Aldo Moro”.
Il lavoro ha previsto un'attività tecnico-scientifica volta alla produzione di un sistema
informatico utilizzabile come supporto al processo di efficientamento della spesa pubblica,
in grado di reperire, aggregare e rendere fruibili via web i dati finanziari open degli enti
pubblici in maniera chiara e user-friendly; di dotare i cittadini di strumenti partecipativi al
fine di incoraggiarli al controllo civico e alla collaborazione diretta nella vita amministrativa
di comuni, province, ecc.
Tale sistema si compone di due elementi: database e piattaforma web.
Per quanto riguarda il database, il sistema si basa su due macro categorie di dati:
o
SIOPE (la fonte è rappresentata da Siope, sistema informativo delle
operazioni degli enti pubblici di proprietà della Banca d'Italia16);
o
MEGAFILE (le fonti da cui sono prelevati i dati sono Istat, Finanza e
controllo, Contoannuale e Finanza locale17).
Per quanto riguarda la piattaforma, il sistema è stato pensato per due macrocategorie
di sistemi:
16
17

Desktop;

Smartphone e tablet.
www.siope.it
www.istat.it; www.finanzalocale.interno.it; www.contoannuale.tesoro.it;
32
3.1 Database dell’efficientometro
Per il popolamento dei database (MongoDB e MySql) sono stati realizzati dei web
crawler in grado di recuperare automaticamente i dati necessari per popolare il database del
sistema Efficientometro. Più in particolare è stato realizzato il crawler per il sito
MagellanoPA18. Tale crawler è servito per recuperare in riferimento a comuni e province, i
link alle sezioni:
o
Amministrazione trasparente;
o
Enti controllati;
o
Società partecipate;
o
Rappresentazione grafica.
E' stato poi necessario realizzare un web scraping da Finanza Locale19 per recuperare
il debito a lungo termine.
Per le altre tipologie di dati è stata effettuata una procedura di import dei dati.
Come accennato sopra, l’Efficientometro ha visto la compresenza di due database,
SIOPE e MEGAFILE. Per quanto riguarda Siope, è stato creato un database non relazionale,
per la precisione MONGODB, in grado di gestire non solo le enormi quantità di dati ma di
replicarli su più macchine per ottemperare al problema della memoria e per ottenere una
maggiore velocità di lettura/scrittura.
Per quanto riguarda Megafile, è stato creato un database relazionale (MYSQL) in grado
di organizzare i dati in insiemi di record a struttura fissa, in modo da creare dei sistemi
semplici ed efficienti per rappresentare e manipolare dati.
18
19
www.magellanopa.it
www.finanzalocale.interno.it
33
3.2 Principi di progettazione
La progettazione di un database è un processo nel quale viene scelta la migliore
rappresentazione della realtà che si vuole descrivere, della natura dei dati e dei requisiti che
l’applicazione deve soddisfare.
I principi di progettazione di un database relazionale sono ben stabiliti e seguono una
serie di regole ben precise. Il modello relazionale si basa su due concetti, relazione e tabella,
di natura diversa ma facilmente riconducibili l’uno all’altro. La nozione di relazione proviene
dalla matematica, in particolare dalla teoria degli insiemi, mentre il concetto di tabella è
semplice e intuitivo. Le tabelle risultano naturali e comprensibili anche per gli utenti finali,
d’altra parte la disponibilità di una formalizzazione semplice e precisa ha permesso anche
uno sviluppo teorico a supporto del modello.
Inoltre la progettazione di una base di dati segue un determinato procedimento in
modo da garantire principalmente la generalità rispetto alle applicazioni e ai sistemi, la qualità
del prodotto in termini di correttezza, completezza e efficienza rispetto alle risorse impiegate
e la facilità d’uso dei modelli di riferimento.
Nell’ambito delle basi di dati relazionali si è consolidata negli anni una metodologia di
progetto che ha dato prova di soddisfare le proprietà descritte. Tale metodologia è articolata
in tre fasi: la progettazione concettuale, il cui scopo è di rappresentare le specifiche informali
della realtà di interesse; la progettazione logica, che consiste nella traduzione dello schema
concettuale ottenuto dalla fase precedente nel modello di rappresentazione dei dati adottato
dal sistema di gestione di base di dati; la progettazione fisica nella quale lo schema logico
viene completato con la specifica dei parametri fisici di memorizzazione.
Invece MongoDB manca di regole per la progettazione, in quanto non applica alle
collezioni e ai documenti nessun tipo di schema in quanto utilizza prevalentemente uno
schema libero. Pertanto la progettazione di uno schema con MongoDB è spesso il risultato
di una profonda conoscenza del database che si sta utilizzando, dei requisiti database che si
sta utilizzando, dei requisiti che l’applicazione deve soddisfare, del tipo di dati che si andranno
a memorizzare e delle operazioni e aggiornamenti che si dovranno applicare ai dati
memorizzati. Da questo si evince che in MongoDB lo schema non è solo in funzione dei dati
che si andranno a memorizzare ma bisogna anche focalizzare l’attenzione su come i dati
verranno utilizzati dalle applicazioni.
Nonostante la mancanza di regole precise ci sono delle linee guida che possono servire
34
allo scopo di progettare uno schema che soddisfi le nostre esigenze.
Il primo aspetto da considerare è la struttura di un documento di una collezione.
In MongoDB non c’è una specifica dichiarazione dei campi all’interno dei documenti
di una collezione, in quanto MongoDB non richiede che i documenti abbiano la stessa
struttura. Tuttavia nella pratica la maggior parte delle collezioni sono omogenee in modo da
facilitarne l’utilizzo sia da parte di progettisti e programmatori ma anche da parte di utenti
casuali.
Una domanda chiave che ci si deve porre quando si progetta uno schema con
MongoDB è quando incorporare documenti all’interno di altri, embed, e quando collegare i
documenti, link. L’incorporamento è l’annidamento di oggetti e array all’interno di un
documento BSON. I link sono riferimenti tra documenti. Le operazioni all’interno di un
documento sono facili da eseguire e avvengono sul lato server, invece i riferimenti devono
essere trattati sul lato client e l’applicazione effettua operazioni su documenti riferiti
emettendo interrogazioni dopo che il documento è stato ritornato dal server.
In generale c’è una semplice regola che funziona per la maggior parte degli schemi ma
che non deve essere presa come assoluta: incorporare quando gli oggetti figli appaiono
sempre nel contesto del genitore, in caso contrario memorizzare gli oggetti figli in una
collezione separata.
Prendiamo come esempio un’applicazione che debba memorizzare dei post pubblicati
su un sito web e i relativi commenti ai post. La scelta tra incorporare o linkare dipende
dall’applicazione. Se i commenti appaiono sempre all’interno di un post e non c’è bisogno di
ordinarli in un modo arbitrario, come ad esempio per data o per importanza, incorporare i
commenti all’interno di un documento post magari sotto forma di un array di documenti è
un’opzione valida in quanto fornisce prestazioni migliori in lettura. Se invece l’applicazione
deve essere in grado di mostrare i commenti dal più recente senza considerare su che post i
commenti appaiano, allora è meglio usare i riferimenti e memorizzare i commenti in una
collezione separata.
Altro aspetto da considerare sono le operazioni atomiche che l’applicazione deve
eseguire, l’aspetto chiave in termini di progettazione di schema è che il campo di applicazione
delle proprietà atomiche è il documento, pertanto dobbiamo assicurare che tutti i campi
rilevanti per le operazioni atomiche siano nello stesso documento.
Di seguito viene presentato un elenco delle opportune regole da seguire durante la
progettazione di uno schema:

Gli oggetti che sono di livello superiore come importanza in genere hanno la
35
loro collezione;

Relazioni molti a molti generalmente sono rappresentate con collegamenti;

Collezioni che contengono pochi oggetti possono tranquillamente esistere
come collezioni distinte, in quanto l’intera collezione è rapidamente memorizzata nella cache
del server dell’applicazione. E’ più difficile ottenere un livello di visualizzazione per
documenti incorporati, per ottenere un’operazione del genere si deve utilizzare il map-reduce;

Se le performance sono un problema, incorporare.
36
3.3 Siope
Siope è un database non relazionale in grado di scalare orizzontalmente semplici
operazioni su più server, replicare e distribuire i dati su più server; non è basato sulle proprietà
ACID, è quindi in grado di ottenere prestazioni elevate e maggiore scalabilità;
Inoltre grazie ad esso è possibile usare in modo efficiente gli indici distribuiti e la RAM
per la memorizzazione dei dati. Infine, ulteriore vantaggio, è quello di aggiungere
dinamicamente nuovi attributi ai record di dati.
Sono stati raccolti i dati relativi alle entrate e uscite degli enti pubblici20, per il periodo
temporale 2009–2014.
Al fine di raggrupparli sono stati realizzati i seguenti indicatori:
1.
Spesa complessiva
o Gestione corrente;
o Mutui;
o Investimenti;
o Principali esborsi.
2.
Totale entrate
o Tasse;
o Servizi, fitti e multe;
o Sovvenzioni da Stato;
o Entrate una tantum;
o Principali entroiti.
E’ stato inoltre realizzato un sistema automatico dei dati presenti in Siope. In tal modo
nella versione successiva alla prima sarà possibile aggiornare i dati Siope senza che sia
necessario l’intervento umano e a scadenze prestabilite21.
20
21
In particolare per Comuni, Province; lavori in corso per le Regioni.
Ad esempio 10 gennaio, 30 gennaio, 2 mesi, ecc.
37
3.4 Megafile
Megafile è un database relazionale, dove i dati sono organizzati tramite relazioni.
Informalmente ogni relazione è rappresentata da una tabella. Si tratta quindi di database
relazionale in grado di organizzare i dati in insiemi di record a struttura fissa, in modo da
creare dei sistemi semplici ed efficienti per rappresentare e manipolare dati.
Per questa tipologia di database sono stati raccolti dati relativi a dipendenti pubblici e
altri indicatori quali debito a lungo termine, redditi e raccolta differenziata, per gli anni 20092014.
Sono stati realizzati pertanto i seguenti indicatori:
1.
Dipendenti pubblici:
o Abitanti per dipendenti;
o Impiegati per dirigente;
o Paga impiegati;
o Paga dirigenti;
o Assenze per malattia.
2.
Altri indicatori:
o Debito a lungo termine;
o Reddito per dichiarante;
o Reddito per abitante;
o Raccolta differenziata.
38
3.5 Aggregazione dei dati
I dati sono stati aggregati per voci di mastro per facilitare la lettura e l’interpretazione
degli stessi affinchè i cittadini potessero essere più consapevoli dei meccanismi alla base del
funzionamento della pubblica amministrazione e dei suoi costi.
Obiettivo ultimo è appunto quello di rafforzare di trasparenza, partecipazione e
accountability al fine di contribuire al miglioramento della società.
39
3.6 Piattaforma Web
Il sistema è stato pensato per due macrocategorie di sistemi:
 Desktop;
 Smartphone e Tablet.
E' stato dapprima realizzato un sistema web responsive ovvero un sistema in grado di
adattare la presentazione dei dati ai differenti dispositivi utilizzabili in modo automatico. La
memoria e la potenza di calcolo di questi dispositivi è limitata e pertanto la realizzazione di
una applicazione per questi dispositivi richiede maggiori tempi di realizzo.
Per ogni sistema il layout assume connotati diversi per efficientare l'usabilità dei sistemi
e la fruitabilità delle informazioni.
Il sistema software descritto è in fase di aggiornamento e di completamento.
La seguente figura mostra il layout del sistema web descritto.
40
3.7 Ulteriore sviluppo
Un passo successivo ha riguardato lo studio delle Regioni e in particolare lo studio
degli indicatori che potessero rappresentare al meglio la situazione delle stesse. Partendo
dall'analisi fatta per comuni e province, si è proceduto con lo studio delle voci di spesa di
due regioni italiane: la Puglia e la Sicilia. Due realtà molto diverse non solo perché
caratterizzate da statuti diversi (rispettivamente ordinario e speciale22) ma anche per i
differenti motivi di spesa.
E' stato quindi utilizzato un metodo di ricerca induttivo, procedimento logico che
ci ha permesso di ricavare dall'osservazione puntuale dei dati dei principi generali in essi
impliciti, fino ad arrivare alla costruzione di uno schema generale che potesse essere utile
alla costruzione e importazione dei dati sul database non relazionale.
Lo scopo principale è quello di rimodellare i dati grezzi degli attributi, organizzarli
ed aggregarli al fine di ottenere una presentazione comprensibile anche dall’utente non
tecnico.
Di seguito uno stralcio di intestazione dello schema.
ID VOCE BUROCRATICA IMPORTO ID MASTRO MASTRO ID MASTRONE
Spese per organi
1101istituzionali
286.538,42
201
Retribuzioni
101
Competenze fisse per il
personale a tempo
1211indeterminato
71.111.285,82
201
Retribuzioni
101
Come si evince dallo schema, gli attributi sono stati organizzati in una tassonomia
a tre livelli di aggregazione (mastro, mastrone e mastronissimo) allo scopo di analisi di
dati e astrazione.
La differenza deriva dalla natura e dal contenuto dell’atto: lo statuto speciale è una legge costituzionale e
definisce le forme e condizioni di autonomia speciale, mentre per le altre regioni le forme e le condizioni di
autonomia sono stabilite dalla Costituzione e lo Statuto ordinario delle stesse viene approvato con legge
regionale statutaria.
22
41
Conclusioni
In questa tesi si sono voluti studiare i database relazionali e non. Si è partiti con una
trattazione generale degli aspetti principali che hanno portato al loro sviluppo e alle
caratteristiche che li accomunano, andando più nello specifico presentando una panoramica
dei database più rappresentativi.
Come caso studio si è preso in esame il sistema informatico Efficientometro. Sono stati
identificati e censiti i dati da utilizzare per il sistema informatico descritto; sono stati
attentamente analizzati ed aggregati per poterli presentare all'utente finale in maniera chiara
e trasparente. E' stata definita una prima versione del progetto da cui si partirà per realizzare
la sezione regioni del sistema Efficientometro.
L’attività svolta mi ha dato la possibilità di interfacciarmi con un mondo nuovo, dove
i lavori sono ben organizzati e le scadenze è necessario rispettarle per non restare indietro e
per essere sempre in linea con gli obiettivi da raggiungere. Ho visto, quindi, come si
impongono delle scadenze, cosa occorre fare e come si lavora per rispettarle.
Oltre a queste nozioni che riguardano principalmente la sfera organizzativa, ho avuto
la possibilità di lavorare all'interno di un centro di ricerca all'avanguardia, “al servizio
dell'industria per ideare nuove e innovative soluzioni”. Si tratta di un nucleo operativo
costutuito da docenti, ricercatori e professionisti che da quasi 40 anni si occupa di ingegneria
del software. Ho potuto applicare alcune delle tecniche, delle metodologie e delle competenze
acquisite durante l'esecuzione del master con particolare riferimento agli ambiti di project
management e produzione database.
In definitiva l’efficientometro è utilizzabile come supporto al processo di
efficientamento della spesa pubblica, in grado di reperire, aggregare e rendere fruibili via web
i dati finanziari open degli enti pubblici in maniera chiara e user-friendly; di dotare i cittadini
di strumenti partecipativi al fine di incoraggiarli al controllo civico e alla collaborazione
diretta nella vita amministrativa di comuni, province, ecc.
Da un lato la piattaforma ha il dovere di assumere un ruolo proattivo di divulgazione
del patrimonio informativo; dall’altro il cittadino, in virtù del principio costituzionale di
sussidiarietà orizzontale, ha il diritto/dovere di informarsi e interrogare chi lo amministra
pretendendone la rendicontazione delle attività.
Si intende quindi promuovere l'accessibilità dei cittadini alla vita politicoamministrativa, ostacolata da un analfabetismo digitale ancora diffuso.
42
BIBLIOGRAFIA
A. Silberschatz, H. F. Korth, S. Sudarshan. Database System Concepts (6th Edition),
McGraw-Hill, 2010.
A. Albano, G. Ghelli, R. Orsini. Fondamenti di basi di dati. Zanichelli, Bologna 2005.
Atzeni P., Ceri S., Paraboschi S,Torlone R. (1999), Basi di dati, Mc Graw–Hill;
C. J. Date. An Introduction to Databases Systems (7th Edition), Addison-Wesley, 2000.
J.D. Ullman. Principle of Database and Knowledge Base Systems I-II.Computer Science
Press, Rockville, Maryland, 1989. (Trad. it. Basi di dati e di conoscenza. Gruppo Editoriale
Jackson, Milano, 1991.).
L. Welling, L. Thomson. MySQL Tutorial, Pearson Education Inc., 2004.
R. Elmasri, Navate S. B. (1994), Fundamentals of Database Systems, Addison Wesley.
R. Torlone: Fondamenti di Teoria delle Basi di Dati, Parte 1.
S.Abiteboul, R.Hull, V. Vianu. Foundations of Databases, Addison-Wesley, 1995.
S. Gilbert, N. Lynch, “Brewer's conjecture and the feasibility of consistent, available,
partition tolerant web services”, ACM SIGACT News, Volume 33 Issue 2 (2002), pagg. 5159.
43
SITOGRAFIA
www.amazon.com
www.contoannualetesoro.it
www.finanzalocale.interno.it
www.hostingtalk.it
www.magellanopa.it
www.mongodb.org
www.siope.it
www.tesi.cab.unipd.it
www.wikipedia.org
44