Vai al contenuto
Sistemi Informativi

Il modello relazionale: chiavi, vincoli e algebra relazionale

Relazioni, tuple e domini, esistenza di una chiave dimostrata, vincoli di integrità e chiavi esterne, selezione, proiezione e giunzione, cardinalità della giunzione dimostrata, dall'algebra a SQL.

Nel 1970 Edgar Codd, ricercatore dell’IBM, propose di rappresentare i dati come semplici tabelle e di interrogarli con operazioni matematiche, invece di navigare tra puntatori come nei sistemi dell’epoca. Il modello relazionale è ancora la base di quasi tutti i sistemi informativi. In questa lezione vediamo le relazioni e le chiavi con la dimostrazione che ogni relazione ne ha almeno una, i vincoli d’integrità, l’algebra relazionale con selezione, proiezione e giunzione, la dimostrazione dei limiti sulla dimensione di una giunzione, e il legame con SQL.

Relazioni, tuple e attributi

Una relazione è una tabella con un nome, colonne con nome (gli attributi) e righe (le tuple). Matematicamente è un insieme di tuple: l’ordine delle righe non conta e non ci sono due righe uguali. Ogni attributo prende valori in un dominio (interi, date, stringhe), e ogni cella contiene un solo valore atomico. Lo schema della relazione è il nome con gli attributi, Studente(matricola, nome, cognome, nascita); l’istanza è il contenuto in un certo momento.

Le chiavi

Una superchiave è un insieme di attributi che non assume mai lo stesso valore in due tuple diverse. Una chiave è una superchiave minimale: togliendo un qualsiasi attributo non è più superchiave.

Teorema. Ogni relazione ha almeno una chiave.

Dimostrazione. L’insieme di tutti gli attributi è una superchiave: due tuple con tutti i valori uguali sarebbero la stessa tupla, e una relazione è un insieme, quindi non ha duplicati. Se questa superchiave non è minimale, si toglie un attributo che la lascia superchiave, e si ripete. Gli attributi sono in numero finito, quindi il procedimento termina, e l’insieme a cui si arriva è una superchiave da cui non si può togliere nulla: una chiave. ∎

Tra le chiavi se ne sceglie una come chiave primaria, su cui non si ammettono valori nulli. Spesso si usa un codice artificiale (un numero progressivo) anche quando esiste una chiave naturale, perché è più stabile e più compatto.

I vincoli d’integrità

Il modello non accetta qualsiasi dato: i vincoli esprimono le regole del mondo reale e il DBMS li fa rispettare.

  • Vincoli di dominio e di tupla: il voto è tra 18 e 30, la data di fine non precede quella d’inizio.
  • Vincolo di chiave: nessun duplicato sulla chiave primaria, nessun valore nullo.
  • Integrità referenziale: una chiave esterna deve riferire una tupla esistente. Ogni esame si riferisce a uno studente presente nella tabella Studente. Quando si cancella lo studente, il DBMS può rifiutare la cancellazione, cancellare anche i suoi esami (a cascata) o mettere a nullo il riferimento, secondo come è stato dichiarato il vincolo.

L’algebra relazionale

Le interrogazioni si costruiscono con operatori che prendono relazioni e restituiscono relazioni, e quindi si possono comporre:

  • selezione \sigma_{cond}(R): le tuple che soddisfano una condizione, cioè un sottoinsieme delle righe;
  • proiezione \pi_{A,B}(R): solo alcune colonne, eliminando i duplicati che ne risultano;
  • unione, differenza, intersezione di relazioni con lo stesso schema;
  • ridenominazione degli attributi;
  • giunzione naturale R \bowtie S: combina le tuple delle due relazioni che hanno valori uguali sugli attributi comuni.
Giunzione naturale di due relazioni
R e S hanno in comune l’attributo B. Il risultato contiene una tupla per ogni coppia di tuple di R e S con lo stesso valore di B: la tupla a2 b2 non ha corrispondenti in S e scompare, mentre ciascuna delle tuple con b1 si combina con entrambe le tuple di S con b1.

Teorema. La giunzione naturale di R e S ha un numero di tuple compreso tra 0 e |R|\cdot|S|. Se gli attributi comuni contengono una chiave di S, il risultato ha al massimo |R| tuple; se in più c’è un vincolo di integrità referenziale da R verso S su quegli attributi, ne ha esattamente |R|.

Dimostrazione. Ogni tupla del risultato nasce da una coppia di tuple, una di R e una di S, e le coppie possibili sono |R|\cdot|S|: è il massimo, raggiunto quando tutte hanno lo stesso valore sugli attributi comuni. Il minimo 0 si ha quando nessun valore coincide. Se gli attributi comuni contengono una chiave di S, per ogni tupla di R esiste al più una tupla di S con quei valori, quindi ogni tupla di R contribuisce al più una tupla al risultato. Con il vincolo referenziale quella tupla di S esiste sempre, e il contributo è esattamente uno. ∎

È il caso più comune: unire gli esami (con la chiave esterna) agli studenti (con la chiave) dà una riga per esame, arricchita con i dati dello studente. Saperlo aiuta a capire quando una query restituisce “troppe righe”: di solito si è unito su attributi che non sono chiave.

Dall’algebra a SQL

SQL, il linguaggio di tutti i DBMS relazionali (lezione su SQL), è un linguaggio dichiarativo costruito su queste operazioni: si dice che cosa si vuole, non come ottenerlo.

SELECT s.cognome, e.voto
FROM Studente s JOIN Esame e ON s.matricola = e.matricola
WHERE e.voto >= 28;

corrisponde a \pi_{cognome,\,voto}(\sigma_{voto \ge 28}(Studente \bowtie Esame)). Il DBMS traduce la richiesta in un’espressione dell’algebra e la ottimizza con equivalenze algebriche: per esempio esegue la selezione prima della giunzione, così si uniscono meno tuple. Questa indipendenza tra la domanda e il modo di rispondere, possibile grazie alla base matematica del modello, è la ragione principale del suo successo.

Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
0
Would love your thoughts, please comment.x
()
x