
Possiamo classificare le soluzioni di database non relazionali identificate sotto l'acronimo di NOSQL in base a quattro differenti fattori [infoqtax]:
1. Come i dati vengono archiviati logicamente (data model).
2. Come i dati vengono archiviati fisicamente su un nodo.
3. Come i dati vengono distribuiti, replicati e riconciliati in un sistema composto da più nodi.
4. Come di dati vengono presentati all'utente e le varie interfacce di accesso ai dati.
Per il primo punto, a cui spesso ci si riferisce con il termine di data model del database schemaless possiamo identificare le seguenti tipologie:
1. Key/Value store. Il modello key/value è quello più semplice e più facile da implementare. Rappresenta nel campo delle basi di dati quello che nell'ambito della programmazione viene chiamato Array Associativo. Si tratta infatti di una collezione di dati composta esclusivamente da una chiave e da un valore, dove ad ogni chiave è associato uno o più valori. L'operazione di ricerca dei valori, comunemente chiamata lookup, può essere effettuata esclusivamente mediante la chiave che viene indicizzata per aumentare le performance in fase di recupero dei dati. Da notare che sia nel campo chiave che nel campo valore si possono avere dati in qualsiasi formato, da stringhe a dati binari.
2. Document-oriented. Sono database orientati all'archiviazione di documenti e contenuti in generale e rappresentano un'evoluzione rispetto al modello key/value. Diversamente da quanto avviene nel modello relazionale in cui ogni ogni attributo di un oggetto di dominio viene mappato in generale ad una colonna nella relativa tabella entità, nel modello document-oriented ogni record rappresenta un documento che ha dei particolari metadati associati. I metadati possono essere associati in qualsiasi momento al documento e possono contenere dati di qualsiasi natura e dimensione. Diversamente da quanto accade per i modelli key/value e column-family, questo modello prevede l'utilizzo di sistemi di indicizzazione che consentono di effettuare delle query sui metadati dei documenti.
3. Graph-oriented. Sono database ottimizzati per trattare network-oriented data, cioè dati che rappresentano strutture a rete topologicamente complesse o in strutture gerarchiche di grandi dimensioni [neo4j]. Diversamente da quanto accade per il modello relazione in cui esistono tabelle, colonne e righe, nel modello graph-oriented le primitive sono: nodi, relazioni e proprietà. Frequentemente questi modelli offrono anche supporto alla gestione di dati semi-strutturati cosi come avviene per gli altri modelli descritti in questo paragrafo.
4. Column-family oriented. E' il modello ispirato dall'articolo di Google sul prodotto BigTable [bigt]. In questo modello i dati non vengono archiviati nella riga come avviene per il modello relazionale ma nella colonna. In particolare sono presenti i concetti di : column, column-family e super-column. La colonna è una tripla composta da un campo: nome, valore, timestamp. Le column-family sono dei raggruppamenti di colonne e hanno la particolarità che tutte le colonne appartenenti alla stessa column-family vengono archiviate fisicamente nello stesso file. Le super-column sono delle colonne che possono contenere altre colonne.
Definiti i diversi data model, passando al secondo punto riguardo i diversi approcci di archiviazione e gestione fisica dei dati (data persistence) nei sistemi schemaless possiamo distinguere :
1. Memory-based. Questi database conservano le informazioni esclusivamente nella memoria per aumentare al massimo le performance in fase di lettura dei dati. Tuttavia hanno come limite il fatto che le informazioni in essi contenente non può superare la dimensione della memoria fisica della macchina sui cui sono installati e inoltre non garantiscono in alcun modo il recupero dei dati nel caso in cui la macchina venga riavviata per problemi di alimentazione o per manutenzione. Per risolvere o limitare al massimo il problema della durabilità dei dati, alcune implementazioni, replicano le informazioni su più server in modo da diminuire la probabilità di power failure contemporanee.
2. Disk-based. Questi database conservano i dati soltanto nell'hard disk e non fanno uso di meccanismi di caching per aumentare le performance. Questo approccio non soffre dei problemi di durabilità dei database memory-based, ma offre peggiori performance in fase di lettura.
3. Combinazione di disk e memory based. Questo è l'approccio più usato in quanto combina la velocità di lettura propria del modello memory-based con la durabilità e l'affidabilità del modello disk-based. Questi database scrivono le informazioni in memoria e parallelamente aggiungono un record in un commit log in modalità append-only per garantire durabilità. Quando il numero di inserimenti o aggiornamenti nel database supera una certa soglia, i dati contenuti in memoria vengono ottimizzati e resi persistenti scrivendoli sul disco rigido. Offrono inoltre grandi prestazioni in lettura nel caso in cui le informazioni richieste dall'utente risiedano in memoria.
Il terzo punto, riguardo la scalabilità dei database, rappresenta sicuramente un fattore importante nella classificazione di sistemi di storage intrinsecamente distribuiti. In linee generali questi si possono distinguere in base al :
1. Supporto al teorema di CAP. Il teorema enunciato per la prima volta da Eric. A. Brewer, capo del reparto ricerca di Yahoo e professore di “Computer Science“ all'università di Berkeley, in una presentazione del 1998 [brewer] afferma che un sistema di dati condiviso è generalmente caratterizzato da tre proprietà: 1consistenza, 2disponibilità, tolleranza al partizionamento di rete3 (Consistency, Availability, tollerance to network Partitions). Il teorema afferma che si possono avere simultaneamente solo due di queste tre proprietà, sacrificando quindi la terza. Ad esempio possiamo avere :
Consistenza e Disponibilità: si tratta di sistemi localizzati che non risentono di partizionamento di rete, come un un database centralizzato o LDAP o un file system.
Consistenza e tolleranza al Partizionamento: sistemi distribuiti, con un elevato partizionamento di rete, in cui il valore della consistenza dei dati è di primaria importanza, a scapito della eventuale elevata latenza e bassa disponibilità (dovuta a politiche di locking pessimistiche).
Disponibilità e tolleranza al Partizionamento: la disponibilità è il valore principale per questo genere di sistemi. Per questo utilizzano protocolli più ottimistici e un approccio best-effort. Un esempio classico sono i DNS.
Molti sistemi di storage appartenenti alla categoria dei database schemaless, caratterizzati da architetture altamente scalabili e distribuite, hanno come obiettivo le prestazioni e l'alta disponibilità trovandosi quindi nella terza delle situazioni citate. Queste soluzioni usano un approccio BASE (Basic Available, Soft-state, Eventual consistency) piuttosto che l'approccio ACID (Atomicity, Consistency, Isolation, Durability) proprio dei database relazionali. Nel campo dei database schemaless questo approccio alla scalabilità e distribuzione dei dati spinto verso la disponibilità ha come capostipite il database di Amazon Dynamo [taxo] che come detto accetta il principio dell'Eventual Consistency e che ha come risultato positivo che il sistema è sempre pronto alla scrittura e non presenta mai periodi di lock.
Oltre a questo approccio orientato alla disponibilità, alcuni sistemi presentano invece un'architettura orientata verso la garanzia della consistenza tipico dei database relazionali. E' questo il caso dei sistemi basati o ispirati dal prodotto Google BigTable, il cui modello tenta di tenere sincronizzati i vari nodi di cui è composto il sistema posizionandosi quindi nella classe Consistenza e tolleranza al partizionamento di rete.
2. Supporto ai Multi Data Center. In alcune soluzioni [multcen] il partizionamento dei dati può avvenire in modo che i dati vengano replicati su server appartenenti a data center differenti distanti geograficamente gli uni dagli altri. Questo risultato è più facile da realizzare per sistemi di storage che adottano una soluzione Eventual Consistency.
3. Supporto all'aggiunta dinamica di server. Alcune soluzioni di storage consentono l'aggiunta dinamica in modalità live di server al cluster in maniera trasparente all'applicazione e all'utente finale che utilizza il programma.
Definiti i diversi data model dei database schemaless e i differenti approcci di gestione fisica
dei dati e di scalabilità, rimane da classificare le diverse interfacce di accesso ai dati e come queste possono essere usate dagli utenti o dai programmatori per recuperare le informazioni in essi contenute. Di seguito possiamo elencare le più comuni modalità di accesso ai dati usate nel contesto dei database schemaless :
1. REST. REST è l’acronimo di Representational Transfer State, ed è un paradigma per la realizzazione di applicazioni Web che permette la manipolazione delle risorse per mezzo dei metodi GET, POST, PUT e DELETE del protocollo HTTP. I database che espongono questo tipo di interfaccia possono essere gestiti remotamente o in locale usando un comune browser oppure mediante le API che ogni linguaggio di programmazione mette a disposizione per effettuare semplici chiamate HTTP.
2. Thrift [thrift]. E' un framework di chiamate a procedure remote implementato inizialmente da Facebook e successivamente ceduto ad Apache. Tramite questo adattatore è possibile interfacciarsi a software implementati in linguaggi di programmazione differenti tra i quali : Java, C++, C#, Ruby, Php, ecc.. Molti database schemaless adottano questo approccio per essere indipendenti dal linguaggio di programmazione adottato dallo sviluppatore.
3. MapReduce. MapReduce [mapred] è un modello di programmazione distribuita per l'analisi di grandi quantità di dati introdotto da Google. MapReduce consiste in due task : il nodo che esegue il processo map prende in input dati sotto forma di coppie chiave/valore ed estrae da essi una porzione generando altre coppie di dati chiave/valore. Facendo ciò il processo map scompone i dati e quindi il problema principale in sotto problemi relativamente ai nuovi valori generati. Successivamente il processo reduce riunifica tutti i dati generati dai processi map e calcola il risultato finale oggetto dell'analisi. MapReduce aggiunge ai database schemaless, progettati e ottimizzati per gestire dati non strutturati o semi-strutturati, la possibilità di filtrare, organizzare e reportizzare i dati. Con questa tecnologia, infatti, è possibile creare una vista strutturata parallela rispetto al database intrinsecamente destrutturato, similmente a quanto accade nei database relazionali con l'uso delle viste. Bisogna notare tuttavia che le viste prodotte da MapReduce sono persistenti e vengono salvate nel filesystem diversamente dalle viste dei database relazionali che quasi sempre rappresentano una visione dei dati temporanea e non autoconsistente.
4. Language Specific API. Alcune implementazioni non adottano tecnologie standard e hanno implementano connettori specifici per l'interfacciamento con l'esterno o con software di terze parti.