Differenza tra Database SQL e Database NoSQL
Un database serve per immagazzinare i dati in maniera organizzata, come per esempio i dati gestiti da un’applicazione web. L’applicazione fa uso di query da effettuare sulla base di dati per recuperare specifiche porzioni di dati e informazioni quando richieste.
I database più utilizzati per le applicazioni web sono quelli basati sul modello relazionale, questi sono anche chiamati database SQL in riferimento al linguaggio utilizzato, Structured Query Language. Negli ultimi anni però, si sono fatti strada i database basati sulle coppie chiave-documento, sono detti quindi document-oriented, o in maniera informale database NoSQL e database non relazionali.
Database SQL
I database relazionali salvano i dati in tabelle, che modellano le diverse entità all’interno del dominio dell’applicazione.
Per esempio, un database che gestisce le ordinazioni avrà le tabelle clienti, prodotti e ordini.
Una tabella ha un numero fisso di colonne e un numero variabile di righe (o record). Le colonne definiscono i dati degli attributi elle entità di una data tabella.
Ad esempio, una tabella clienti avrà come colonne nome, cognome, indirizzo, telefono, e così via. Ogni riga nella tabella definisce un elemento effettivo costituito da valori per tutte le colonne.
Le tabelle hanno colonne speciali chiamate chiavi primarie (primary key), che contengono identificatori unici per ogni riga di una tabella. Le tabelle possono anche avere delle colonne chiamate chiavi esterne (foreign key), che contengono un riferimento chiave primaria di una riga su un’altra tabella (o anche sè stessa). Questi collegamenti tra righe sono chiamate associazioni (o relazioni, dall’inglese relationships) e sono la base del modello relazionale di un database,
Nel diagramma precedente, la tabella ruoli possiede la lista di tutti i possibili ruoli che l’utente può assumere, ognuno identificato da un valore id univoco, la chiave primaria della tabella. La tabella utente contiene l’elenco degli utenti, anche questa volta, ognuno col proprio id univoco. Oltre le chiavi primarie id, la tabella ruoli ha una colonna nome e la tabella utenti ha le colonne username e password. La colonna id_ruolo, inoltre, è una chiave esterna che referenzia alla colonna id di ruoli, e in questa maniera un ruolo è assegnato per ogni utente.
Come visto nell’esempio, i database relazionali salvano i dati in maniera efficiente evitando la creazione di duplicati. Rinominando un ruolo utente in questo database è semplice perché i nomi dei ruoli esistono tutti solo in un unico posto. Immediatamente dopo che il nome di un ruolo è stato modificato nella tabella ruoli, tutti gli utenti che hanno un determinato id_ruolo che si riferisce al nome del ruolo appena cambiato si vedranno il campo aggiornato.
Nonostante questo, avere i dati divisi su più tabelle può essere una complicazione. Produrre una lista degli utenti con i loro ruoli può presentare un problema, perché utenti e ruoli utenti hanno bisogno di esser letti da due tabelle differenti ed essere unificate (tramite un’operazione di giunzione offerta dalla join) prime di esser mostrata. I database relazionali offrono appunto clausole che permettono operazioni di join tra tabelle quando necessario.
Database NoSQL
I database che non seguono il modello relazione descritto precedentemente sono chiamati database NoSQL. Un database NoSQL utilizza le collections (collezioni di documenti), invece delle tabelle, e i documenti al posto dei record. I database NoSQL, quindi non relazionali, sono progettati in modo da rendere le join difficili, pertanto la maggior parte di loro non supporta direttamente questa operazione. Per un database NoSQL strutturato come nella precedente figura, listare gli utenti con i rispettivi ruoli richiede di effettuare una join leggendo
Ma una progettazione più adeguata per un database NoSQL è la seguente. Questo è il risultato dell’applicazione di un’operazione chiamata denormalizzazione, che riduce il numero di tabelle a scapito della duplicazione dei dati.
Un database con questa struttura ha il ruolo degli utenti esplicitamente salvato con ogni utente. Rinominando il ruolo può risultare un’operazione costosa che potrebbe richiedere la modifica e l’aggiornamento di un grande numero di documenti.
Ma non ci sono solo cattive notizie per quel che riguarda un database NoSQL. Avere dei dati duplicati permette l’esecuzione delle query più velocemente. Elencare gli utenti e i loro ruoli è un operazione diretta e semplice perché non ha alcun bisogno di effettuare join.
SQL o NoSQL, quale scegliere?
La differenza tra database SQL e database NoSQL sta sostanzialmente nella progettazione e in come vengono immagazzinati i dati al loro interno.
I database SQL eccellono nel salvare dati strutturati in maniera efficiente e compatta. Questi database fanno preservano la coerenza dei dati. I database NoSQL perdono parte della coerenza per guadagnare migliori prestazioni rispetto ai relazionali. I database NoSQL, inoltre, sono indicati per sistemi distribuiti.