1. Direzione dell'Arco
Gli archi sono orientati: un collegamento che va dal nodo al nodo () non equivale né a un collegamento in senso opposto () né a un collegamento bidirezionale ().
Il sesto modulo del corso analizza il passaggio dalle basi di dati relazionali tradizionali (RDBMS) alle architetture NoSQL (Not Only SQL), esaminando le quattro famiglie principali di modelli non relazionali e il Teorema CAP (di Brewer) che governa il bilanciamento tra coerenza, disponibilità e tolleranza ai guasti nei sistemi distribuiti su larga scala.
I database relazionali classici (come Oracle, MySQL o PostgreSQL) si fondano su regole strutturali molto rigide:
NULL, causando un forte spreco di spazio su disco e un rallentamento delle query;JOIN e delle conversioni: quando i dati sono fortemente interconnessi o le applicazioni orientate agli oggetti devono interagire ad altissima frequenza con la base dati, le operazioni di JOIN tra più tabelle e la conversione continua tra record relazionali e oggetti applicativi diventano colli di bottiglia critici.In generale, l’adozione di un database NoSQL risulta vantaggiosa quando ricorre almeno una delle seguenti quattro condizioni:
Struttura dei dati non definibile a priori
I dati in ingresso sono eterogenei, semi-strutturati o molto sparsi, rendendo impossibile o inefficiente disegnare a monte uno schema tabellare fisso.
Dati fortemente interconnessi e superamento del JOIN
I dati disposti nei vari oggetti presentano fitti legami reciproci per i quali il dispendioso operatore JOIN relazionale non è ottimale: conviene invece navigare direttamente tra gli oggetti sfruttando i riferimenti diretti tra i nodi di informazione.
Interazioni ad altissima frequenza (assenza di conversioni Record/Oggetto)
È necessario leggere e scrivere molto frequentemente sul database, evitando l’onere computazionale di convertire continuamente le righe di una tabella negli oggetti del linguaggio di programmazione.
Esigenza di prestazioni elevate oltre i vincoli ACID
Il dominio applicativo richiede velocità di risposta e scalabilità orizzontale estreme, rendendo accettabile allentare le rigide proprietà transazionali ACID (Atomicity, Consistency, Isolation, Durability) tipiche dei sistemi RDBMS.
Nei database a documenti la rappresentazione dei dati è affidata a strutture auto-contenute simili agli oggetti della programmazione, chiamate documenti (tipicamente serializzati in formato JSON, BSON o XML), ciascuno dei quali possiede un insieme di proprietà che descrivono le informazioni:
NULL;<<documento>> Sedi Lombardia può puntare ai documenti <<documento>> Sede Milano1 e <<documento>> Sede Milano2, i quali a loro volta puntano ai documenti dei singoli dipendenti (Rossi Paolo, Grigi Enea, Verdi Elena, Bianchi Lorena, Gialli Carlo);// Esempio di documento JSON/BSON in MongoDB con sotto-documento annidato{ "_id" : ObjectId("57bdd4a1eb426816499fb1be"), "Titolo" : "Promessi Sposi", "Autore" : "Alessandro Manzoni", "Pubblicazione" : { "Editore" : "PremiateEdizioni", "Anno_pubblicazione" : 2012, "Numero_pagine" : 732 }}I database Key-Value adottano il modello di archiviazione più snello e veloce:
(Chiave, Valore): i dati sono inseriti due valori alla volta, ossia una chiave univoca (Key) che funge da indice diretto e il valore (Value) ad essa associato (che può essere un tipo primitivo o una struttura complessa come una HashMap);In un database relazionale tradizionale, l’anagrafica di un utente è suddivisa su più colonne di una tabella rigida:
| id | nome | cognome | indirizzo | città | CAP |
|---|---|---|---|---|---|
123456 | Giulio | Rossi | Via Monte Bianco 78 | Torino | 10100 |
Nel modello Key-Value, l’identificativo diventa la Chiave di accesso istantaneo e l’intero profilo è incapsulato nel Valore (HashMap):
Key): Users:123456Value):
HashMap { "nome": "Giulio", "cognome": "Rossi", "indirizzo": "Via Monte Bianco 78", "città": "Torino", "cap": "10100"}A differenza dei database relazionali (che memorizzano fisicamente i dati riga per riga), i database Column-Based organizzano e archiviano i dati per colonna anziché per riga:
(Column Key, Column Value) pertinenti a quella specifica riga;Esempio di struttura Column-Family Database (Slide 12):
┌─── Column Family: Customer ───────────────┐ │ Column Key Column Value │ ┌─────►│ Name : Mak │ │ │ Address : 13th, Avenue │ │ │ Payment : Check │┌───────────────┐ │ └───────────────────────────────────────────┘│ Row Key: 3425 │────┤└───────────────┘ │ ┌─── Column Family: Orders ─────────────────┐ │ │ Column Key Column Value │ └─────►│ OR1 : Laptop HP │ │ OR2 : Samsung Mobile │ │ OR3 : Notebook │ │ OR4 : Stationary │ └───────────────────────────────────────────┘Nei database a grafi la struttura dati è modellata direttamente come un grafo orientato composto da nodi (entità) e archi (relazioni), in cui le informazioni possono essere custodite sia nei nodi sia negli archi:
1. Direzione dell'Arco
Gli archi sono orientati: un collegamento che va dal nodo al nodo () non equivale né a un collegamento in senso opposto () né a un collegamento bidirezionale ().
2. Significato Semantico (Label)
Ogni arco possiede un’etichetta (Label) che qualifica il rapporto di dipendenza, appartenenza o conoscenza tra i due nodi (es. knows, is_member, Members).
3. Proprietà sull'Arco
Gli archi stessi memorizzano attributi chiave-valore: ad esempio, se due nodi rappresentano due città, l’arco che li congiunge può memorizzare la distanza chilometrica (o il tempo di percorrenza), permettendo di calcolare direttamente il percorso più breve o più veloce.
Id: 1 (Name: Alice, Age: 18), Id: 2 (Name: Bob, Age: 22) e Id: 3 (Type: Group, Name: Chess).Alice al nodo Bob parte l’arco Id: 100 con Label: knows e proprietà Since: 2001/10/03, mentre da Bob verso Alice parte un arco distinto Id: 101 con Label: knows e Since: 2001/10/04;Alice sia Bob sono collegati al nodo gruppo Chess tramite archi is_member (con la rispettiva data di iscrizione Since: 2005/07/01 e Since: 2011/02/14) e archi inversi Members che partono dal gruppo verso i singoli membri.Formulato dall’informatico Eric Brewer, il Teorema CAP enuncia una legge fondamentale dei sistemi distribuiti:
È impossibile per un sistema informatico distribuito fornire simultaneamente tutte e tre le seguenti garanzie:
- Consistency (Coerenza — C)
- Availability (Disponibilità — A)
- Partition Tolerance (Tolleranza alle partizioni — P)
Quando una banca dati distribuita deve gestire un volume molto ampio di informazioni garantendo prestazioni elevate su un’infrastruttura di rete non immune da guasti, può soddisfare al massimo due di queste tre proprietà contemporaneamente, obbligando il progettista a sacrificarne una.
| Proprietà | Significato Tecnico | Implicazione Pratica a Lezione |
|---|---|---|
| C — Consistency (Coerenza) | Garanzia che ogni nodo in un cluster distribuito restituisca sempre il dato più recente (l’ultima versione aggiornata). | Nessun nodo può rispondere a un’interrogazione restituendo una versione vecchia (stale) del dato perché non ha ancora completato l’allineamento con gli altri nodi. |
| A — Availability (Disponibilità) | Garanzia che ogni richiesta riceva sempre una risposta entro l’intervallo di tempo utile previsto dal sistema. | Nella maggior parte dei sistemi reali, una risposta eccessivamente ritardata è altrettanto negativa quanto una risposta non data (equivale a un’indisponibilità del servizio). |
| P — Partition Tolerance (Tolleranza alle partizioni) | Garanzia che il sistema continui a funzionare anche quando un nodo cade o i messaggi sulla rete tra i nodi subiscono perdite o ritardi. | Grazie alla replicazione dei record tra i nodi, il cluster assorbe interruzioni intermittenti o guasti parziali senza interrompere l’operatività complessiva. |
CA, CP e APA seconda della proprietà che si sceglie di sacrificare, i database si suddividono in tre famiglie architetturali:
Consistency + Availability (RDBMS Tradizionali: Oracle, MySQL)
Consistency + Partition Tolerance (es. Apache HBase)
Availability + Partition Tolerance (es. Apache Cassandra, CouchDB)
| Modello / Categoria | Struttura del Dato | Caso d’Uso Ideale | Esempi di DBMS | Posizionamento CAP Tipico |
|---|---|---|---|---|
| Relazionale (RDBMS) | Tabelle rigide (righe e colonne tipizzate a priori) | Transazioni strutturate a basso/medio volume con vincoli ACID | Oracle, MySQL | CA (sacrifica Partition Tolerance) |
| NoSQL a Documenti | Documenti auto-contenuti (JSON / BSON / XML) navigabili ad albero | Dati sparsi o privi di schema definibile a priori | MongoDB, CouchDB | CP (MongoDB) / AP (CouchDB) |
| NoSQL Key-Value | Coppie (Chiave, Valore) indicizzate direttamente | Ricerche puntuali ad altissima frequenza e velocità | Redis, Cassandra | AP / CP |
| NoSQL Column-Based | Row Key che punta a diverse Column Family (ognuna su file distinto) | Grandi volumi distribuiti con letture/aggregazioni selettive per colonna | HBase, Cassandra | CP (HBase) / AP (Cassandra) |
| NoSQL a Grafi | Nodi e Archi orientati (con direzione, significato e proprietà sull’arco) | Dati fortemente interconnessi, reti sociali, calcolo del percorso ottimo | OrientDB, Neo4j | Variabile (Multi-modello) |