Cos’è e quali sono le caratteristiche del DBMS MongoDB

Cos’è e quali sono le caratteristiche del DBMS MongoDB

MongoDB

MongoDB è un DBMS non relazionale sviluppato in C++, open-source, document-oriented, scalabile e altamente performante. Esso è stato realizzato in maniera tale da avere alte prestazioni in lettura e scrittura. Le letture più consistenti infatti possono essere distribuite in più server replicati, le interrogazioni sono più semplici e veloci grazie all’assenza di join e l’approccio ai documenti rende possibile la rappresentazione di relazioni gerarchiche complesse attraverso documenti nidificati e array.

Ecco le sua caratteristiche distintive:

  • Database document-oriented: i dati vengono archiviati sotto forma di documenti in stile JSON con schema dinamici, secondo una struttura molto semplice e potente;
  • Supporto completo agli indici: indicizzazione di qualsiasi attributo;
  • Replicazione: facilità nella replicazione dei dati attraverso la rete e alta scalabilità;
  • Sharding: scalabilità orizzontale senza compromettere nessuna funzionalità;
  • Query document-based.

Cos'è e quali sono le caratteristiche del DBMS MongoDB

Database document-oriented

Questo modello di database eredita il meccanismo di storage dal paradigma doc- oriented che consiste nel memorizzare ogni record come documento che possiede caratteristiche predeterminate. Si può aggiungere un numero qualsiasi di campi con una qualsiasi lunghezza.
Nei doc-oriented si segue una metodologia differente rispetto al modello relazionale: si accorpano quanto più possibile gli oggetti, creando delle macro entità dal massimo contenuto informativo. Questi oggetti incorporano tutte le notizie di cui necessitano per una determinata semantica.
Pertanto MongoDB non possiede uno schema e ogni documento non è strutturato, ha solo una chiave obbligatoria: campo_id, la quale serve per identificare univocamente il documento; essa è comparabile, semanticamente, alla chiave primaria dei database relazionali.

Supporto completo agli indici

MongoDB utilizza le tecniche di indicizzazione; solitamente il campo_id è indicizzato automaticamente, inoltre conviene indicizzare anche quei campi dove è tipico eseguire ricerche o sui quali sono definiti ordinamenti. MongoDB, proprio per favorire l’indicizzazione, fornisce strumenti in grado di suggerire su quali campi sia opportuno definire indici.
Per usarli con buoni risultati conviene privilegiare applicazioni read-intensitive, ovvero collezioni con un alto rapporto letture/scritture per incrementare le letture rispetto alle scritture.
Nonostante siano molto utili vanno utilizzati solo se il campo è realmente selettivo in quanto indicizzare dei campi comporta sicuramente dei costi. Il tempo di scrittura infatti aumenta con l’aumentare degli indici utilizzati, questo perché una modifica o un’aggiunta di dati può comportare la modifica di molti indici.

Dunque affinché l’uso degli indici risulti veramente performante è importare fare una scelta ragionata considerando il tipo di interrogazioni che verranno effettuate sul sistema e quanto spesso quei dati verranno modificato o subiranno delle aggiunte.
In poche parole un indice è una struttura dati che cataloga le informazioni dei campi specificati nei documenti di una collezione. Attraverso questi indici risulta più facile e meno dispendioso ordinare i dati di una query e grazie ad essi si velocizzano i tempi di risposta in quanto per certe ricerche mirate non vengono più scannerizzati tutti i documenti ma si salta direttamente ai documenti che rispettano la clausola della query.

La maggior parte degli indici seguono la struttura ad albero, B-Tree, grazie alla quale con un semplice confronto del nodo padre si sceglie se considerare il braccio destro e sinistro scartando ogni volta un numero consistente di confronti.
Una volta definito un indice su uno o più campi sarà il sistema stesso a mantenere aggiornato l’indice.

E’ possibile inoltre definire diverse tipologie di chiavi:

  • Chiavi semplici: indicizzano un solo campo di una collezione (insieme di documenti con le stesse caratteristiche o simili, una sorta di tabella dei database relazionali);
  • Chiavi composte: indicizzano due o più campi di una collezione;
  • Chiavi documento: considerano come campo dell’indice un campo che contiene oggetti (utili per query che non richiedono interrogazioni ordinate);
  • Chiavi array: considerano come campo dell’indice un campo che contiene un array.

E’ possibile inoltre definire un indice sparso su un determinato campo, così facendo nell’indice saranno compresi solo gli oggetti che presentano il campo indicato, mentre quelli che non lo presentano verranno filtrati.
Caratteristica peculiare di MongoDB è la possibilità di utilizzare indici geospaziali bidimensionali i quali ci permettono di interrogare il sistema con query basate sulla posizione.

Replicazione

La replicazione è utilizzata per rimediare e prevenire malfunzionamenti. Essa infatti comporta ad una ridondanza dei documenti, la quale ritorna molto utile in caso di perdita dei dati. In poche parole consiste nel salvare più copie dei documenti in server diversi in modo tale di avere dei dati sicuri anche se accorrono degli errori in uno o più server.
Essenzialmente ci sono due tipi di replicazione: la Master-slave semplice e la Replica-Set. La prima, come suggerito dal nome, presenta un’unità centrale master che è sempre aggiornata, la quale periodicamente sincronizza tutti gli altri nodi (slave), che risultano quindi dipendenti ad essa. In questo modo in ambito distribuito si assicura una consistenza assoluta sul master ed una consistenza relativa sullo slave, nel senso che prima o poi lo slave risulterà sincronizzato con il master. In caso di malfunzionamento di un nodo, il ripristino deve essere eseguito manualmente.
La tecnica Replica-Set o insieme di replicazione è una elaborazione del modello Master-Slave che aggiunge il ripristino automatico dopo un malfunzionamento ed il supporto di cluster di server con membri primari (master) e secondari (slave).

Sharding

Lo sharding è la tecnica usata per partizionare orizzontalmente un database. Mentre nel partizionamento verticale, chiamato normalizzazione si punta a separare ed isolare semantiche omogenee splittando una tabella in più tabelle dividendo i campi della tabella stessa, nel partizionamento orizzontale lo split è realizzato in modo da ottenere due o più insiemi di tuple da sistemare in due o più tabelle.
In MongoDB le tecniche di Sharding estendono proprio il partizionamento orizzontale permettendo agli shard, cioè alle partizioni ottenute dal database di partenza, di essere slegati completamente gli uni dagli altri. Questa separazione è possibile in quanto ogni shard può vivere in una istanza dello schema logico totalmente separato e può essere ospitato da un server fisico diverso da quello degli altri shard. Pure il data center può essere uno qualsiasi, addirittura trovarsi in un altro continente. In poche parole ogni shard non dipende dal sistema logico e fisico sottostante.

Questa tecnica comporta ovviamente dei vantaggi: essendo ridotto il numero di righe di ogni tabella coinvolta e dunque pure le dimensioni degli indici risultano ridotte, le ricerche sono più veloci e più efficienti. Si ottengono performance superiori grazie anche al parallelismo reso possibile dalla possibilità di posizionare ogni shard su hardware differenti. Inoltre la segmentazione dei dati può seguire in maniera più naturale gli aspetti del mondo reale che possono coinvolgere spazi completamente separati.
MongoDB prevede un servizio automatico di sharding, grazie al quale una volta impostata la chiave sulla quale eseguire il partizionamento orizzontale, il sistema segmenta automaticamente la collezione. Le collezioni che vengono così a crearsi sono strutturalmente identiche: le dimensioni in termini di oggetti e occupazione di spazio sono bilanciate. Si generano delle shard key ovvero delle chiavi di frammentazione, partendo dai chunk creati dai cluster che contengono i dati.

Tutti i metadati inoltre si memorizzano in un server di configurazione e si creano dei nodi router che propagano le richieste ai nodi. Quando ci sarà una richiesta si interroga un nodo che possiede una tabella con una mappa del sistema per sapere a quali shard rivolgersi per ottenere gli oggetti richiesti.

Query document-based

Una delle più importanti caratteristiche di MongoDB è la sua capacità di supportare query dinamiche ad hoc, le quali, essendo caratteristiche dei database relazionali, ci permettono con facilità di migrare dati da un database relazionale verso un database di MongoDB trasformando in pochi passaggi query SQL in query del linguaggio document-based.

Per recuperare i dati in MongoDB esistono varie query-object che rispecchiano i costrutti principali delle query SQL.

Tra i principali ricordiamo:

  1. Il selettore di campo, corrispondente allo SELECT in SQL, il quale recupera un sottoinsieme dei campi della nostra collezione. (In MongoDB, differentemente a quando accade in SQL, il campo_id è sempre ritornato.);
  2. La selezione, corrispondente alla WHERE in SQL, la quale indica attraverso dei criteri quali documenti recuperare in una collezione. Come in SQL vengono utilizzati operatori condizionali (and, or, nor, in, nin, all, exists, mod, size, type, ne), espressioni regolari, valori in array, valore negli oggetti embedded, meta operatori (not) e l’operatore di aggregazione (group). Il processo di selezione potrebbe causare un overhead per la ricerca di documenti nel database, per questo viene utilizzata la funzione “Map-Reduce”: prima di tutto per ogni elemento viene invocata la funzione “Map”, che produce delle coppie chiave-valore da passare alla successiva funzione e in seguito viene eseguita la funzione “Reduce”, che aggrega i risultati ricevuti e restituisce la nuova collezione;
  3. Gli ordinamenti, i quali, in maniera analoga alla clausola ORDER BY in SQL, specificando su quale campo eseguire l’ordinamento, ritornano risultati ordinati in maniera crescente o decrescente;
  4. Skipe limit, i quali permettono una paginazione dei risultati.

E’ importante sottolineare come i risultati di una query vengano gestiti: MongoDB usa tecniche di cursori, i quali sono usati per recuperare iterativamente tutti i documenti ritornati dalla query eseguita.

Principi di MongoDB

Come possiamo ben capire dalle sue caratteristiche, MongoDB, essendo un database NoSQL, non si preoccupa tanto di soddisfare le proprietà ACID tipiche dei database relazionali, piuttosto si concentra su aspetti più performanti per quanto riguarda la velocità, la flessibilità e la facilità d’uso del database.

Esso, organizzando i dati in documenti schemaless, riesce a rispondere alle interrogazioni con tempi molto inferiori rispetto ai database relazionali dove i dati sono separati in tabelle multiple e necessitano quindi di join per raggruppare i risultati.
Senz’altro anche l’approccio alla scalabilità orizzontale attraverso lo sharding è un altro punto a favore per la velocità e le prestazioni del database. Lo sharding consente infatti di gestire più carico di lavoro senza richiedere l’utilizzo di macchine potenti più grandi e quindi più costose e riesce ad aumentare la capacità senza tempi di inattività, sfaccettatura molto importante nel web che, a causa dell’aumento di carico dei dati, può essere costretto a disattivare il servizio per lunghi periodi di manutenzione.

Per quanto riguarda la flessibilità, essa è data dal tipo di formato utilizzato nei documenti: JSON. Formato che si adatta perfettamente ai vari linguaggi di programmazione e non avendo uno schema fisso permette di modificare e ampliare il modello di dati in maniera molto semplice e veloce.
Infine MongoDB punta alla semplicità: è facile da installare, configurare, mantenere e usare. A tal fine, fornisce poche opzioni di configurazione e cerca automaticamente, quando possibile, di fare la “cosa giusta” permettendo agli sviluppatori di concentrarsi sulla creazione dell’applicazione piuttosto che perdere tempo in oscure configurazioni di sistema.

Pubblicato da Vito Lavecchia

Lavecchia Vito Ingegnere Informatico (Politecnico di Bari) Email: [email protected] Sito Web: https://vitolavecchia.altervista.org

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *