back to top

Caratteristiche di MongoDB

Come accennato, NoSQL è un termine generico che racchiude un’ampia categoria di DBMS i quali propongono dei metodi alternativi al modello relazionale per strutturare e organizzare i dati all’interno di un database.

MongoDB in particolare è un DBMS NoSQL orientato ai documenti. Al contrario di ciò che avviene nei RDBMS come MySQL, in MongoDB non esiste il concetto di riga di tabella. I dati vengono invece salvati in Documenti che non presentano una struttura rigida e uno schema fisso. A loro volta vari documenti con informazioni simili sono raggruppati in Collezioni. Queste sono mantenute all’interno di un Database.

I documenti in MongoDB

Torneremo ad approfondire l’argomento in futuro tuttavia è bene soffermarsi un momento per capire meglio in che modo vengono salvati i dati attraverso i documenti.

Un Documento può essere visto come un insieme di coppie campo-valore. All’interno di ciascun documento, ogni campo rappresenta un identificatore univoco a cui viene associato un valore di diverso tipo (numero, stringa, boolean, data ecc…) o persino un array, un altro documento annidato o un array di documenti. I documenti vengono salvati in formato BSON. Si tratta di un formato binario sviluppato a partire dalla notazione JSON con l’obiettivo di realizzare una soluzione più efficiente sia per lo spazio richiesto dai dati, sia per la velocità di ricerca.

Nel frammento di codice riportato sotto abbiamo un esempio di documento. Possiamo notare la presenza di un campo univoco speciale: "_id" che viene automaticamente generato da MongoDB.

{
  "_id": {"$oid": "4212a891f29561a1dbcd24a7"},
  "firstname": "John",
  "lastname": "Doe",
  "email": "[email protected]",
  "age": 44,
  "address": {
    "city": "Leeds",
    "street": "114, Wellington St",
    "postcode": "LS14LT"
  },
  "hobbies": [
    "football",
    "cycling",
    "swimming",
    "cooking"
  ]
}

In pratica, dal momento che risulterebbe difficile andare a lavorare direttamente sui file in formato binario, useremo il formato JSON per definire il contenuto dei documenti.

La scelta di creare un database orientato ai documenti non è casuale ed è parte dell’obiettivo del team di MongoDB, ovvero quello di creare un DBMS veloce e flessibile in grado di adattarsi ad eventuali cambiamenti.

Le moderne applicazioni richiedono spesso di salvare grandi quantità di dati ed eseguire un elevato numero di operazioni.

Può quindi succedere che le risorse preventivate per un database non siano più sufficienti ed è allora necessario incrementare la potenza di calcolo o la capacità di archiviazione dei server.

In questi casi si possono seguire sostanzialmente due possibili strade: aumentare le capacità di una macchina (Scalabilità verticale) o distribuire il carico di lavoro su più computer (Scalabilità orizzontale).

La prima strada è quella più semplice da percorrere finché non ci si scontra con costi eccessivi o con i limiti fisici delle macchine disponibili. A questo punto l’unica soluzione fattibile è quella di distribuire il carico di lavoro su più macchine.

MongoDB mette a disposizione diversi strumenti per scalare un’applicazione orizzontalmente. In particolare la flessibilità dei documenti consente di suddividere i dati su server diversi. È per semplificare ulteriormente questa procedura, dovremmo occuparci solo della configurazione iniziale, al resto penserà MongoDB che gestirà in autonomia il bilanciamento del carico su un gruppo di server, ridistribuendo automaticamente i documenti e instradando letture e scritture verso i computer corretti.

Questo metodo prende il nome di Sharding ed è una delle funzionalità più interessanti di MongoDB.

Tratteremo questo argomento in una delle prossime lezioni non prima di aver parlato del meccanismo di replica dei dati (Replica Set). In MongoDB possiamo infatti configurare un gruppo di processi che si occuperanno di gestire lo stesso insieme di dati. Questi verranno replicati garantendo una maggiore tolleranza contro possibili guasti. Grazie a questo meccanismo sarà raro incorrere in una perdita dei dati o nell’impossibilità di accesso al database a causa di malfunzionamenti.

Un Replica Set è costituito da un processo primario e più processi secondari. Nel caso in cui il processo primario dovesse riscontrare qualche problema e non fosse più raggiungibile, è previsto un sofisticato sistema di elezione di un nuovo processo primario fra quelli rimasti così da garantire sempre l’accesso ai dati sia in lettura che in scrittura.

Terminologia e concetti fondamentali di MongoDB

Ricapitolando, MongoDB è un DBMS distribuito che permette di salvare e mantenere dei dati in uno o più database. Ogni database può contenere varie Collezioni che sono paragonabili alle tabelle dei database SQL.

Al posto delle righe di tabella, abbiamo i Documenti i quali sono degli insiemi di coppie campo/valore. In ciascun documento, i campi devono essere univoci dal momento che svolgono un ruolo simile a quello delle colonne dei database relazionali. I documenti per loro natura non hanno una struttura prestabilita e all’interno della stessa collezione potremmo in teoria trovare documenti con campi diversi. I documenti possono anche avere campi di tipo array o addirittura dei documenti annidati.

Quella dei documenti annidati è una delle funzionalità distintive di MongoDB. Invece di inserire i dati in documenti di collezioni distinte, potremmo decidere di annidare le informazioni in un unico documento. Ciò permette di prelevare i dati dal database più velocemente dovendo accedere a un singolo documento, senza dover invece unire documenti di collezioni diverse come facciamo nei database relazionali attraverso i JOIN. Una tale scelta deve essere ovviamente supportata da un’attenta analisi in fase di progettazione dal momento che, annidando dei documenti, è probabile che venga generata ridondanza dei dati.

Al contrario dei database relazionali, in MongoDB non è richiesto procedere alla normalizzazione dei dati ed è accettabile avere le stesse informazioni ripetute nei documenti se ciò consente di velocizzare le operazioni di lettura.

In ogni caso, annidare dei documenti non è per forza la scelta migliore. Potremmo allora inserire dei documenti in collezioni diverse e stabilire una certa relazione fra i campi di documenti distinti, un po’ come facciamo nei database relazionali con le chiavi esterne.

MongoDB fornisce infatti degli operatori come $lookup che funzionano in modo simile al LEFT JOIN del linguaggio SQL e che vedremo più avanti in una delle prossime lezioni.

Nella prima lezione della nostra guida vi illustreremo come installare MongoDB in locale su diversi sistemi operativi e quali sono i componenti principali del programma.

Pubblicitร