Manuale dell’Archivista
Nel Volume 1 i dati di un programma sopravvivono allo spegnimento grazie a un file JSON. Il Manuale dell’Archivista comincia dove quel file smette di bastare: quando i dati crescono, quando le domande cambiano ogni settimana, quando a scrivere nello stesso archivio sono in tanti. A quel punto i dati hanno bisogno di un posto proprio, progettato con un metodo e interrogato con un linguaggio fatto apposta. Quel posto è un database, e questo volume insegna a progettarlo, a costruirlo, a interrogarlo e a collegarlo a un programma.
Il volume è nato per la quinta dell’Istituto Tecnico Tecnologico, articolazione Informatica, dove le basi di dati sono materia della seconda prova dell’Esame di Stato, e non presuppone nessuna conoscenza di database né di SQL. Gli esempi sono tutti ambientati nel mondo di Harry Potter: studenti, case, professori, la biblioteca di Hogwarts e i vault della Gringott. Il linguaggio di programmazione è Python, scelto per le ragioni che spiega la pagina Perché Python?.
Obiettivi
Le competenze che il volume costruisce sono tre: progettare la base di dati di un’applicazione a partire dai requisiti, motivando ogni scelta di progetto, che è il compito della seconda prova; verificare una query scritta da altri, o generata da un assistente, eseguendola e confrontando il risultato con la domanda di partenza; decidere dove far rispettare una regola sui dati, se nel programma o nel database, e come difenderli da chi li vuole leggere o alterare.
Conoscenze e abilità, divise per area:
| Area | Conoscenze | Abilità |
|---|---|---|
| Modellazione | Entità, attributi, associazioni, cardinalità, chiavi; il diagramma ER | Ricavare un diagramma ER da un testo che descrive un dominio |
| Schema relazionale | Tabelle, chiavi primarie ed esterne, integrità referenziale, il valore NULL | Tradurre un diagramma ER in uno schema relazionale senza perdere informazione |
| Normalizzazione | Anomalie, dipendenze funzionali, forme normali fino alla terza | Riconoscere le anomalie di uno schema e normalizzarlo fino alla terza forma normale |
| Definizione dei dati | CREATE TABLE, tipi, vincoli di colonna, chiavi esterne, INSERT | Creare un database con i vincoli che lo schema richiede; popolarlo rispettando le dipendenze fra le tabelle |
| Interrogazione | SELECT, filtri, ordinamento, join, aggregazioni, sottoquery, viste, indici | Scrivere interrogazioni su più tabelle e prevederne il risultato prima di eseguirle |
| Transazioni | UPDATE e DELETE, transazioni, proprietà ACID | Raggruppare in una transazione le modifiche che devono riuscire tutte insieme |
| Sicurezza | Permessi in un DBMS multiutente, SQL injection, backup, dati personali | Riconoscere una query vulnerabile e correggerla |
| Database e programmi | Il modulo sqlite3, cursori, query parametrizzate, corrispondenza fra righe e oggetti | Scrivere un programma Python che legge e modifica un database usando solo query parametrizzate |
Come è costruito
Il volume ha 13 capitoli, raggruppati qui in quattro parti. Un solo esempio li attraversa tutti: lo schema del database di Hogwarts, che nasce al capitolo 2 come diagramma, diventa uno schema di tabelle al capitolo 3, viene corretto al 4, costruito al 5 e interrogato dal 6 in poi. Ogni capitolo ne usa la porzione che gli serve.
Prima del codice: il problema e il progetto
- Perché un database. Un registro salvato in JSON smette di funzionare appena le domande cambiano, e la stessa informazione scritta in due posti finisce per contraddirsi. Il capitolo mostra che cosa fa un DBMS al posto del programma, e lo fa vedere su un database vero prima di insegnare a interrogarlo. Le lezioni: I dati che non stanno più nel programma, La stessa informazione scritta due volte, Che cosa fa un DBMS al posto tuo.
- Modellare il dominio. Entità, attributi, associazioni, cardinalità e chiavi, ricavate da un testo con un metodo ripetibile. Si lavora su descrizioni scritte in italiano, non su una sintassi. Le lezioni: Entità e attributi, Le associazioni, Le cardinalità, Identificare senza ambiguità: le chiavi, Le associazioni molti a molti, Leggere un dominio e ricavarne il modello, Generalizzazioni.
- Dal modello allo schema. Le regole che traducono il diagramma in tabelle senza perdere informazione, le chiavi esterne e il valore
NULL. - Normalizzare. Uno schema sbagliato funziona, finché una cancellazione non porta via un dato che non c’entrava. Le dipendenze funzionali dicono quale forma normale manca e come ripararla.
Costruire e interrogare
- Costruire il database.
CREATE TABLE, i tipi, i vincoli, le chiavi esterne dichiarate, i primiINSERT. Da questo capitolo ogni blocco SQL si esegue nella pagina. - Interrogare una tabella.
SELECT, i filtri, l’ordinamento e gli indici. - Interrogare più tabelle. Il prodotto cartesiano e le join che ricompongono ciò che la normalizzazione aveva separato, comprese le righe che una join scarta senza avvisare.
- Aggregare. Contare, sommare, raggruppare e filtrare i gruppi, fino all’ordine in cui il DBMS valuta davvero una query.
- Query dentro query. Le sottoquery per le domande a due tempi e le viste per dare un nome a una domanda.
Modificare e proteggere
- Modificare i dati.
UPDATEeDELETE, poi le transazioni: un trasferimento di galeoni fra due vault della Gringott deve riuscire per intero o non avvenire affatto. - Proteggere i dati. Chi può fare cosa in un database con più utenti, la SQL injection e l’unica difesa che regge, i backup e gli obblighi che vengono con i dati personali.
Fuori dal database
- Il database da un programma. Python si connette al database, manda query parametrizzate e trasforma le righe in oggetti del Volume 2. Il modulo
sqlite3non funziona nel browser, quindi in questo capitolo il codice si legge nella pagina e si esegue in laboratorio. - Oltre il relazionale. Gli assistenti che traducono una domanda in SQL e gli errori plausibili che commettono, i dati che non stanno bene in una tabella, la ricerca per somiglianza.
Il progetto finale del volume, un’applicazione completa con il suo database, sta nella Biblioteca dell’Apprendista, insieme agli esercizi.