L’evoluzione della gestione dei database: dall'SQL al NoSQL | Rizzoli Education

Compatibilità
Salva(0)
Condividi

Le nuove esigenze per la gestione dei dati superano la capacità dei tradizionali database SQL relazionali.

Per decenni l’SQL ha rappresentato lo standard di riferimento, eccellendo nella garanzia di coerenza e integrità tramite schemi rigidi e relazioni ben definite, tuttavia da qualche tempo non riesce più a soddisfare le sfide di performance dei nuovi sistemi.

Per le applicazioni Web ad alto traffico, che devono gestire milioni di utenti contemporaneamente e volumi di dati in rapida crescita (per esempio Amazon o Google) e per le applicazioni di Machine Learning, che devono addestrarsi facendo uso di grande varietà e ingenti quantità di dati, la rigidità di uno schema relazionale può diventare un intralcio. Queste nuove applicazioni infatti devono riuscire a trattare dati non strutturati o semi strutturati e la coerenza e l’integrità garantite dai sistemi relazionali non è più richiesta, per contro è diventata cruciale la possibilità di scalare orizzontalmente il dataset al variare delle condizioni.

I database NoSQL, con la loro flessibilità e capacità di gestire dati disomogenei in modo nativo, offrono l’infrastruttura ideale.

Per questo motivo è diventato importante introdurre anche questo argomento nella propria programmazione didattica quando parliamo di basi di dati.

La soluzione NoSQL più popolare è MongoDB, adottando la metodologia learning by doing, questo articolo propone la dimostrazione pratica di come realizzare un dataset documentale in questa piattaforma in cloud.

Nella seguente tabella si vede il confronto tra la nomenclatura e la funzione di alcuni elementi costitutivi di un database SQL con quella degli oggetti equivalenti in un modello documentale. 

SQL Data base documentale
Tabella Collezione
Riga Documento
Colonna Campo
Chiave primaria ObjectId

Un documento contiene una o più coppie chiave-valore, il valore è detto campo e può contenere altri documenti annidati (array, stringhe o variabili di altro tipo).

I documenti annidati vengono usati per rappresentare le relazioni tra i dati, nei database relazionali avremmo dovuto separare le informazioni in varie tabelle o entità, nei database noSQL invece, grazie al polimorfismo, due documenti appartenenti alla medesima collezione possono avere strutture diverse.

Per rappresentare questa particolare architettura si utilizza il formato JSON (JavaScript Object Notation) che consente agli sviluppatori e ai data scientist di interagire con i dati in modo più intuitivo e performante.

JSON è anche lo standard web per l’interscambio di dati ed è indipendente dai linguaggi di programmazione, si basa su due strutture, supportate da diversi linguaggi:

  • un insieme di coppie chiave-valore comprese tra parentesi graffe {}, le chiavi sono  separate dai valori con un segno di due punti e le diverse coppie sono separate da una virgola, in JavaScript così si definisce un oggetto, in Python un dizionario
  • un elenco ordinato di valori indicati tra parentesi quadre e separati da virgola, in JavaScript questo si  chiama array, mentre in Python costituisce una lista.

Supponiamo di voler risolvere questo esercizio:

Crea un nuovo database LineeAutobus e una collezione di fermate di un autobus che percorre l’intero territorio italiano, Inserisci 5 fermate indicando il nome della città, le coordinate della fermata e la regione: Venezia, Roma. Firenze, Bari e Lecce. Di seguito un esempio: 

{“città”: “Roma”, “regione”: “Lazio”, “posizione”: {“latitudine” : 41,9009, “longitudine”: 12,5005”}. 

Da interfaccia applica un filtro per visualizzare solo le fermate in Puglia.

Uno dei punti di forza di MongoDB è quello di fornire una piattaforma in cloud (cloud.MongoDB.com) gratuita in cui ci si può esercitare senza dover installare nulla sul proprio PC, ci si può registrare anche con il proprio account di posta elettronica.

Per interagire con il database possiamo utilizzare un qualsiasi linguaggio di programmazione moderno, come  JavaScript, Python, Java, C# o PHP.

Per iniziare dovremo creare il nostro cluster, scegliere un template, un provider cloud (da cui dipende anche il cluster principale dove saranno localizzati i nostri dati) e di inserire il nome del nostro progetto. 

L’ambiente MongoDB è molto guidato, tuttavia se abbiamo bisogno di un manuale possiamo consultarne uno all’indirizzo:

https://www.informaticabitabit.it/moodle/course/view.php?id=14.

Una volta che abbiamo creato il nostro cluster possiamo creare un nuovo database, la pagina iniziale della funzionalità che permette l’esplorazione dei dati (Data Explorer) contiene diverse possibilità:

cliccando sul + che appare se passiamo sopra al nostro nome utente possiamo creare un nuovo database, per esempio creiamo la collezione Linea1 del database LineeAutobus:

Cliccando su “Create database” il sistema ci da la possibilità di creare la nostra prima collezione, che inizialmente non avrà dati (documenti).

Possiamo caricare dei documenti utilizzando il formato JSON, in questo caso inseriremo ogni fermata come documento e dunque avremo un array di documenti:

[

  {“città”: “Venezia”,

    “regione”: “Veneto”,

    “posizione”: {

      “latitudine”: 45.4387,

      “longitudine”: 12.3330

    }},

  {“città”: “Roma”,

    “regione”: “Lazio”,

    “posizione”: {

      “latitudine”: 41.9028,

      “longitudine”: 12.4964

    }},

  {“città”: “Firenze”,

    “regione”: “Toscana”,

    “posizione”: {

      “latitudine”: 43.7696,

      “longitudine”: 11.2558

    }},

  {“città”: “Bari”,

    “regione”: “Puglia”,

    “posizione”: {

      “latitudine”: 41.1177,

      “longitudine”: 16.8517

    }},

  {“città”: “Lecce”,

    “regione”: “Puglia”,

    “posizione”: {

      “latitudine”: 40.3533,

      “longitudine”: 18.1740

    }}

]

Una volta dato il comando di inserimento il sistema assegnerà ad ogni documento un id, cioè un codice identificativo univoco.

Nella finestra dove ci troviamo possiamo notare una casella di testo, posta a sinistra del comando “Generate query”, è qui che dobbiamo inserire il filtro. 

L’esercizio ci richiede di visualizzare le fermate della Puglia, il filtro sarà quindi { “regione”: “Puglia” }, cliccando su find si applica il filtro, permettendo così di completare correttamente l’operazione.

L’attività che abbiamo portato a termine prevedeva di rimanere nell’ambiente MongoDB sia per la creazione del database che per il caricamento e l’interrogazione dei dati, ma, per visualizzare le informazioni presenti, possiamo anche accedere al database dall’esterno, per esempio con Python con l’aiuto della libreria PyMongo.

Dalla finestra principale, andando sul nostro Cluster possiamo cliccare su Connect, verremo guidati nella procedura che ci fornirà lo script di connessione:

Da Drivers possiamo scegliere il linguaggio, e otterremo le istruzioni per connetterci al nostro DB:

Attivando “View full code sample” otterremo proprio lo script che ci serve, possiamo copiare questo script e mandarlo in run dal nostro PC per verificarne il funzionamento.

from pymongo.mongo_client import MongoClient
from pymongo.server_api import ServerApi

uri = <tuo uri>

# Create a new client and connect to the server
client = MongoClient(uri, server_api=ServerApi(‘1’))

# Send a ping to confirm a successful connection
try:
    client.admin.command(ping)
    print(“Pinged your deployment. You successfully connected to MongoDB!”)
except Exception as e:
    print(e)

Al posto di <tuo uri> occorre sostituire il testo fornito dal MongoDB (inserendo anche la propria password).

L’istruzione client.admin.command(ping) esegue una prova di connessione (ping) e visualizza il messaggio “Pinged your deployment. You successfully connected to MongoDB!” se la connessione ha avuto esito positivo.

Se si volesse vedere la lista dei database presenti nel cluster basterebbe utilizzare l’istruzione:

    for dbInfo in client.list_database_names():
        print(dbInfo)

Se invece si vuole risolvere l’esercizio proposto, e cioè visualizzare le fermate della Puglia della collezione Linea1 del database LineeAutobus che abbiamo creato in precedenza, l’istruzione necessaria sarà:

    db = client[LineeAutobus]
    fermate = db[Linea1]
    print(fermate.find_one({ “regione”: “Puglia” }))

In conclusione, l’evoluzione verso i database NoSQL come MongoDB rappresenta una risposta concreta alle nuove esigenze di flessibilità, scalabilità e gestione di dati eterogenei richieste dalle moderne applicazioni, offrendo agli sviluppatori strumenti potenti e intuitivi per affrontare le sfide del futuro digitale.

Recapiti
Andrea Padovan