Fondamenti di Informatica 2 Laboratorio di Basi di Dati A.A. 2013−2014 Francesco Pistolesi 6 Marzo, 7 Marzo (13:30 − 15:30): Concetto di database. Modello logico relazionale. Differenza fra linguaggi dichiarativi e linguaggi procedurali. Vantaggi dei linguaggi dichiarativi. Concetto di interrogazione di un database relazionale. Introduzione a SQL (sintassi MySQL). Concetto di proiezione, selezione e condizione. Costrutto SELECT-FROM-WHERE: sintassi, semantica e ordine di esecuzione. Proiezione totale. Condizioni articolate composte da connettivi logici: congiunzione e disgiunzione logica. Impostazione di precedenze fra condizioni multiple: uso delle parentesi. Gestione dei duplicati e direttiva DISTINCT: esempi di utilizzo e significato. Intervalli di valori numerici e condizioni espresse su intervalli: direttiva BETWEEN e confronto con gli operatori classici >= e <=. Valori NULL: importanza, significato e gestione. Selezione e filtraggio dei valori NULL: direttiva IS NULL e IS NOT NULL. Gestione delle date. Concetto di data in MySQL. Confronti fra date. Gestione delle date con operatori classici e funzioni di estrazione di giorno, mese e anno: DAY, MONTH, YEAR. Data corrente e condizioni: uso di CURRENT_DATE. Lassi di tempo e misura della loro estensione in giorni e mesi: uso di DATEDIFF e PERIOD_DIFF. Importanza del filtraggio dei valori NULL nell’uso delle funzioni sulle date. Spostamenti temporali nel passato e nel futuro: uso di DATE_ADD e DATE_SUB in combinazione con INTERVAL. Somma e sottrazione dirette con INTERVAL. Operatori di aggregazione. Concetto di collasso di un insieme di record in una tupla. Funzionamento degli operatori di aggregazione. Ridenominazione. Conteggio e conteggio su attributo: quando usare COUNT(*) e quando COUNT(DISTINCT Attributo). Somma e media aritmetica di valori su un attributo: SUM e AVG. Valore massimo e minimo su attributo: MAX e MIN. Introduzione al problema degli attributi non aggregati a cui è connesso il valore estremo su un attributo. Esercizi. 20 Marzo, 21 Marzo (13:30 − 15:30): Introduzione alle query su più tabelle. Motivazioni che spingono verso la frammentazione dei dati. Theta-join: significato, principio di funzionamento. Processazione di una query contenente un join. Theta1 join in MySQL: costrutto INNER JOIN-ON. Attributi omonimi e join naturale in MySQL: costrutto NATURAL JOIN. Differenza fra il join naturale e un equi-join su coppie di attributi omonimi: utilizzo di USING. Concetto di prodotto cartesiano e costrutto CROSS JOIN: cenni ai contesti di utilizzo. Join esterni. Principali differenze fra il theta-join e il join esterno. Join esterno sinistro e join esterno destro: principio di funzionamento, sintassi MySQL e costrutti LEFT|RIGHT OUTER JOIN-ON. Predicati dei join esterni e traduzione delle condizioni in relazione alle tuple joinabili e non joinabili. Query con join e condizioni sulle tuple. Processazione di una query con join e condizioni sulle tuple. Join multiplo. Problema dell’ambiguità e importanza della ridenominazione: quando è obbligatoria e quando non lo è. Self-join e self-join esterno: significato e contesti di utilizzo. Query annidate: significato e contesti di applicazione. Sottoquery scorrelate in MySQL. Uso di IN e NOT IN. Processazione di una query contenente una sottoquery scorrelata. Passaggio dalla versione annidata alla versione join-equivalente. Annidamento multiplo. Visibilità degli attributi ad ogni livello di annidamento. Sottoquery scalari. Risoluzione del problema degli attributi non aggregati a cui è connesso il valore estremo su un attributo (problema del massimo) mediante sottoquery scorrelata. Problema di utilizzo di IN o ’=’ nelle sottoquery. Risoluzione mista sottoquery-join. Sottoquery correlate: significato e differenza rispetto alle sottoquery scorrelate. Sottoquery correlate come condizione della query esterna. Processazione di una query contenente una sottoquery correlata nel WHERE. Sottoquery correlata per ottenere campi calcolati da proiettare. Processazione di una query contenente una sottoquery correlata nel SELECT. Esercizi. 3 Aprile, 4 Aprile (13:30 − 15:30): Introduzione alle viste. Impieghi delle viste: restrizione degli accessi ai dati e scomposizione di query complesse. Generalità sulla business intelligence, sull’aggregazione multidimensionale e visione strategica dei dati mediante le viste. Costrutto CREATE VIEW. Limitazione di un resultset e problema della cardinalità del risultato: uso di LIMIT. Tabelle derivate, impieghi, sintassi MySQL e differenza rispetto alle viste. Raggruppamento: generalità, significato concettuale, contesti di applicabilità. Costrutto GROUP BY. Raggruppamento su singolo attributo. Processazione di una query con raggruppamento su singolo attributo. Raggruppamento e proiezione. Esempio di risoluzione passo-passo di una query con raggruppamento su singolo attributo. Condizioni sui gruppi: generalità e scopo. Costrutto HAVING. Processazione e risoluzione passo-passo di una query con raggruppamento e condizioni sui gruppi. Condizioni sui gruppi errate e insensate: come evitarle. Condizioni sulle tuple e condizioni sui gruppi: differenza e precedenza di applicazione. Come riconoscere le condizioni sulle tuple e sui gruppi dal linguaggio naturale. Risoluzione passo-passo di una query con raggruppamento, condizioni sulle tuple e condizioni sui gruppi. Raggruppamento su più attributi: cosa significa, come si riconosce e quali attributi possono essere proiettati. Predicati 2 di raggruppamento ridondanti in assenza di vincoli unique: problema degli omonimi. Introduzione alle query insiemistiche. Concetto di appartenenza, esclusione e unione. Costrutti UNION e UNION ALL. Contesti di applicabilità dell’unione. Valori statici nella proiezione: quando sono indispensabili e come si inseriscono. Esempio di utilizzo di valori statici nella proiezione in una query con unione e join esterno. Esercizi. 11 Aprile (10:30 − 12:30): Esercitazione sulle query complesse. Svolgimento dettagliato e spiegazione del ragionamento di alcuni esercizi tratti dai compiti d’esame: esercizio 3 del 10/02/2014; esercizio 4 del 20/06/2013; esercizio 5 del 28/02/2014. 17 Aprile (13:30 − 15:30): Ancora sulle query insiemistiche. Concetto di differenza, complemento e differenza simmetrica. Come si riconoscono dal testo e come si traducono in MySQL: join+correlated subquery; UNION; self outer join+subquery. Intersezione e traduzione con subquery o inner join. Concetto di esistenza e contesti di applicabilità. Costrutti EXISTS/NOT EXISTS ed esempi di utilizzo. Divisione: che cosa significa, come si individua e perché è utile. Funzionamento della divisione: relazioni coinvolte, tuple interdette ed espressione equivalente in algebra relazionale. Traduzione in MySQL della divisione: doppio NOT EXISTS oppure raggruppamento e subquery di conteggio nella clausola HAVING. Modificatori di confronto: sintassi e contesti di utilità. Modificatore ANY: esempio di utilizzo e analogia con IN. Modificatore ALL: esempio di utilizzo e connettivi validi. Query complesse. Visioni strategiche dei dati. Ricerca di informazioni nascoste nei dati: primi esempi di business intelligence nel database della clinica. Strategia di risoluzione di una query complessa: divisione in sotto-problemi; traduzione; collegamento. Esempio di query complessa e risoluzione passo-passo. Data manipulation in MySQL: che cos’è e quando occorre. Inserimento. Sintassi MySQL per l’inserimento di valori statici: costrutto INSERT VALUES. Inserimento incompleto e specifica degli attributi coinvolti. Inserimento di valori ricavati: costrutto INSERT SELECT. Aggiornamento. Sintassi MySQL per l’aggiornamento: costrutto UPDATE SET WHERE. Cancellazione. Sintassi MySQL per la cancellazione: costrutto DELETE FROM WHERE. Cancellazione di un valore statico e cancellazione su condizione. Problema della non riferibilità della tabella target nella condizione, in aggiornamento e in cancellazione. Risoluzione con derived table o join anticipato. Database attivi: generalità, funzionalità e scopo. Paradigma evento-condizione-azione. Tipologie di evento: inserimento/cancellazione/timer. Significato della condizione e opzionalità. Eventi e catene di eventi. Scatto di molteplici azioni in cascata e problema dello stallo. Trigger MySQL. Concetto di trigger e significato. Eventi che scatenano un trigger: inserimeno, cancellazione, modifica. Sintassi MySQL per i trigger: costrutto CREATE TRIGGER. Impostazione dello scatto dopo l’evento oppure dopo l’azione: keyword BEFORE e AFTER. Esempio di trigger per la gestione dell’integrità di un attributo ridondante. Trigger multi-statement. Sintas3 si dichiarativo-procedurale MySQL e delimitatori. Concetto di variabile e comando SET @. Riferimento implicito alla nuova tupla (inserita o modificata) e alla vecchia tupla (modificata o cancellata): keyword NEW e OLD. Controllo di flusso nell’azione di un trigger: costrutto IF-ELSEIF-ELSE. Esempio di trigger multi-statement per la gestione del pagamento del ticket. 8 Maggio (13:30 − 15:30): Controllo degli accessi in MySQL e Data Control Language (DCL). Definizione di ruoli per l’accesso, la modifica e l’esecuzione. Istruzione GRANT. Assegnazione di privilegi a utenti, host e versioni ibride. Modificatori ’_’ e ’%’ per l’assegnazione di grant a classi di utenti, postazioni e sottoreti. Revoca di privilegi. Istruzione REVOKE e varianti per la revoca a più livelli di granularità. Data definition. Importanza della progettazione dei dati nello sviluppo di un sistema informativo. Data Definition Language (DDL) in MySQL. Istruzione CREATE TABLE. Chiavi primarie, chiavi candidate e vincoli di integrità referenziale: costrutti PRIMARY KEY, UNIQUE e FOREIGN KEY. Politiche di gestione dell’integrità referenziale: NO ACTION, SET DEFAULT, SET NULL, CASCADE. Business rule (o vincoli di integrità generici). Che cos’è una business rule. Gestione delle business rule in MySQL mediante trigger. Concetto di preprocessing, postprocessing e abbinamento ai modificatori BEFORE e AFTER. Modifica strutturale di tabelle e comando ALTER TABLE. Inserimento/cancellazione di attributi e comandi ADD/DROP COLUMN. Posizionamento dei nuovi attributi nello schema e modificatori FIRST/AFTER. Inserimento/cancellazione di vincoli. Esempio di cambio della chiave primaria con mantenimento di vincolo unique. Cancellazione e comando DROP TABLE. Cancellazione dell’intero contenuto: TRUNCATE TABLE. Attributi ridondanti. Significato e utilità. Gestione immediata dell’integrità di un attributo ridondante mediante trigger. Ridondanze complesse e gestione posticipata dell’integrità. Valutazioni sulla complessità dell’aggiornamento istantaneo e sulle ripercussioni sulle performance delle applicazioni. Differenza fra sistemi OLTP e OLAP. Impieghi delle ridondanze con aggiornamento posticipato nelle query di business. Stored procedure. Che cosa sono e a che cosa servono. Architetture multi-tier. Differenza fra l’invocazione di codice SQL e la chiamata a stored procedure. Elaborazione lato server e chiamata a stored procedure dal business logic tier. Quando scrivere una stored procedure e quando non ha senso farlo. Sintassi del comando CREATE PROCEDURE. Chiamata a stored procedure e comando CALL. Dichiarazione, uso e ciclo di vita delle variabili: comando DECLARE e differenza fra una variabile di sessione (@) e una DECLARE. Assegnamento mediante SELECT INTO oppure SET. Limitazioni delle variabili e risultati scalari. Parametri delle stored procedure e loro significato: IN, OUT e INOUT. Esempi di stored procedure con parametri di ingresso, uscita e ingresso-uscita. 9 Maggio (13:30 − 15:30): Cursori. Dichiarazione di un cursore: comando DECLARE CURSOR. Principio di funzionamento e concetti di apertura, prelievo e chiu4 sura: comandi OPEN, FETCH e CLOSE. Terminazione dello scorrimento mediante not found handler. Esempio di stored procedure con cursore per la restituzione di un resultset formattato mediante concatenazione. Gestione degli errori. Breve cenno all’exception handling nei linguaggi di programmazione a oggetti. Concetto di handler e dichiarazione mediante comando DECLARE HANDLER. Action di un handler: differenza fra CONTINUE ed EXIT. Condition value. Organizzazione gerarchica e priorità nella gestione degli errori in MySQL: error code; SQLSTATE; SQLWARNING e SQLEXCEPTION. Blocco statement. Esempi di handler. Stampa su result tab di messaggi dall’handler personalizzati da variabili mediante SELECT CONCAT(). Esempio di stored procedure con handler per la violazione del vincolo di chiave primaria. Chiamata con collisione e chiamata senza collisione. Handler con condizione etichettata. Comando DECLARE CONDITION. Propagazione di errori al chiamante: comando SIGNAL. Esempio di stored procedure con errore propagato al chiamante. Stored function. Cosa sono e a che cosa servono. Differenza con le stored procedure. Comando CREATE FUNCTION. Variabili di ritorno. Differenza fra function DETERMINISTIC e NOT DETERMINISTIC. Funzionalità avanzate di un DBMS: il ranking in MySQL. Ranking di singola entità risolto mediante una function rank() definita dall’utente. Temporary table. Utilità per la restituzione di resultset da parte delle stored procedure. Ciclo di vita di una temporary table. Differenza fra una temporary table e una view. Comando CREATE TEMPORARY TABLE. Utilizzi delle temporary table per la memorizzazione di informazioni aggregate: esempio dei data cube OLAP. Privilegi di accesso alle sole temporary table, e database dedicati. Risoluzione del problema del ranking di un insieme di entità mediante chiamata di una function rank() da stored procedure, con salvataggio del resultset in una temporary table. Risoluzione dell’esercizio d’esame numero 4 del 10/2/2014. 22 Maggio (13:30 − 15:30): Temporal trigger (MySQL event). Definizione di temporal trigger. Gestione di un attributo ridondante mediante temporal trigger. Comando CREATE EVENT. Temporal trigger a scatto singolo: ciclo di vita e sintassi ON SHEDULE AT. Mantenimento del codice di un temporal trigger dopo lo scatto: direttiva ON COMPLETION PRESERVE. Recurring temporal trigger: ciclo di vita e direttiva EVERY. Impostazione del periodo di recurring: direttive STARTS ed ENDS. Schedulazione dei temporal trigger. Event scheduler: attivazione e disattivazione mediante impostazione della variabile @@event_scheduler. Esercizio guida sulla realtà di progetto (reporting e archiviazione di post su social network): modifica di un trigger preesistente, e scrittura di un temporal trigger che utilizza il trigger preesistente modificato. Trigger attivati da altri trigger. Considerazioni sulla transazionalità e sullo stallo all’interno di MySQL. Materialized view (database snapshot). Definizione di materialized view. Differenza fra materialized view, view e temporary table. Scopo, vantaggi e utilizzi delle materialized view. Scenari applicativi per la business intelligence. Materialized view in MySQL. Politiche di refresh di una materialized 5 view: immediate, deferred e on demand refresh. Pregi e difetti delle politiche di refresh. 28 Maggio (8:30 − 10:30): Ancora sulle materialized view. Esercizio guida di creazione e refresh di una materialized view di aggregate reporting per la clinica. Creazione della materialized view. Inizializzazione (build) mediante query di aggregazione. On demand refresh mediante stored procedure. Immediate refresh mediante trigger. Deferred refresh mediante temporal trigger con chiamata a stored procedure. Incremental refresh. Vantaggi dell’incremental refresh. Creazione e gestione della log table mediante trigger. Modalità di incremental refresh: rebuild; full refresh; partial refresh. Comando REPLACE INTO. Realizzazione delle modalità di rebuild, full e partial refresh mediante stored procedure parametrica. Query optimization. Concetto di indice, e principali strutture dati che lo realizzano: hash table e tree. Vantaggi dovuti all’impiego degli indici. Problema del caricamento dei record in memoria centrale. Concetto di full scan. Esecuzione di una semplice query di selezione con e senza indice sull’attributo nel predicato. Tipologie di indice in MySQL e direttive PRIMARY KEY, UNIQUE, INDEX e FULL TEXT. Caratteristiche dei vari tipi di indice. Query lente in MySQL e slow-log. Cause di rallentamento dell’esecuzione di una query. Comando EXPLAIN. Esempio guida di ottimizzazione di una query con join ternario e predicato WHERE. Significato degli attributi restituiti dall’esecuzione del comando EXPLAIN. Aggiunta di indici e comando ADD INDEX(Attributo). Valutazione del cambio del numero medio di record con l’aggiunta di un indice. Indici inutilizzati. Ragioni per cui MySQL non utilizza un indice. Valutare piani di esecuzione diversi da quelli scelti dal query optimizer. Forzare l’ordine di esecuzione del join: comando STRAIGHT_JOIN. Forzare l’utilizzo di un determinato indice: comando FORCE INDEX. Valutazioni sull’execution time prima e dopo l’ottimizzazione mediante indici assistita dal comando EXPLAIN. Refresh delle statistiche e comandi ANALYZE TABLE e OPTIMIZE TABLE. Migliorare le performance delle query complesse: trade-off fra indici e materialized view. 31 Maggio (10:00 − 13:00) recupero causa elezioni: Introduzione ai database NoSQL. Aspetti principali di un RDBMS e caratteristiche borderline. Proprietà ACID di un sistema di gestione di basi di dati relazionali. Concetti di consistency, availability e partition tolerance. Teorema CAP. Proprietà BASE nei database NoSQL: basically available; soft state; eventual consistency. Scalabilità orizzontale e verticale. Standardizzazione. Caratteristiche di un DBMS di tipo NoSQL. Concetto di cluster, sharding e replica. Problema del join nei contesti con sharding. Scalabilità orizzontale a caldo. Transazioni distribuite in NoSQL. Versioning. Modalità di partizionamento. Consistent hashing semplice e con replicazione. Tipologie di database NoSQL: key-value distribuiti; document oriented; column oriented; graph oriented. Querying su sistemi key-value e document oriented: espressività delle 6 richieste. Introduzione a Cassandra. Principali caratteristiche di Cassandra. Architettura peer to peer e architettura client-server. Scalability. High availability e fault tolerance. Esempio di caduta di uno o più nodi. Data model di tipo column oriented e concetto di database schema free. Concetto di keyspace, column family, column e row key. Analogie con i database relazionali. Vantaggi e svantaggi dell’approccio column oriented e delle column family. Semplice social network realizzato mediante approccio relazionale e NoSQL. Tunable consistency. Differenza fra strong consistency ed eventual consistency. Cenni al linguaggio CQL. Semplice esempio di creazione e popolamento di un keyspace con una column family. Definizione degli indici e semplici query CQL con e senza condizione. Svolgimento di esercizi tratti dai compiti d’esame: esercizio 3 del 21/01/2014; esercizio 4 (a.a. prec.) del 28/02/2014. 7