NOSQL
NOSQL
Origini e Significato
NOSQL = NO a SQL
NOSQL = Not Only SQL
Il termine NOSQL fu introdotto da Carlo Strozzi nel 1998 per indicare il suo database
relazionale open-source che non aveva una interfaccia SQL standard.
Il termine attualmente indica tutti quei database che sono: non relazionali, distribuiti,
open-source (spesso) e scalabili orizzontalmente.
NOSQL
Introduzione – un po' di storia
Anni '70
Nascono i database relazionali
- I supporti di memorizzazione sono altamente costosi
- I dati vengono normalizzati per il loro inserimento nel database
- L'organizzazione dei dati dipende da loro stessi e non dall'uso che sarà fatto
Anni '80
Vengono introdotti i sistemi RDBMS
- Si introduce il modello Client/Server
- Il linguaggio SQL diventa lo standard per l'interrogazione dei database
Anni '90
Nascita del World Wide Web e inizio della diffusione massiva di Internet
NOSQL
Introduzione – un po' di storia
Anni 2000
Nascita del Web 2.0
- Diminuisce notevolmente il costo dei sistemi di memorizzazione
- Diffusione dell'e-Commerce
- Diffusione dei social media
- Crescita esponenziale dei dati prodotti
NOSQL
Introduzione – un po' di storia
Anni 2000
Nascita del Web 2.0
- Diminuisce notevolmente il costo dei sistemi di memorizzazione
- Diffusione dell'e-Commerce
- Diffusione dei social media
- Crescita esponenziale dei dati prodotti
Necessità di scalare con il crescere dei dati
NOSQL
Introduzione – un po' di storia
A questo punto la scalabilità dei sistemi RDBMS distribuiti non è più sufficiente per
stare al passo con la velocità desiderata di produzione e consumo dei dati. Nascono
quindi i database NOSQL per rispondere alle esigenze che con i RDBMS non potevano
affrontare ovvero la necessità di una alta scalabilità orizzontale invece che una
Scalabilità verticale
scalabilità verticale (limitata) tipica dei RDBMS.
Scalabilità orizzontale
NOSQL
Introduzione – un po' di storia
NOSQL
RDBMS
VS
NoSQL
RDBMS vs NOSQL
Fine delle relazioni ?
Dire che un sistema NoSQL è non relazionale significa che
adottandolo si è costretti a rinunciare alle relazioni fra i dati?
No! Anzi...
NoSQL significa non tanto rinunciare al linguaggio SQL quanto
rinunciare al rigido formalismo matematico, detto algebra relazionale,
che è alla base di tutti i sistemi RDBMS
e quindi
liberarsi dai vincoli che esso impone.
NOSQL
Fine delle relazioni ?
Quali sono questi vincoli ?
Ricordiamo che i sistemi RDBMS richiedono un processo di normalizzazione sui dati
che consente di
“evidenziare le caratteristiche essenziali dei dati
e le relazioni che tra essi intercorrono, eliminando tutte le ridondanze”.
Il risultato è un modello astratto dei dati, detto schema, che definisce univocamente la
struttura e il tipo dei dati e li separa in tabelle.
NOSQL
Fine delle relazioni ?
Due conseguenze fondamentali del processo di normalizzazione sono:
- la necessità di utilizzare dei JOIN per ricostruire le informazioni da elaborare;
operazione costosa sia computazionalmente che temporalmente;
- la rigidità dello schema:
- aggiungere un campo o una relazione rende necessario bloccare l'intero database
fino a che la modifica non è completata;
- solo i dati conformi allo schema possono essere memorizzati;
Il costo relativo di questi vincoli aumenta con l'aumentare delle dimensioni dei dati da
trattare e rende impossibile un'efficace scalabilità orizzontale.
RDBMS vs NOSQL
Fine delle relazioni ?
I sistemi NoSQL non nascono quindi con l'obiettivo di rinunciare alle relazioni tra i dati
ma, al contrario, dal desiderio di avere la massima libertà possibile di modificare ed alterare
nel tempo sia la struttura dei dati che le relazioni che tra essi intercorrono.
Per questo motivo si fondano su:
- una organizzazione/memorizzazione dei dati in formati meno astratti e più vicini
(ed utili) all'applicazione che li dovrà elaborare;
- l'assenza di uno schema rigido che consenta di aggiungere nuovi dati, anche molto
dissimili dai precedenti, e nuove relazioni senza la necessità di modificare la struttura
del database e senza bloccarne l'accesso.
RDBMS vs NOSQL
Acidi vs Basi
Le caratteristiche ed i punti di forza dei sistemi RDBMS vengono spesso sintetizzate
con l'acronimo ACID; per evidenziare il diverso approccio ai dati dei sistemi NoSQL
alcuni dei loro punti di forza sono stati sintetizzati nell'acronimo BASE.
A tomicity
B asically
C onsistency
A vailable,
I solation
S oft State,
D urability
E ventually Consistent
RDBMS vs NOSQL
CAP Theorem
Perché abbandonare le proprietà ACID ?
Il CAP Theorem sostanzialmente dimostra che
è impossibile garantire le proprietà ACID
in un sistema distribuito e scalabile orizzontalmente .
Quindi il superamento delle proprietà ACID non è un vezzo ma un passaggio
obbligatorio qualora si voglia costruire un sistema distribuito.
RDBMS vs NOSQL
CAP Theorem
Nel 2000 Brewer teorizzo il seguente teorema noto CAP theorem:
un sistema distribuito può fornire contemporaneamente solo due fra le seguenti
garanzie:
●
Consistency (Consistenza): tutti i nodi vedono gli stessi dati nello stesso
momento;
●
Availability (Disponibilità): il sistema risponde a tutte le richieste;
●
Partition tolerance (Tolleranza al Partizionamento): il sistema continua ad
operare anche se alcune sue parti rimangono isolate dalle altre in modo
arbitrario (ovvero se il grafo che rappresenta il sistema è disconnesso).
RDBMS vs NOSQL
CAP Theorem
CA
Consistency
L'intersezione
tra queste tre
regioni è nulla.
CP
Partition
Tollerance
Availability
AP
RDBMS vs NOSQL
CAP Theorem
Perché è impossibile garantire le proprietà ACID su un sistema distribuito ?
Un limite fondamentale di cui ci si dimentica spesso quando si progetta un software,
anche nel caso di web services, è che la velocità della luce è costante.
Questo fatto apparentemente irrilevante implica che
un segnale che deve attraversare l'Atlantico impiega circa 30 ms.
cosa che rende estremamente complesso realizzare un sistema distribuito, altamente
scalabile, fortemente interattivo e dunque indipendente dalla latenza.
RDBMS vs NOSQL
CAP Theorem
Vediamo attraverso alcuni diagrammi il significato del CAP Theorem.
Nel diagramma sono illustrati due nodi N1 e N2 che condividono un dato V ( ognuno ne ha una
copia) il cui valore è V0.
Su ciascun nodo gira un algoritmo (A e B) che
possiamo considerare sicuro, privo di errori,
prevedibile ed affidabile.
A scrive un nuovo valore su V
B legge il valore di V.
RDBMS vs NOSQL
CAP Theorem
In un mondo ideale la rete sarebbe sempre affidabile e il trasferimento di informazioni
istantaneo...
1
2
3
RDBMS vs NOSQL
CAP Theorem
In un mondo reale la rete non sempre é affidabile e il trasferimento di informazioni non
è istantaneo...
N1
1
N1
A
V1
Vo
N1
A
2
A
V1
3
V1
M
N2
N2
B
1
N2
B
Vo
2
B
Vo
3
V0
V0
RDBMS vs NOSQL
CAP Theorem
In altri termini, il CAP Theorem ci dice che
se vogliamo un sistema che sia
- highly available, ovvero in grado di lavorare con latenza minima;
- costituito da centinaia o migliaia di nodi
- e che ciascun nodo sia tollerante alle interruzioni di rete ( messaggi persi, non
recapitati, fallimento di processi, guasti hardware)
allora dobbiamo accettare il fatto che ci saranno alcuni momenti in cui
- un nodo sarà convinto che il valore di V sia V0
- ed un altro nodo sarà convinto che il valore di V sia V1
RDBMS vs NOSQL
CAP Theorem
CA
Come ovviare ai limiti imposti dal CAP Theorem ?
Ci sono 3 possibilità:
Consistency
Availability
1 : CA - rinunciare alla Partitition Tolerance
ovvero forzare tutti i dati richiesti da una
transazione in un'unica macchina
CP
Partition
Tollerance
o quantomeno datacenter,
con ovvi limiti alla scalabilità.
Questo è tipicamente quello che si fa con i tradizionali RDBMS.
AP
RDBMS vs NOSQL
CAP Theorem
CA
Le altre due opzioni, con diverse sfumature,
sono quelle adottate dai sistemi NoSQL
2 : CP – rinunciare a qualcosa in termini di
Availabilty
per
garantire
consistenza
Consistency
Availability
e
robustezza al partizionamento;
3 : AP – rinunciare a qualcosa in termini di
Consistenza
per
garantire
robustezza al partizionamento;
disponibilità
e
CP
Partition
Tollerance
AP
RDBMS vs NOSQL
ACID Properties
Atomicità: la transazione è indivisibile nella sua esecuzione e la sua esecuzione deve essere o totale o
nulla, non sono ammesse esecuzioni parziali;
Consistenza: quando inizia una transazione il database si trova in uno stato consistente e quando la
transazione termina il database deve essere in un altro stato consistente, ovvero non deve violare eventuali
vincoli di integrità, quindi non devono verificarsi contraddizioni (inconsistenza) tra i dati archiviati nel DB;
Isolamento: ogni transazione deve essere eseguita in modo isolato e indipendente dalle altre transazioni,
l'eventuale fallimento di una transazione non deve interferire con le altre transazioni in esecuzione;
Durabilità: detta anche persistenza, si riferisce al fatto che una volta che una transazione abbia richiesto
un commit, i cambiamenti apportati non dovranno essere più persi.
RDBMS vs NOSQL
ACID Properties
Le proprietà ACID garantiscono l’integrità e la consistenza del dato, ma per consentire
la transazionalità impongono forti limiti alle performance ed alla scalabilità orizzontale.
I produttori di sistemi RDBMS per ridurre i limiti alla scalabilità dei loro sistemi hanno
sviluppato un protocollo denominato Two Phase Commit (2PC) che prevede che:
- il coordinatore delle transazioni richiede a tutti i db coinvolti dalla transazione di
effettuare un pre-commit per verificare la fattibilità dell'operazione;
- ogni database effettua il pre-commit e invia una risposta al coordinatore;
- se tutte le risposte sono positive il coordinatore conferma la transazione e le
modifiche vengono apportate, altrimenti viene invocato un rollback.
RDBMS vs NOSQL
BASE properties
Giocoforza si è dovuto adottare una versione “rilassata” delle proprietà ACID che
favoriscono la replicazione dei dati per aumentare la scalabilità orizzontale e la
disponibilità del dato a scapito della consistenza (in senso ACID).
Queste proprietà sono sintetizzate dall'acronimo :
BASE = Basically Available, Soft state, Eventual consistency.
NOSQL
Differenze RDBMS e NOSQL
Basically Available. L'approccio NoSQL predilige la disponibilità del dato anche in presenza di
molteplici errori. Viene ottenuto utilizzando un approccio altamente distribuito replicando i dati su un gran
numero di sistemi di memorizzazione. E' la consistenza nel senso del teorema CAP.
Soft state. Si abbandona la consistenza nel senso delle proprietà ACID. Lo stato del sistema può quindi
variare nel tempo, teoricamente anche senza input specifici.
Eventual consistency. Significa che in un qualche istante futuro i dati arriveranno in uno stato
consistente (nel senso ACID). Non ci sono garanzie, ovviamente, su quando ed in quanto tempo questo
avverrà. Questo perché:
• il sistema deve risponde subito alle richieste dei client;
• le modifiche ai dati si propagano in maniera asincrona fra i vari nodi.
NOSQL
Tipologie di sistemi
NoSQL
NOSQL
Tipologie di NOSQL
Proprio perché i database NOSQL sono incentrati sui dati esistono, ne esistono di
diverse tipologie ed esistono diverse varianti all'interno della stessa tipologia.
Le quattro tipologie principali di database NOSQL sono:
NOSQL
Key-value stores
I Key-Value stores puntano sugli aspetti di “Availability” e “Partition Tolerance” del
teorema CAP e prendono origine dall'articolo di Amazon dove descriveva il suo
database Dynamo.
Lo scopo di Amazon era quello di avere un database altamente scalabile dove si
potesse accedere ai dati in modo affidabile il più velocemente possibile in quanto i
database relazionali non scalavano alla velocità necessaria. Lo sviluppo di Dynamo fu
iniziato nel 2007.
Esempi di database:
Amazon Dynamo, Voldemort (Linkedin), MemcacheDB, Riak,
Redis, BerkleyDB ...
NOSQL
Key-value stores
I database Key-Value stores sono la più “semplice” tipologia di database NOSQL.
Ad ogni chiave è associato un blob binario “oscuro” che può contenere qualsiasi
tipologia di dato (stringa di testo, documento, immagine, video, ecc...).
KEY
VALUE
Key 1
Key 2
Key 3
Stringa
Key 4
Blob datatype
NOSQL
Key-value stores
KEY
Key 1
Key 2
Key 3
Key 4
VALUE
Il vantaggio è che si ha una struttura altamente scalabile con
una API di interrogazione del database molto semplice:
●
Aggiungi una coppia key/value
●
Recuperare un blob data la sua chiave
●
Cancellazione di una chiave
Le differenze principali rispetto al modello relazionale:
●
Una query restituisce un solo elemento
●
I value possono contenere qualsiasi tipo di dato
Lo svantaggio è che non c'è nessun modo di eseguire query basate sul contenuto del
valore in quanto i blob sono “oscuri”.
NOSQL
Document stores
Sono orientati alla conservazione di documenti; quindi a differenza di quanto accade con
i Key-Value stores, il contenuto non è una black-box ma è accessibile ed indicizzabile
I Document stores si basano su un modello proposto già negli negli anni '80 da Lotus
Notes; non a caso uno dei fondatori di CouchDB, Damien Katz, ha dichiarato
“Couch is Lotus Notes built from the ground up for the web”.
Esempi di DB: MongoDB, CouchDB, Couchbase...
NOSQL
Document stores
Lo scopo di questa tipologia di database è quella di archiviare in modo efficiente sia i
documenti che il loro contenuto, perciò consentono di creare indici secondari in modo
da poter recuperare i documenti anche in base al loro contenuto, metadati o
combinazioni di essi.
Inoltre, gli indici sono quasi sempre realizzati simili a quelle tipiche dei sistemi RDBMS
che consentono ricerche
●
per uguaglianza;
●
per intervallo;
●
indici su più attributi;
●
riferimenti ad altri documenti.
NOSQL
Document stores
Esiste una limitata analogia fra i Document DB e gli RDBMS che si può riassumere in
questa tabella e che può aiutare a comprenderne meglio l'organizzazione
Relazionale
Document stores
Tabella
Collection
Riga
Document
Colonna
Coppia Key/Value
Join
Non presente*
I JOIN non sono presenti, ma i riferimenti verso altri documenti possono essere visti
come una sorta JOIN.
Va rimarcato che i documenti non hanno uno schema e che quindi possono essere
costituiti da coppie key/value, coppie key/array, o anche documenti annidati.
NOSQL
Document stores
Il formato in cui vengono memorizzati i documenti è generalmente standard, anche se
più raramente in alcuni casi vengono memorizzati file di documenti veri e propri (es.
PDF, DOC …).
Il formato più utilizzato è il JSON, gli altri formati utilizzati sono XML, YAML e BSON.
Questo è dovuto principalmente anche alla forte integrazione che questi database
hanno con Javascript. Inoltre, la possibilità di ottenere modelli di dati complessi senza
rinunciare alle performance, li ha resi molto diffusi per siti web e di e-commerce, e
gestione documentale.
NOSQL
Column family stores
I database Column family si ispirano all'articolo di Google dove descriveva il suo
database Bigtable.
Bigtable è “un sistema di memorizzazione distribuito per la gestione di dati strutturati
progettato per scalare su grandissime dimensioni: petabyte di dati distribuiti su migliaia
di server”.
Dal 2006, Bigtable, è usato da Google in oltre 60 progetti.
Esempi di DB: Bigtable, Hbase, Hypertable, Cassandra ...
NOSQL
Column family stores
Column family store indica che il database è organizzato per colonne invece che per
righe come nei RDBMS.
+
-
+
-
semplicità nell'aggiungere
o modificare un record
durante la lettura dei record
si potrebbero leggere dati
non necessari
vengono letti solamente i dati
di interesse
la scrittura di una tupla richiede
accessi multipli
Ottimale per repository di grandi dimensioni che sono read-intensive
NOSQL
Column family stores
Un Column Family Store può esser visto come una mappa
●
ordinata;
●
multi-dimensionale;
●
persistente;
●
indicizzata per row key, column key e timestamp;
Poiché ad ogni dato è associato un timestamp è possibile avere anche un versioning dei dati.
Inoltre ogni riga può avere un numero differente di colonne, cosa che di fatto rende questo
database una matrice multidimensionale sparsa.
I column family si dividono in:
●
Standard column family
●
Super column family
NOSQL
Column family: Standard Column Family
La row key (la chiave più “esterna”)
identifica l'aggregato, che a sua volta
mappa una o più famiglie di colonne
dove possono essere presenti diversi
valori
associati
column key.
ad
una
diversa
NOSQL
Column family: Super Column Family
Un’estensione
dello
Standard
Column Family è rappresentato dal
Super Column Family.
Questo
aggiunge
modello
un
semplicemente
ulteriore
livello
di
indicizzazione fra la row key e
l’insieme delle colonne, la cosiddetta
super column.
Questa chiave viene utilizzata per raggruppare attributi correlati fra di loro, appartenenti
allo stesso aggregato. Questa organizzazione ha vari vantaggi fra cui:
●
dati più ordinati ed utilizzabili dalle applicazioni;
●
sharding più efficiente.
NOSQL
Column family stores
Altri vantaggi dei Column family database sono:
●
I valori in una singola colonna sono memorizzati in maniera contigua e conservati in
specifici column datafile;
●
I dati all'interno di ciascun column datafile sono dello stesso tipo, questo li rende ideali
per la compressione;
●
La memorizzazione per colonna permette di migliorare le performance delle query in
quanto permette l'accesso diretto alle colonne;
●
Alte performance nelle query di aggregazione (es. COUNT, SUM, AVG, MIN, MAX).
NOSQL
Graph
Quest'ultima tipologia di database NOSQL, a differenza delle precedenti, è relazionale,
in quanto il suo focus è memorizzare i dati e le relazioni fra loro esistenti.
I Graph stores sono ispirati dalla teoria dei grafi.
E' la tipologia di database ideale per la gestione di social network e simili, nonché
sistemi intelligenti che facciano uso di clustering e generazione di regole.
Esempi di DB: Neo4j, OrientDB, AllegroGraph, InfiniteGraph...
NOSQL
Graph
Nome: “Roberto”
Età: 36
Email: [email protected]
Nome: “Francesca”
Età: 34
Marca: “Opel”
Modello: “Corsa”
I nodi del grafo sono i dati ed hanno coppie key/value.
NOSQL
Graph
Nome: “Roberto”
Età: 36
Email: [email protected]
Ama
Nome: “Francesca”
Età: 34
Vive con
Ama
Possiede
dal: 2008
Guida
Marca: “Opel”
Modello: “Corsa”
Le relazioni sono gli edge del grafo, collegano i nodi, hanno una etichetta e possono
avere coppie key/value. Inoltre, la semantica delle relazioni dipende dall'applicazione e
quindi possono essere sia riflessive (es. Vive con) che no (es. Ama).
NOSQL
Un punto di vista applicativo
Confronto
NoSQL
NOSQL
Un punto di vista applicativo
Una chiave di lettura molto interessante sui sistemi NoSQL è quella proposta da Martin
Fowler nel suo libro NoSQL Distilled, che si fonda sull'utilizzo tipico che viene fatto di
queste tecnologie.
La prima domanda che si pone è:
esiste davvero una linea di demarcazione netta
tra Key-Value Stores e Document Stores ?
NOSQL
Un punto di vista applicativo
Metadata
customer ID: 4156
La risposta è NO.
●
La maggior parte dei KV store consente di aggiungere dei metadati indicizzabili con cui
recuperare velocemente i values associati (rendendoli simili ai document store)
●
La maggior parte dei Document, associano automaticamente un ID al document che
tipicamente viene recuperato per intero (ciò che si fa con i KV)
NOSQL
Un punto di vista applicativo
Anche i Column-Store, pur avendo una struttura più complicata, possono essere visti come degli
Aggregate Store.
Ogni Column-Family raggruppa un insieme di colonne “simili” che possono essere recuperate
attraverso un'unica operazione.
Ad esempio in una
Colum-Family si possono
racchiudere i dettagli
dell'ordine
Ed in un'altra i dettagli dei
singoli Item associati
all'ordine .
NOSQL
Aggregate Storage
Possiamo considerare i sistemi NoSQL come degli Aggregate Storage, cioè dei sistemi
che ci consentono di memorizzare entità complesse (così come le abbiamo in RAM nella
nostra applicazione) con un'unica operazione, come se fossero un'unica entità indivisibile.
Consideriamo il caso banale di un ordine con più elementi al suo interno.
In RAM avremo almeno
●
●
un oggetto Order e
un oggetto Item per ogni elemento.
Tuttavia, anche discorsivamente, quando pensiamo di salvare l'ordine o
leggere i dettagli dell'ordine, pensiamo all'ordine come un'unica entità
complessa che vogliamo leggere e scrivere con un'unica operazione.
NOSQL
Aggregate Storage
I sistemi RDBMS
ci costringono a
spargere i dati su
tante tabelle distinte
e separare un' operazione
in tante sotto-operazioni..
...che poi raggrupperemo
in una transazione
per poter avere atomicità e
consistenza.
NOSQL
Aggregate Storage
I sistemi NoSQL invece ci consentono di memorizzare
l'intera struttura complessa come un unico Aggregato,
così come lo abbiamo in RAM.
●
KV
: Aggregato == Value
●
Document
: Aggregato == Documento
●
Col-Store
: Aggregato == RowID + ColFamily
NOSQL
Aggregate Storage - Drawbacks
Esistono tuttavia delle controindicazioni nell'uso dei sistemi NoSQL.
Supponiamo di voler fare un po' di analisi ed elaborare delle statistiche sulle vendite:
Product
Curr. Sales
Prev. Sales
PR001
123
142
PR002
234
208
PR003
331
300
...
….
….
…
….
...
NOSQL
Aggregate Storage - Drawbacks
Ciò che stiamo facendo in questo caso è cambiare il cuore dell'Aggregato.
In questo caso l'aggregazione non sarà più incentrata sugli ordini, ma sui prodotti perché ci
interessano gli andamenti delle vendite in diversi periodi dell'anno.
Questo con i sistemi RDBMS risulta facile,
basta cambiare leggermente la QUERY e le
regole di raggruppamento.
Con i sistemi NoSQL è invece molto più
scomodo
ottenere
questo
risultato
e
tipicamente si effettuano dei Job MapReduce
che analizzano l'intera base dati.
L'uso dei sistemi NoSQL risulta dunque vantaggioso quando l'accesso ai dati
avviene per lo più in forma aggregata. Se invece si ha necessità di cambiare
spesso forma di aggregazione un sistema RDBMS può essere più adatto.
NOSQL
Aggregate Storage
Fanno storia a se i Graph DB che invece hanno un approccio diametralmente opposto e
presentano una parcellizzazione delle informazioni ancor più estrema di quella dei sistemi
RDBMS.
NOSQL
Confronto
RDBMS vs NoSQL
RDBMS vs NoSQL
MySQL vs Mongo
Effettuare un confronto approfondito tra sistemi così diversi è molto complesso.
Per dare un'idea dell'impatto delle caratteristiche ACID su un sistema distribuito e dei
potenziali vantaggi di sistemi basati sul modello BASE, riportiamo i risultati di un
confronto tra
- MySQL installato in modalità distribuita e
- MongoDB
eseguiti nel dipartimento di High Performance Computing della Università di Edimburgo
nel 2013.
RDBMS vs NoSQL
MySQL Schema
RDBMS vs NoSQL
Mongo Schema
RDBMS vs NoSQL
Test 1 : Simple Query
Test 1:
Il primo test riguarda l'esecuzione di una query semplice che coinvolge una sola tabella.
SELECT * FROM Users WHERE username = 'username'
RDBMS vs NoSQL
Test 1 : Simple Query
Tempo di esecuzione delle queries in diverse configurazioni:
RDBMS vs NoSQL
Test 1 : Simple Query
Numero di queries al secondo
RDBMS vs NoSQL
Test 2 : Query with SELF JOIN
Test 2:
Il secondo test è più complesso e richiede l'utilizzo di un SELF JOIN
SELECT 'Favourites.song_id' AS fSID,
'Favourites.userid' AS fUID
FROM
Favourites AS b INNER JOIN Favourites AS a
ON b.user_id = a.user_id
WHERE a.song_id = 123456 AND a.user_id != 987654
RDBMS vs NoSQL
Test 2 : Query with SELF JOIN
Tempo di esecuzione delle queries in diverse configurazioni:
RDBMS vs NoSQL
Test 2 : Query with SELF JOIN
Numero di queries al secondo
RDBMS vs NoSQL
Test 3 : Complex Query
Test 3:
Il terzo test è ancora più complesso e richiede l'utilizzo di
- una nested query e
- 2 INNER JOIN
SELECT 'Songs.release_id' AS sID, 'Releases.id' AS rID
FROM
Songs INNER JOIN Releases
ON Songs.release_id = Releases.id
WHERE artist_id IN
(SELECT 'Genres.artist_id' AS gAID
FROM Genres AS g INNER JOIN Artists AS a
ON g.artist_id = a.id
WHERE a.name = 'artist_name' )
RDBMS vs NoSQL
Test 3 : Complex Query
E' evidente come, anche in un setup piuttosto semplice come quello del test,
crescere della complessità della query i tempi di esecuzione siano nettamente diversi.
al
RDBMS vs NoSQL
Test 4 : Variazione delle dimensioni del DB
In questo caso si può notare come il tempo di esecuzione della query nel caso di
MySQL aumenti con il crescere delle dimensioni del DB
RDBMS vs NoSQL
Test comparativo
Il test precedente ha messo in evidenza l'impatto negativo sulle performance dovuto ai
JOIN ed agli accessi su più tabelle.
Impatto percepibile anche in un sistema semplice con pochi dati e poche macchine
tutte posizionate all'interno di uno stesso datacenter con connessioni ad alte
prestazioni.
Vediamo ora un secondo test che coinvolge anche HBase e Cassandra, effettuato su
macchine virtuali fornite dagli Amazon Web Services, con un carico di lavoro più
consistente ma con letture scritture su tabella singola, quindi senza l'impatto negativo
dovuto ai JOIN.
RDBMS vs NoSQL
Numeri del test
Client : 1 Nodo
- RAM : 7.5 GB
- CPU : 4 Core
Server : 4 Nodi
- RAM : 15 GB
- CPU : 8 Core
Dati:
- 100 Milioni di record
- 10 campi per record
- 100 thread attivi contemporaneamente (client-side)
RDBMS vs NoSQL
Bulk Load
Hbase è risultato il più veloce
con 40K op/sec.
Al
secondo
posto
troviamo
Cassandra con 15K op/sec.
RDBMS vs NoSQL
Workload A ( 50% read, 50% update)
RDBMS vs NoSQL
Workload A ( 50% read, 50% update)
RDBMS vs NoSQL
Workload B ( 95% read, 5% update)
RDBMS vs NoSQL
Workload B ( 95% read, 5% update)
RDBMS vs NoSQL
Workload C : read-only
N.B: Ricordiamo che si tratta di accessi su singola tabella a record con pochi campi.
RDBMS vs NoSQL
Workload D ( 90% insert, 10% read)
NOSQL
RDBMS vs NoSQL
Come Scegliere ?
NoSQL
Quando e quale scegliere?
Non esiste una riposta univoca a questa domanda.
La scelta tra un sistema RDBMS ed una o più delle tipologie di sistemi NoSQL è
strettamente legata al problema specifico che si deve affrontare.
Nelle prossime slide cercheremo di fornire alcune linee guida che potranno essere
d'aiuto nella scelta tra i vari sistemi.
Innanzitutto è necessario porsi alcune domande...
Come Scegliere ?
Che vincoli ci impone il nostro problema ?
Vediamo alcune domande di carattere generale che dovremmo porci prima di decidere:
Vincoli legati al modello :
- Quante entità ci occorrono per modellare il problema ?
- Quante relazioni abbiamo tra le diverse entità ? Quanto sono “fitte” ?
- Che probabilità c'è che lo schema possa cambiare ? Con quale frequenza ?
Vincoli legati all'accesso ai dati:
- Quanto è stringente il vincolo di consistenza ? Dev'essere assoluta ? E' ammissibile un ritardo di qualche
ms o di qualche secondo nella propagazione degli aggiornamenti ?
- L'accesso ai dati avverrà su tutti i campi di un record o solo su alcuni di essi ?
- Le elaborazioni richiederanno l'accesso a più tabelle ? O saranno concentrate solo su alcune colonne
(es. data, prezzo, disponibilità...) ?
Come Scegliere ?
Macro categorie di applicazioni
Per orientarci meglio possiamo definire tre macro categorie che ci aiutino a capire i pro
e i contro delle diverse soluzioni:
- Applicazioni prettamente Transazionali: caratterizzate da forti vincoli di consistenza e
certezza dell'informazione;
- Applicazioni prettamente Computazionali, caratterizzate dalla necessità di eseguire
elaborazioni anche complesse sui dati;
- Applicazioni prettamente Interattive e Web Oriented: caratterizzate dalla presenza
di un numero elevato di utenti e di dover loro garantire tempi di risposta molto brevi;
Come Scegliere ?
Applicazioni Transazionali
Ad esempio “gestione di un punto vendita” o “gestione risorse umane”.
Sono caratterizzate da :
●
obbligatorietà della consistenza ed integrità dei dati;
●
modesto livello di concorrenza (gestibile da una singola macchina)
Vincoli sullo schema:
●
tipicamente associate a problemi con dati fortemente strutturati
●
relazioni chiare e strette tra le varie entità
●
relazioni utilizzate di frequente
●
schema stabile e con scarse probabilità di cambiamento
Come Scegliere ?
Applicazioni Transazionali
Vincoli sull'accesso ai dati:
●
consistenza (ogni lettura DEVE garantire il valore più aggiornato del dato)
●
Row-Oriented (tipicamente viene letto l'intero record)
●
frequente accesso a più tabelle (JOIN)
●
necessità dell'uso delle transazioni (proprietà ACID)
Come Scegliere ?
Applicazioni Transazionali
Pro NoSQL:
●
Column Oriented: possono semplificare la gestione dello schema, che può facilmente
variare nel tempo con l'aggiunta di colonne;
●
Document : possono aiutare nella definizione di viste
Contro NoSQL:
●
non forniscono supporto alle relazioni (ad eccezione dei Graph DB);
●
non forniscono supporto alle transazioni (no ACID);
●
non forniscono supporto per JOIN o viste sui dati (tranne alcuni Document attraerso il
modello MapReduce, che però non è facile da usare);
Decisione:
Questo è il regno dei sistemi RDBMS e difficilmente si possono avere dei vantaggi con sistemi
NoSQL.
Come Scegliere ?
Applicazioni Computazionali
Sono applicazioni tipicamente orientate all'elaborazione dei dati, ad esempio per
●
la produzione di report di vendite;
●
generazione di statistiche sull'utilizzo di un dato servizio
●
individuazione di trend o altre funzionalità di analytics
Tipicamente :
●
operano su un sottoinsieme dei campi del record;
●
fanno un uso piuttosto limitato delle relazioni tra tabelle;
Vincoli sullo schema:
●
tipicamente sono associate a schemi strutturati che variano poco nel tempo
●
possono richiedere l'integrazione tra basi di dati diverse e dunque con schemi
differenti;
Come Scegliere ?
Applicazioni Computazionali
Accesso ai dati:
●
tipicamente utilizzano un sottoinsieme dei campi di un record;
●
Column-Oriented → le elaborazioni da eseguire sui dati richiedono operazioni tra
valori della stessa colonna associati a record diversi (es. colonna prezzo, colonna
vendite ed acquisti, date...)
●
accessi multi-tabella piuttosto rari;
●
consistenza dei dati non stringente → è richiesto il valore più recente del dato ma è
ammissibile un lieve ritardo nel suo ottenimento in quanto tipicamente le
elaborazioni non vengono effettuate in real-time;
Come Scegliere ?
Applicazioni Computazionali
Pro NoSQL:
●
Column Oriented: consentono la definizione di uno schema rigoroso e contemporaneamente
facilitano l'uso di schemi variabili nel tempo ;
●
Document / Key-Value : possono essere utilizzati ma non forniscono alcun supporto nella
verifica dello correttezza dello schema;
●
Possono garantire un notevole incremento di prestazioni durante l'accesso parziale ai record;
●
Possono eseguire molte operazioni la dove sono memorizzati i dati senza necessità di
spostarli attraverso la rete; con un sostanziale incremento delle prestazioni;
Contro NoSQL:
●
non forniscono supporto alle relazioni (ad eccezione dei Graph DB);
●
l'assenza di regole e relazioni può generare temporanee inconsistenze tra i dati;
Come Scegliere ?
Applicazioni Computazionali
Decisione:
Entrambe le categorie di sistemi possono essere utilizzate per questo tipo di applicazioni.
L'elemento decisivo è la dimensione dei dati da elaborare.
In linea del tutto generale ed orientativa si può supporre che:
●
al di sotto del milione di record l'overhead dei sistemi NoSQL non ne giustifichi l'adozione;
●
tra il milione e 100 milioni di record, entrambe i sistemi possano funzionare egregiamente;
●
al di sopra dei 100 milioni di record i vantaggi dei sistemi NoSQL prevarranno su tutti gli oneri
di adozione e gestione aggiuntivi
Come Scegliere ?
Applicazioni Interattive e Web-Oriented
Sono web-applications o applicazioni mobile caratterizzate da:
●
elevatissimo numero di utenti;
●
vasta distribuzione geografica degli utilizzatori (potenzialmente mondiale);
●
grande quantità di dati da conservare ed elaborare;
●
disponibilità degli utenti ad attendere un “tempo ragionevole” per ottenere una
risposta;
●
uno schema che può variare nel tempo per assecondare l'evoluzione
dell'applicazione in funzione delle esigenze degli utenti;
●
possibilità di aggiungere e modificare nel tempo le relazioni tra entità;
Come Scegliere ?
Applicazioni Interattive e Web-Oriented
Vincoli sullo schema
●
possibilità di definire uno schema strutturato;
●
possibilità di modificare lo schema nel tempo senza impattare sui record esistenti;
●
le relazioni potrebbero non esser stringenti e dunque gestite a livello applicativo;
Accesso ai dati
●
spesso è richiesto un accesso parziale ai campi di un record;
●
grande velocità nell'esecuzione di operazioni (tipicamente CRUD);
●
è tollerabile una temporanea (breve) inconsistenza delle informazioni
Come Scegliere ?
Applicazioni Interattive e Web-Oriented
Pro NoSQL:
●
Column Oriented: consentono la definizione di uno schema rigoroso e contemporaneamente
facilitano l'uso di schemi variabili nel tempo ;
●
Document / Key-Value : possono essere utilizzati ma non forniscono alcun supporto nella
verifica dello correttezza dello schema (possono essere di grande aiuto nella gestione di
schemi molto variabili);
●
Possono garantire un notevole incremento di prestazioni durante l'accesso parziale ai record;
●
Possono eseguire molte operazioni la dove sono memorizzati i dati senza necessità di
spostarli attraverso la rete; con un sostanziale incremento delle prestazioni;
●
Basandosi sulle proprietà BASE e non ACID garantiscono un'elevatissima scalabilità delle
operazioni CRUD;
Contro NoSQL:
●
nessuno
Come Scegliere ?
Applicazioni Interattive e Web-Oriented
Decisione:
Decisamente questo è il regno dei sistemi NoSQL.
La scelta tra le diverse tipologie è legata alle esigenze operative del problema da risolvere.
Ad esempio:
●
per applicazioni SaaS che devono consentire uno schema flessibile in grado di accettare
campi definiti dall'utente (es. CRM o ERP di tipo Enterprise) i document store potrebbero
essere la scelta ottimale;
●
per applicazioni social o in cui lo schema cambia velocemente ma sotto il controllo dello
sviluppatore, la scelta ottimale è probabilmente quella dei Column-Store;
●
per applicazioni social o comunque caratterizzate da un'estrema variabilità delle relazioni tra
entità un Graph DB potrebbe essere la scelta ottimale.
Conclusioni
Come scegliere?
La tendenza che si sta consolidando è quella di una soluzione orientata alla
Polyglot Persistence
ovvero, si fa una decomposizione funzionale del problema e :
●
le funzionalità transazionali sono realizzate tramite un RDBMS;
●
le funzionalità computazionali, in funzione del volume di dati, sono realizzate tramite
RDBMS o Column-Store (eventualmente document o key-value);
●
le funzionalità web-scale che devono gestire una variabilità dello schema controllata
dall'utente possono esser realizzate tramite Document-Store;
●
le funzionalità web-scale che devono gestire una variabilità dello schema controllata dallo
sviluppatore possono esser realizzate tramite Column-Store;
●
le funzionalità web-scale che prevedono la gestione dinamica di relazioni fra le entità
possono esser gestite tramite Graph-DB;