SQL, NoSQL, o entrambi? SQL, NoSQL, o entrambi? Introduzione Nella prima parte di questo corso abbiamo fatto una prima introduzione sul quando e come scegliere un database per risolvere un determinato problema. In questa parte finale vedremo attraverso un esempio pratico come affrontare tale scelta fornendo una serie di consigli che non vanno presi come “assoluti”, ma che vanno adattati sempre per il problema che si vuole affrontare. Si ricordi che i diversi database sono stati progettati e sviluppati per risolvere diverse tipologie di problemi. Generalmente quest'ultimi sono complessi e non esiste una sola soluzione che risolve l'intero problema, ma diverse soluzioni per le diverse parti del problema. SQL, NoSQL, o entrambi? Introduzione La soluzione migliore, in fase di progettazione e realizzazione di una piattaforma complessa, è quella che sfrutta il concetto della Polyglot Persistence: con questo termine si esprime l'idea di realizzare l'applicazione sfruttando un mix delle diverse tecnologie disponibili per la gestione delle singole attività scegliendo per ciascuna di esse la più adatta. Vedremo come con più adatta intendiamo sia l'essere adatta ai dati, all'esperienza legata alla fruizione dei dati ed al modello di business che si vuole portare avanti. SQL, NoSQL, o entrambi? Analisi del progetto In particolare, per ogni progetto, dovremmo analizzare: ● Scalabilità ● Atomicità e transazioni ● Consistecy VS Availability Alcuni di questi aspetti saranno fortemente influenzati dalla logica di business e dalla user experience che si vuole offrire. SQL, NoSQL, o entrambi? Analisi del progetto: scalabilità Il primo aspetto che dobbiamo analizzare per affrontare la progettazione del sistema e dei suoi componenti e capire la scalabilità del sistema oggetto della nostra progettazione. Il progetto punta ad una scalabilità verticale od orizzontale? Se il progetto (dal punto di vista dei dati e della loro aggregazione) girerà su un solo server/mainframe allora non ha senso parlare di Polyglot Persistence in quanto, come ovvio, vengono meno tutte le problematiche che hanno portato alla diffusione dei sistemi NoSQL. In questo caso va benissimo utilizzare un sistema basato su RDBMS per la realizzazione del nostro progetto. SQL, NoSQL, o entrambi? Analisi del progetto: scalabilità Se invece la scalabilità è orizzontale allora il sistema va progettato in modo che possa eventualmente utilizzare più database per la realizzazione dei servizi di cui si andrà a comporre. In questo caso, per alcuni dei componenti si punterà ad utilizzare sicuramente database NoSQL in quanto abbiamo visto che i database RDBMS supportano bene la scalabilità verticale, ma non quella orizzontale. SQL, NoSQL, o entrambi? Analisi del progetto: atomicità e transazioni Il secondo aspetto che va analizzato è l'importanza dell'atomicità e dell'utilizzo delle transazioni per l'intero progetto che si vuole realizzare o per alcuni dei dati (anche in forma aggregata). Per quel che riguarda l'atomicità l'aspetto su cui focalizzarsi è capire se questa proprietà serve sull'inserimento di un singolo dato oppure su una serie di dati. Nel primo caso abbiamo che molti sistemi NoSQL, ma non tutti, la garantiscono per il loro dato aggregato (es. un document): infatti, quando abbiamo illustrato il CQL di Cassandra abbiamo visto che la singola operazione di INSERT di una riga è atomica ed isolata. Se invece ci interessa l'atomicità sull'inserimento di più dati, ovvero ci interessa una transazione, il database che va bene per questo utilizzo è RDBMS. SQL, NoSQL, o entrambi? Analisi del progetto: Consistecy VS Availability Il terzo aspetto che va analizzato è il bilanciamento che vogliamo ottenere fra Consistecy ed Availability. Anche queste proprietà vanno analizzate in relazione ai singoli aspetti del progetto. Come già visto la scelta fra consistency ed availability viene fatta solo se suddividiamo i dati in partizioni distribuite (anche geograficamente). In caso contrario abbiamo sia consistency che availability. La scelta non è binaria, ma è SEMPRE un bilanciamento fra le due. SQL, NoSQL, o entrambi? Un caso d'Uso Il caso d'uso che vogliamo progettare è quello della seguente piattaforma di E-Commerce E-Commerce Platform Shopping cart data Completed orders Customer social graph BI / DW ? Log Session data Report Inventory & item price SQL, NoSQL, o entrambi? Caso d'uso: User Experience Per la progettazione della piattaforma dobbiamo analizzare gli aspetti illustrati in precedenza tenendo conto sia della user-experience che si vuole offrire attraverso il progetto e la logica di business che si vuole realizzare. SQL, NoSQL, o entrambi? Caso d'uso: Analisi delle esigenze Acquirente Venditore Login Analisi Report Inserimento e update prodotto Ricerca Nome del prodotto BI e DW Descrizione del prodotto Sistema Prodotto Inserimento nel carrello del prodotto Tracking delle operazioni e log Completamento acquisto del prodotto Transazione bancaria Analisi Batch Salvataggio report Suggerimenti acquirente basato su reti sociali SQL, NoSQL, o entrambi? Caso d'uso: Analisi delle esigenze Acquirente Venditore Login Analisi Report Inserimento e update prodotto Ricerca Nome del prodotto BI e DW Descrizione del prodotto Sistema Prodotto Inserimento nel carrello del prodotto Tracking delle operazioni e log Completamento acquisto del prodotto Transazione bancaria Analisi Batch Salvataggio report Suggerimenti acquirente basato su reti sociali SQL, NoSQL, o entrambi? Caso d'uso: Prodotto Per ogni prodotto vogliamo che questo abbia: (a) Nome del prodotto (b) Descrizione libera (con campi variabili) (c) Metatag per la descrizione rapida del prodotto (d) Dati del venditore (e) Prezzo (f) Disponibilità (numero di pezzi) SQL, NoSQL, o entrambi? Caso d'uso: Prodotto Per ogni prodotto vogliamo che questo abbia: (a) Nome del prodotto (b) Descrizione libera (con campi variabili) (c) Metatag per la descrizione rapida del prodotto (d) Dati del venditore (e) Prezzo (f) Disponibilità (numero di pezzi) (a), (b) e (c) sono dati che verranno modificati raramente e dovranno essere sempre disponibili per la visualizzazione anche se non ancora aggiornati con l'ultima modifica (per logica di business si punta ad avere una vetrina con più prodotti possibili anche se mancano ad esempio prezzo e disponibilità). Quindi si ha eventual consistency, alta availability e ci interessa l'atomicità sull'inserimento di queste informazioni. Soluzione ideale: Key-Value store o Document store. SQL, NoSQL, o entrambi? Caso d'uso: Prodotto Per ogni prodotto vogliamo che questo abbia: (a) Nome del prodotto (b) Descrizione libera (con campi variabili) (c) Metatag per la descrizione rapida del prodotto (d) Dati del venditore (e) Prezzo (f) Disponibilità (numero di pezzi) (d) sono dati che verranno modificati raramente e dovranno essere sempre disponibili per la visualizzazione. Alcuni di questi sono “sensibili” come l'IBAN per i pagamenti ed è importante che siano aggiornati con l'ultima modifica effettuata e se non aggiornati potenzialmente è meglio non visualizzarli. Quindi si ha consistency, e ci interessa l'atomicità sull'inserimento di queste informazioni. Soluzione ideale: RDBMS o database NoSQL con consistency. SQL, NoSQL, o entrambi? Caso d'uso: Prodotto Per ogni prodotto vogliamo che questo abbia: (a) Nome del prodotto (b) Descrizione libera (con campi variabili) (c) Metatag per la descrizione rapida del prodotto (d) Dati del venditore (e) Prezzo (f) Disponibilità (numero di pezzi) (e) e (f) sono dati che verranno modificati dinamicamente si dovrà visualizzare sempre il più recente. Soluzione ideale: RDBMS. Nota: potrebbe accadere che per logica di business la certezza dell'informazione (soprattutto per la disponibilità) venga spostata nella fase di gestione del carrello in modo da fornire agli utenti la pagina prodotto “completa”. SQL, NoSQL, o entrambi? Caso d'uso: Acquirente Per ogni acquirente vogliamo gestire: (a) Dati utente (b) Dati di login (c) Acquisti (d) Storico ricerche (e) Storico acquisti (f) Collegamenti con altri utenti SQL, NoSQL, o entrambi? Caso d'uso: Acquirente Per ogni acquirente vogliamo gestire: (a) Dati utente (b) Dati di login (c) Acquisti (d) Storico ricerche (e) Storico acquisti (f) Collegamenti con altri utenti (a) vengono modificati raramente (es. carta di credito predefinita, indirizzo di spedizione predefinito). Per quanto si tratti di dati spesso “sensibili” si noti che la loro modifica non è contemporanea al loro utilizzo. Soluzione ideale: RDBMS o database NoSQL con consistency. SQL, NoSQL, o entrambi? Caso d'uso: Acquirente Per ogni acquirente vogliamo gestire: (a) Dati utente (b) Dati di login (c) Acquisti (d) Storico ricerche (e) Storico acquisti (f) Collegamenti con altri utenti (b) vengono inseriti una volta ed eventualmente a volte viene modificata la password. Lo scopo è garantire l'accesso alla piattaforma il più velocemente possibile. Soluzione ideale: Key-value Store SQL, NoSQL, o entrambi? Caso d'uso: Acquirente Per ogni acquirente vogliamo gestire: (a) Dati utente (b) Dati di login (c) Acquisti (d) Storico ricerche (e) Storico acquisti (f) Collegamenti con altri utenti (c) la procedura di acquisto dal carrello deve essere garantita ed atomica (devo garantire prezzo prodotto, sua presenza in magazzino, buon fine della procedura bancaria). Ho quindi una transazione. Soluzione ideale: RDBMS. SQL, NoSQL, o entrambi? Caso d'uso: Acquirente Per ogni acquirente vogliamo gestire: (a) Dati utente (b) Dati di login (c) Acquisti (d) Storico ricerche (e) Storico acquisti (f) Collegamenti con altri utenti (d) e (e) gli storici vanno memorizzati sia per essere utilizzati come storico nella pagina utente, sia come fonti di dati per Business Intelligence e Data Warehouse. In questo caso è molto importante l'availability e che il dato singolo sia inserito correttamente in maniera atomica. Questi dati saranno la sorgente per altri tool per BI e/o DW(es. possono essere processati usando HIVE). Soluzione ideale: Column store. SQL, NoSQL, o entrambi? Caso d'uso: Acquirente Per ogni acquirente vogliamo gestire: (a) Dati utente (b) Dati di login (c) Acquisti (d) Storico ricerche (e) Storico acquisti (f) Collegamenti con altri utenti (f) se vogliamo monitorare i collegamenti sociali fra gli utenti ovvero con categorie di essi abbiamo necessità di memorizzare le relazioni in modo dinamico. Soluzione ideale: Graph Database. Nota: nonostante gli RDBMS siano dei sistemi relazionali non gestiscono le relazioni come i graph DB e quindi sono poco adatti alla generazione di relazioni complesse e variabili. SQL, NoSQL, o entrambi? Un caso d'Uso: Possibile Soluzione E-Commerce Platform Shopping cart data Session data Customer social graph Key-Value Store (Es. Voldemort) BI / DW Log DW Store / HDFS (Es. HIVE) Graph Store (Es. Neo4j) Completed orders Report Inventory & item price Document Store (Es. MongoDB) Column Family Store (Es. HBASE) RDBMS (Es. OracleDB)