Torniamo al nostro esempio di base di dati che contiene informazioni su studenti ed esami (soluzione “buona” trovata alla fine)

La base di dati consiste di quattro schemi di relazione:

  • Studente (Matr, CF, Cogn, Nome, Data, Com)
  • Corso (C#, Tit, Doc)
  • Esame (Matr, C#, Data, Voto)
  • Comune (Com, Prov)

considerazioni

dipendenze funzionali su Studente

  • Studente

quindi, un’istanza legale di Studente deve soddisfare: in realtà notiamo che anche CF determina tutte le altre cose: Quindi, sia che sono chiavi

  • possiamo notare che le istanze di Studente non devono soddisfare o o ecc.

Con considerazioni analoghe possiamo quindi concludere che le uniche dipendenze funzionali non banali che devono essere soddisfatte da un’istanza legale di Studente sono del tipo: dove K contiene una chiave (Matr o CF)

(qui iniziamo a notare che le dipendenze devono tipicamente essere solo da una chiave o superchiave)

dipendenze funzionali su esame

  • Esame (Matr, C#, Data, Voto)

(in questo universo) uno studente può sostenere l’esame relativo ad un corso una sola volta, quindi per ogni esame esistono:

  • una sola data e un solo voto

Quindi, ogni istanza legale di Esame deve soddisfare:

Pertanto, è l’unica chiave per Esame.

conclusione

Il nostro schema di relazione è quindi:

  • Studente (Matr, CF, Cogn, Nome, Data, Com)
  • Corso (C#, Tit, Doc)
  • Esame (Matr, C#, Data, Voto)
  • Comune (Com, Prov)

terza forma normale

Uno schema di relazione è 3NF se:

  • le uniche dipendenze funzionali non banali che devono essere soddisfatte da ogni istanza legale sono del tipo: dove:
  • K contiene una chiave oppure
  • X è contenuto in una chiave

Ma anche questa condizione deve ancora essere rifinita.

definizione

Dati uno schema di relazione R e un insieme di dipendenze funzionali F su R, R è in 3NF se:

  • X contiene una chiavesuperchiave) oppure
  • A appartiene ad una chiaveprimo)

(notiamo quel - quelle dipendenze non vanno considerate quando si cerca di capire se uno schema è in 3NF)

Altra definizione - se si vuole usare un insieme (Y) invece del singleton A:

  • appartente a X è tale che X è superchiave e ogni attributo contenuto in Y è primo.

attenzione

  • è sbagliato scrivere , (invece di ) perché A è singleton e dovremmo escludere tutte quelle del tipo (che potrebbero violare la 3NF) (invece, per , si trova in )
  • è sbagliato anche dire solo (devo specificare che ogni attributo di Y è primo)
  • è importante non dimenticare il . Infatti, per riflessività, abbiamo sempre in , e quindi in , anche quando A non è primo e X non è superchiave (quindi, nessuno schema sarebbe 3NF) (per esempio, se avessi e , all’interno di avrei anche , con che non è né chiave né primo)

dipendenze parziali e transitive

Siano R uno schema di relazione e F un insieme di dipendenze funzionali su R.

dipendenza parziale

è una dipendenza parziale su se non è primo ed è contenuto propriamente in una chiave di . (quindi, invece di superchiave ho primo - è contenuto invece di contenere - non è rispettata la 3NF)

dipendenza transitiva

è una dipendenza transitiva su se non è primo e per ogni chiave di si ha che non è contenuto propriamente in e (quindi, non è superchiave - magari una parte di lo è, ma non tutto - non è rispettata la 3NF)

attenzione

  • la dipendenza transitiva non è quella che si trova per transitività, ma quella che “permette di usare la transitività” - implica , ma la dipendenza transitiva è .

definizione alternativa di 3NF

Dato uno schema R e un insieme di dipendenze funzionali F, R è in 3NF se e solo se non ci sono attributi che dipendono parzialmente o transitivamente da una chiave.

dimostrazione

  • prima parte

(per ipotesi, lo schema è 3NF, quindi) Per quanto riguarda , abbiamo due casi:

  • o contiene una chiave (è superchiave)
  • o appartiene a una chiave (è primo)

da qui:

  1. se primo, viene a mancare la prima condizione per avere una dipendenza parziale o transitiva (entrambe vogliono non primo)
  2. se non primo, allora è superchiave (contiene una chiave) - non può quindi essere contenuto propriamente in una chiave, e non è neanche possibile che (in quanto contiene tutta la chiave)

ora passiamo alla

  • seconda parte

(per ipotesi, non esistono dipendenze parziali o transitive) supponiamo per assurdo che non sia 3NF - allora c’è almeno una dipendenza che viola la 3NF, quindi: tale che:

  • non è primo E
  • non è superchiave

Siccome non è superchiave, ci sono due casi mutualmente esclusivi:

  1. per ogni chiave di , non è contenuto propriamente in nessuna chiave e - ma questa è la definizione di dipendenza transitiva (contraddizione)
  2. - esiste una chiave che contiene completamente (e non è uguale a ) - in questo caso, è una dipendenza parziale (contraddizione)

cosa vogliamo ottenere?

  • un obiettivo da tenere presente quando si progetta una base di dati è quello di produrre uno schema in cui ogni relazione sia in 3NF
    • in caso non lo sia, è sempre possibile trovare una decomposizione che sia in 3NF, e che rispetti altre due proprietà:

Abbiamo uno schema con dipendenze funzionali lo schema non è in 3NF perché in è presente (la chiave è ).

  • può essere decomposto in:
  • oppure

entrambi sono in 3NF, ma il secondo non è soddisfacente.

perché?

Consideriamo due istanze legali degli schemi ottenuti:

center

  • l’istanza dello schema originario R che posso ricostruire (con il join naturale) è:

center

  • questa non è però un’istanza legale di R, perché non soddisfa la dipendenza funzionale

join senza perdita

deve essere preservato il join senza perdita (devono essere mantenute tutte le dipendenze originarie) - una “perdita” non significa tuple in meno, ma presenza di tuple estranee alla realtà di interesse.

In conclusione, quando si decompone uno schema per ottenerne uno 3NF, occorre tenere presente altri due requisiti per lo schema decomposto:

  • deve preservare le dipendenze funzionali che valgono su ogni istanza legale dello schema originale
  • deve permettere di ricostruire tramite join naturale ogni istanza legale dello schema originario senza aggiunta di informazione estranea.

forma normale di Boyce-Codd

definizione

Una relazione è in forma normale di Boyce-Codd (BCNF) se in essa ogni determinante è una superchiave (ricordiamo che ogni chiave è superchiave).

(boy’s code per gli amici)

Ogni relazione in Boyce-Codd è anche in 3NF, ma non vale il contrario

  • può non essere possibile decomporre uno schema non BCNF ottenendo sottoschemi BNCF e preservando allo stesso tempo tutte le dipendenze - invece, è sempre possibile per la 3NF

domande orale

possibili domande orale:

  • definizione 3NF
  • definizione dipendenze parziali e transitive
  • 3NF no dipendenze parziali e transitive
  • perché nella 3NF prendiamo e non ?
  • perché ?
  • cosa si fa quando si ha uno schema non in 3NF?
  • forma Boyce-Codd
  • perché nel caso della forma Boyce-Codd non è assolutamente possibile che si violino dipendenze? (perché i determinanti sono superchiavi e non ci possono essere due chiavi con lo stesso valore, quindi vengono meno le premesse per violare dipendenze)