1.1 Come funziona un database NoSQL

I database NoSQL utilizzano una varietà di modelli di dati per accedere e manipolare i dati. Questi tipi di database sono ottimizzati per applicazioni a uso intensivo di dati che richiedono bassa latenza e modelli di dati flessibili. Tutto ciò si ottiene attenuando i severi requisiti di coerenza dei dati tipici di altri tipi di database.

Considera un esempio di modellazione dello schema per un semplice database di libri.

  • In un database relazionale, una voce del libro è spesso suddivisa in più parti (o "normalizzata") e archiviata in tabelle separate le cui relazioni sono definite da vincoli di chiave primaria ed esterna. In questo esempio, la tabella Books ha le colonne ISBN , Book Title e "ISBN"e"Author"Author-ISBN ha leeAuthor NameeAuthor IDle colonneAuthorstabellaNumberEdition. Il modello relazionale è progettato per mantenere l'integrità referenziale tra le tabelle in un database. I dati vengono normalizzati per ridurre la ridondanza e sono generalmente ottimizzati per l'archiviazione.

  • In un database NoSQL, un record del libro viene in genere archiviato come documento JSON. Per ogni libro o elemento, i valori ISBN , Titolo libro , Numero edizione , Nome autore e ID autore vengono memorizzati come attributi in un singolo documento. In questo modello, i dati sono ottimizzati per lo sviluppo intuitivo e la scalabilità orizzontale.

1.2 Per cosa possono essere utilizzati i database NoSQL?

I database NoSQL sono adatti per molte applicazioni moderne, come applicazioni mobili, di gioco e Web, che richiedono database flessibili e scalabili con prestazioni elevate e funzionalità avanzate in grado di fornire la massima usabilità.

  • Flessibilità . In genere, i database NoSQL offrono schemi flessibili, consentendo uno sviluppo più rapido e consentendo un'implementazione incrementale. Grazie all'uso di modelli di dati flessibili, i database NoSQL sono adatti per dati semi-strutturati e non strutturati.

  • Scalabilità . I database NoSQL sono progettati per scalare utilizzando cluster hardware distribuiti, non aggiungendo server costosi e affidabili. Alcuni fornitori di servizi cloud eseguono queste operazioni in background, fornendo un servizio completamente gestito.

  • Alte prestazioni . I database NoSQL sono ottimizzati per modelli di dati e modelli di accesso specifici per ottenere prestazioni più elevate rispetto ai database relazionali.

  • Ampia funzionalità . I database NoSQL forniscono API avanzate e tipi di dati progettati specificamente per i rispettivi modelli di dati.

1.3 Tipi di database NoSQL

I database NoSQL vengono utilizzati laddove non è molto conveniente archiviare i dati sotto forma di tabelle. Pertanto, sono memorizzati in formati molto diversi. Di solito, ci sono 6 tipi di dati principali di database NoSQL.

DB basato su coppie chiave-valore

I database che utilizzano coppie chiave-valore supportano un'elevata separabilità e forniscono un ridimensionamento orizzontale senza precedenti non ottenibile con altri tipi di database. Buoni casi d'uso per i database chiave-valore sono i giochi, la pubblicità e le applicazioni IoT.

Ad esempio, Amazon DynamoDB garantisce un funzionamento stabile del database con un ritardo non superiore a pochi millisecondi su qualsiasi scala. Questa robusta performance è stata la ragione principale per la migrazione delle storie di Snapchat a DynamoDB, poiché questa funzionalità di Snapchat è associata al più grande carico di scrittura dello storage.

Documento

Nel codice dell'applicazione, i dati sono spesso rappresentati come un oggetto o un documento in un formato simile a JSON perché è un modello di dati efficiente e intuitivo per gli sviluppatori. I database di documenti consentono agli sviluppatori di archiviare ed eseguire query sui dati in un database utilizzando lo stesso modello di documento utilizzato nel codice dell'applicazione. La natura flessibile, semi-strutturata e gerarchica dei documenti e dei database di documenti consente loro di evolversi con le esigenze dell'applicazione.

Il modello di documento funziona bene nei cataloghi, nei profili utente e nei sistemi di gestione dei contenuti in cui ogni documento è unico e cambia nel tempo. Amazon DocumentDB (compatibile con MongoDB) e MongoDB sono database di documenti comuni che forniscono API funzionali e intuitive per lo sviluppo agile.

Database a grafo

I database a grafo semplificano lo sviluppo e l'esecuzione di applicazioni che funzionano con insiemi di dati complessi. Esempi tipici di utilizzo di database a grafo sono i social network, i servizi di raccomandazione, i sistemi di rilevamento delle frodi e i grafi della conoscenza. Amazon Neptune è un servizio di database grafico completamente gestito. Neptune supporta il Property Graph e il Resource Description Framework (RDF), fornendo due API grafiche tra cui scegliere: TinkerPop e RDF/SPARQL. I database grafici comuni includono Neo4j e Giraph.

DB in memoria

Spesso le applicazioni di gioco e pubblicità utilizzano classifiche, archiviazione delle sessioni e analisi in tempo reale. Tali funzionalità richiedono una risposta entro pochi microsecondi, mentre un forte aumento del traffico è possibile in qualsiasi momento.

Amazon MemoryDB per Redis è un servizio di database in memoria affidabile e compatibile con Redis che riduce la latenza di lettura a millisecondi e fornisce durabilità in più zone di disponibilità. MemoryDB è progettato appositamente per prestazioni e affidabilità elevatissime, quindi può essere utilizzato come database principale per le moderne applicazioni basate su microservizi.

Amazon ElastiCache è un servizio di caching in memoria completamente gestito compatibile con Redis e Memcached per servire carichi di lavoro a bassa latenza e throughput elevato. Clienti come Tinder, che hanno bisogno che le loro app rispondano in tempo reale, utilizzano sistemi di archiviazione in memoria anziché su disco. Un altro esempio di data warehouse appositamente creato è Amazon DynamoDB Accelerator (DAX). DAX consente a DynamoDB di leggere i dati molte volte più velocemente.

Cerca nei database

Molte applicazioni generano registri per facilitare agli sviluppatori la risoluzione e la correzione dei problemi. Amazon OpenSearch è un servizio appositamente creato per la visualizzazione e l'analisi quasi in tempo reale di flussi di dati generati automaticamente mediante l'indicizzazione, l'aggregazione e la ricerca di log e parametri semi-strutturati.

Inoltre, Amazon OpenSearch è un servizio di ricerca full-text potente e ad alte prestazioni. Expedia sfrutta oltre 150 domini di servizio Amazon OpenSearch, 30 TB di dati e 30 miliardi di documenti per una varietà di casi d'uso mission-critical, dal monitoraggio operativo e la risoluzione dei problemi al monitoraggio dello stack di applicazioni distribuite e all'ottimizzazione dei costi.

1.4 Confronto tra database SQL (relazionali) e NoSQL (non relazionali).

NoSQL ha molti vantaggi, quindi dovresti almeno in teoria sapere che lo strumento di cui hai bisogno esiste già prima di scriverlo tu stesso. Di seguito fornirò un confronto tra database NoSQL e SQL:

Carichi di lavoro adeguati

I database relazionali sono progettati per applicazioni di elaborazione delle transazioni in tempo reale (OLTP) transazionali e altamente coerenti e sono adatti per l'elaborazione analitica in tempo reale (OLAP).

I database NoSQL sono progettati per funzionare con una gamma di modelli di accesso ai dati, incluse le applicazioni a bassa latenza. I database di ricerca NoSQL sono progettati per l'analisi di dati semi-strutturati.

Modello dati

Il modello relazionale normalizza i dati e li trasforma in tabelle composte da righe e colonne. Uno schema definisce rigidamente tabelle, righe, colonne, indici, relazioni tra tabelle e altri elementi del database. Tale database garantisce l'integrità dei dati di riferimento nelle relazioni tra le tabelle.

I database NoSQL forniscono una varietà di modelli di dati come coppie chiave-valore, documenti e grafici ottimizzati per prestazioni elevate e scalabilità.

Proprietà ACIDO

I database relazionali forniscono un insieme di proprietà ACID: atomicità, coerenza, isolamento, affidabilità.

  • L'atomicità richiede che una transazione venga eseguita nella sua interezza o per niente.
  • Coerenza significa che non appena una transazione viene completata, i dati devono essere conformi allo schema del database.
  • L'isolamento richiede che le transazioni parallele vengano eseguite separatamente l'una dall'altra.
  • L'affidabilità si riferisce alla capacità di ripristinare l'ultimo stato salvato dopo un guasto imprevisto del sistema o un'interruzione dell'alimentazione.

I database NoSQL spesso offrono un compromesso, allentando i rigidi requisiti delle proprietà ACID a favore di un modello di dati più flessibile che consente il ridimensionamento orizzontale. Ciò rende NoSQL un'ottima scelta per i casi d'uso con larghezza di banda elevata e bassa latenza che richiedono il ridimensionamento orizzontale oltre una singola istanza.

Prestazione

Le prestazioni dipendono principalmente dal sottosistema del disco. L'ottimizzazione delle query, degli indici e della struttura delle tabelle è spesso necessaria per ottenere le massime prestazioni.

Le prestazioni in genere dipendono dalle dimensioni del cluster hardware sottostante, dalla latenza di rete e dall'applicazione chiamante.

Ridimensionamento

I database relazionali in genere scalano aumentando la potenza di calcolo dell'hardware o aggiungendo copie separate per i carichi di lavoro in lettura.

I database NoSQL in genere supportano un'elevata separabilità attraverso modelli di accesso scalabili basati su un'architettura distribuita. Ciò migliora il throughput e offre prestazioni costanti su scala quasi illimitata.

API

Le richieste per la scrittura e il recupero dei dati vengono scritte in SQL. Queste query vengono analizzate ed eseguite da un database relazionale.

Le API orientate agli oggetti consentono agli sviluppatori di applicazioni di scrivere e recuperare facilmente strutture di dati. Utilizzando le chiavi di partizione, le applicazioni possono cercare coppie chiave-valore, insiemi di colonne o documenti semistrutturati contenenti oggetti seriali e attributi dell'applicazione.