Fondamenti di Informatica 2 Laboratorio di Basi di Dati A.A. 2013-2014

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