Database Relazionali
Report 5000 ufficiale: dal file al DBMS, modello relazionale, chiavi e integrità, E/R, normalizzazione 1NF→BCNF, SQL (DDL/DML/DCL), indici e transazioni ACID, NoSQL + 25 numeri chiave + 15 trabocchetti.
1 Dalle basi di dati al DBMS
L'archiviazione dei dati è una delle applicazioni più importanti dei calcolatori. Gli obiettivi di una base dati sono: elevata capacità di archiviazione, recupero e selezione efficiente delle informazioni, integrità fisica e logica, accessibilità da strumenti diversi, protezione da accessi non autorizzati.
Limiti dell'archiviazione su file semplici
- formato arbitrario non standard, leggibile da altre applicazioni solo se il formato è noto;
- nessuna gestione nativa dell'accesso concorrente;
- gli aspetti "fisici" (efficienza, protezione, integrità) ricadono sullo sviluppatore.
Per superarli, dagli anni '70 nascono i DBMS (DataBase Management System). Una base dati gestita da DBMS è:
| Proprietà | Significato |
|---|---|
| Grande | anche oltre la capacità di un singolo disco |
| Condivisa | usata da più applicazioni e utenti insieme |
| Persistente | i dati sopravvivono alla singola esecuzione |
| Affidabile | strumenti di integrità e backup |
| Sicura | riservatezza e controllo degli accessi |
| Efficiente | operazioni elementari rapide |
| Standard | interfaccia astratta di alto livello (SQL) |
| Disaccoppiata | la gestione dati è distinta dalla "logica di business" |
| Accessibile via rete | il DBMS può girare su una macchina diversa dall'applicazione |
Prodotti DBMS diffusi: Oracle Database, Microsoft SQL Server, IBM DB2, MySQL/MariaDB, PostgreSQL.
Modelli storici di database: gerarchico (ad albero), reticolare, relazionale, relazionale ad oggetti. Lo standard de facto è il modello relazionale (RDBMS, Relational Database Management System).
2 Il modello relazionale
Progettato nei laboratori IBM negli anni '70, è basato sui concetti di relazione (in senso algebrico) e di tabella (rappresentazione intuitiva).
- Dati gli insiemi A₁…Aₙ, il prodotto cartesiano A₁×…×Aₙ è l'insieme delle n-ple; una relazione è un sottoinsieme del prodotto cartesiano.
- Le n-ple si trattano come sequenze non ordinate: per distinguere i valori si assegnano nomi, gli attributi. L'insieme dei valori ammessi per un attributo è il suo dominio.
- Una relazione si rappresenta con una tabella.
| Termine formale | Termine tabellare |
|---|---|
| Relazione | Tabella |
| Tupla / n-pla | Riga (record) |
| Attributo | Colonna (campo) |
| Dominio | Tipo di dato ammesso |
| Grado | numero di colonne (attributi) |
| Cardinalità | numero di righe (tuple) |
3 Chiavi e integrità
- Chiave primaria (primary key): attributo — o insieme di attributi — che identifica univocamente un record. Non ammette valori duplicati né nulli. Es.: la coppia Matricola + Corso.
- Chiave candidata: ogni attributo (o combinazione minimale) che potrebbe fungere da chiave primaria.
- Chiave esterna (foreign key): attributo di una tabella X che correla un suo record con un record di una tabella Y, ripetendo il valore della chiave primaria di Y. È il meccanismo che riduce la ridondanza distribuendo i dati su più tabelle.
Vincoli di integrità
- Integrità di entità: la chiave primaria non può essere nulla.
- Integrità referenziale: ogni valore di chiave esterna deve corrispondere a una chiave primaria esistente nella tabella riferita (oppure essere nullo). Impedisce i "riferimenti pendenti".
- Vincoli di dominio: ogni valore deve appartenere al dominio dell'attributo (
not null,check,unique, default).
4 Progettazione: il diagramma Entità/Relazioni (E/R)
Il modello E/R rappresenta le entità e le relazioni tra esse come un grafo, prima di tradurle in tabelle.
- Entità: rettangolo (oggetto del dominio, es. Studente, Corso).
- Attributi: proprietà di entità e relazioni (ellissi).
- Relazioni: rombo che collega le entità, con una cardinalità.
| Cardinalità | Significato | Traduzione fisica |
|---|---|---|
| 1:1 | a un record di A corrisponde uno e un solo record di B | chiave esterna in una delle due tabelle |
| 1:M | a un record di A corrispondono più record di B | chiave esterna nella tabella "molti" |
| M:M | molti a molti | tabella di associazione (ponte) con due chiavi esterne |
Il modello fisico traduce l'E/R in tabelle collegate da chiavi primarie ed esterne.
5 Normalizzazione
La normalizzazione suddivide i dati su tabelle distinte per ridurre la ridondanza e risolvere le anomalie di aggiornamento, cancellazione e inserimento. Si basa sulle forme normali e sul concetto di dipendenza funzionale A→B (il valore di A determina il valore di B).
| Forma normale | Regola |
|---|---|
| 1NF (prima) | ogni colonna contiene valori atomici: nessun campo multivalore o ripetuto |
| 2NF (seconda) | è in 1NF e, con chiave composta, ogni attributo non-chiave dipende dall'intera chiave (no dipendenze parziali) |
| 3NF (terza) | è in 2NF e non esistono dipendenze tra colonne non-chiave (no dipendenze transitive) |
| Boyce-Codd (BCNF) | per ogni dipendenza funzionale A→B, A contiene una chiave della tabella |
Anomalie che la normalizzazione elimina
- di inserimento: impossibile inserire un dato senza averne un altro;
- di cancellazione: cancellando un record si perdono informazioni non correlate;
- di aggiornamento: un valore ridondante va modificato in più punti, con rischio di incoerenza.
6 SQL — DDL, DML, DCL
SQL (Structured Query Language) è il linguaggio standard per operare su una base dati relazionale. È dichiarativo (non imperativo/procedurale): manca dei concetti di variabile e di struttura di controllo. Si articola in tre insiemi di istruzioni.
DDL — Data Definition Language (struttura)
create (database, tabelle, indici, viste), alter (modifica struttura), drop (eliminazione). Definire una tabella significa definirne attributi, domini (int, float, char/varchar, date), default e vincoli.
create table corso (
sigla char(5) not null primary key,
nome char(20) not null,
crediti integer default 6
);
DML — Data Manipulation Language (dati)
insert, select, update, delete.
⚠️updateedeletesenza clausolawhereoperano su tutte le righe della tabella.
select—select campi from tabelle where condizione order by ...; il risultato di una select è a sua volta una tabella.- Join: selezione su più tabelle correlate da chiavi. Ogni join è prima un prodotto cartesiano, da cui si filtrano le righe che soddisfano la
where: è un'operazione onerosa → il database va progettato per minimizzare i join. - Operazioni di gruppo:
group bycon funzioni di aggregazione (sum,avg,count,min,max). - Operatore
likecon carattere jolly%per confronti parziali.
DCL — Data Control Language (permessi)
grant (assegna un permesso a un utente), revoke (lo revoca).
7 Indici, transazioni e proprietà ACID
Indici — struttura dati (spesso ad albero, es. B-tree) costruita sui valori di una colonna per velocizzare le ricerche: senza indice si esegue un full table scan (tempo lineare, O(n)); con indice il tempo diventa logaritmico (O(log n)). Dopo molte modifiche l'indice si sbilancia → conviene eliminarlo e ricrearlo. Gli indici accelerano le letture ma rallentano insert/update/delete.
Transazione — raccoglie una serie di operazioni ed esegue effettivamente le modifiche solo al termine (commit); in caso di errore annulla tutto (rollback).
Proprietà ACID (garanzie di una transazione)
| Lettera | Proprietà | Significato |
|---|---|---|
| A | Atomicità | la transazione è indivisibile: o tutte le operazioni o nessuna |
| C | Consistenza | il database passa da uno stato valido a un altro stato valido (vincoli rispettati) |
| I | Isolamento | transazioni concorrenti non si interferiscono (come se fossero seriali) |
| D | Durabilità | dopo il commit le modifiche sono permanenti, anche in caso di crash |
8 Oltre il relazionale: NoSQL e ORM
Il modello relazionale ha limiti con moli enormi di dati o dati difficili da strutturare a priori. I database NoSQL (Not Only SQL) usano modelli alternativi:
| Tipo NoSQL | Struttura | Esempio |
|---|---|---|
| Document-oriented | record = "documento" JSON/XML a campi variabili | MongoDB, Apache Solr |
| Graph | dati come grafo (vertici e archi) | Neo4j |
| Key-value | array associativi / dizionari | Redis, BigTable, Berkeley DB |
| Object-oriented | modello ad oggetti integrato col relazionale | — |
ORM (Object-Relational Mapping): con i linguaggi object-oriented mappa le classi del programma sulle entità del database, evitando SQL scritto a mano. Hibernate è il middleware ORM open source per Java (NHibernate per .NET). Si colloca come middleware tra applicazione e dati.
9 25 numeri e fatti chiave
| # | Dato | Valore |
|---|---|---|
| 1 | Nascita del modello relazionale | anni '70 (IBM) |
| 2 | Grado di una tabella | numero di colonne/attributi |
| 3 | Cardinalità di una tabella | numero di righe/tuple |
| 4 | Forme normali principali | 1NF, 2NF, 3NF, BCNF |
| 5 | Regola 1NF | valori atomici (no campi multivalore) |
| 6 | Regola 2NF | no dipendenze parziali dalla chiave |
| 7 | Regola 3NF | no dipendenze transitive |
| 8 | Regola BCNF | ogni determinante è una chiave |
| 9 | Chiave primaria | identifica univocamente il record |
| 10 | Chiave esterna | correla due tabelle (riduce ridondanza) |
| 11 | Integrità di entità | PK non nulla |
| 12 | Integrità referenziale | FK punta a PK esistente |
| 13 | Sottolinguaggi SQL | DDL, DML, DCL |
| 14 | Istruzioni DDL | create, alter, drop |
| 15 | Istruzioni DML | insert, select, update, delete |
| 16 | Istruzioni DCL | grant, revoke |
| 17 | Natura di SQL | dichiarativo (non procedurale) |
| 18 | Risultato di una SELECT | una tabella |
| 19 | Base di un join | prodotto cartesiano + filtro |
| 20 | Ricerca senza indice | O(n) — full table scan |
| 21 | Ricerca con indice | O(log n) |
| 22 | Fine transazione | commit (successo) / rollback (errore) |
| 23 | Proprietà ACID | Atomicità, Consistenza, Isolamento, Durabilità |
| 24 | NoSQL | document, graph, key-value, object |
| 25 | ORM per Java | Hibernate |
10 15 trabocchetti d'esame
| # | Trabocchetto | Risposta corretta |
|---|---|---|
| 1 | "Il grado è il numero di righe" | FALSO — il grado è il numero di colonne; le righe sono la cardinalità |
| 2 | "La chiave primaria può essere nulla" | FALSO — integrità di entità: la PK non può essere nulla |
| 3 | "La foreign key aumenta la ridondanza" | FALSO — la riduce, distribuendo i dati su più tabelle |
| 4 | "SQL è un linguaggio procedurale" | FALSO — è dichiarativo, senza variabili né controllo di flusso |
| 5 | "1NF ammette campi con più valori" | FALSO — 1NF richiede valori atomici |
| 6 | "DELETE senza WHERE cancella una riga" | FALSO — le cancella tutte |
| 7 | "GRANT è un'istruzione DML" | FALSO — è DCL (controllo permessi) |
| 8 | "CREATE TABLE è DML" | FALSO — è DDL (definizione struttura) |
| 9 | "Un indice velocizza anche gli inserimenti" | FALSO — velocizza le letture, rallenta le scritture |
| 10 | "Con indice la ricerca è O(n)" | FALSO — è O(log n); O(n) è senza indice |
| 11 | "Commit annulla la transazione" | FALSO — commit conferma; rollback annulla |
| 12 | "La 'D' di ACID è Disponibilità" | FALSO — è Durabilità |
| 13 | "Una relazione M:M si traduce con una sola FK" | FALSO — serve una tabella di associazione con due FK |
| 14 | "MongoDB è un database relazionale" | FALSO — è NoSQL document-oriented |
| 15 | "3NF elimina le dipendenze parziali" | FALSO — quelle le elimina la 2NF; la 3NF elimina le transitive |