La normalització es basa en el concepte de dependència funcional: la relació formal que indica que un conjunt d'atributs determina un altre. Entendre les dependències funcionals, les regles d'inferència d'Armstrong i com trobar claus candidates és imprescindible per aplicar correctament les formes normals.
La normalització és un procés sistemàtic per organitzar les dades d'una BD relacional per reduir la redundància i evitar les anomalies de modificació. Quan les dades no estan normalitzades, es poden produir tres tipus d'anomalies:
Anomalia d'inserció: No podem inserir una dada sense disposar d'una altra. Per exemple, si un professor i les assignatures estan en la mateixa taula i necessitem inserir un professor que encara no imparteix cap assignatura.
Anomalia d'actualització: Si un professor canvia de departament, hem d'actualitzar múltiples files (una per cada assignatura que imparteix), i si n'oblidem alguna, les dades queden inconsistents.
Anomalia d'eliminació: Si un professor imparteix només una assignatura i eliminem aquella assignatura, perdem també les dades del professor.
El procés de normalització organitza les dades en formes normals (FN), cadascuna més estricta que l'anterior.
Primera Forma Normal (1FN)
Una taula està en Primera Forma Normal (1FN) si:
Tots els atributs són atòmics (indivisibles, no hi ha grups repetitius).
Cada fila és única (hi ha una clau primària).
No hi ha atributs multivalor (no hi ha columnes amb llistes de valors).
Exemple animat: pas a pas cap a 1FN
1FN — Transformació pas a pas
NO és 1FN
Taula original amb atributs multivalorats (vermell) i un atribut compost (groc). Les cel·les en vermell contenen múltiples valors separats per comes.
id_comanda
client
adreça
productes
quantitats
1
Joan Garcia
C/ Major 5, Blanes
Llapis, Goma
3, 1
2
Maria Lopez
Av. Mar 10, Blanes
Quadern
2
⚠ productes: múltiples valors per cel·la⚠ quantitats: múltiples valors per cel·la⚠ adreça: valor compost (carrer + número + població)
Pas 1
Separem les files dels atributs multivalorats: cada producte ocupa una fila pròpia. La fila nova (animada) s'ha creat en expandir la comanda 1.
id_comanda
client
adreça
producte
quantitat
1
Joan Garcia
C/ Major 5, Blanes
Llapis
3
1
Joan Garcia
C/ Major 5, Blanes
Goma
1
2
Maria Lopez
Av. Mar 10, Blanes
Quadern
2
✓ producte i quantitat: atòmics⚠ adreça: encara composta (pendent)
Pas 2
Descomponem l'atribut compost adreça en carrer i poblacio. Assignem identificadors a clients i productes.
id_comanda
id_client
nom_client
carrer
poblacio
id_producte
nom_producte
quantitat
1
C01
Joan Garcia
C/ Major 5
Blanes
P01
Llapis
3
1
C01
Joan Garcia
C/ Major 5
Blanes
P02
Goma
1
2
C02
Maria Lopez
Av. Mar 10
Blanes
P03
Quadern
2
✓ Tots els atributs són atòmics✓ Cada fila és única
1FN ✓
Taula en Primera Forma Normal. La clau primària composta (id_comanda, id_producte) identifica unívocament cada fila. Tots els atributs són atòmics.
id_comanda
id_client
nom_client
carrer
poblacio
id_producte
nom_producte
quantitat
1
C01
Joan Garcia
C/ Major 5
Blanes
P01
Llapis
3
1
C01
Joan Garcia
C/ Major 5
Blanes
P02
Goma
1
2
C02
Maria Lopez
Av. Mar 10
Blanes
P03
Quadern
2
✓ Atributs atòmics✓ Clau primària: (id_comanda, id_producte)⚠ Redundàncies pendents: nom_client, carrer, poblacio es repeteixen → cal 2FN
Redundància a 1FN
Observeu que el nom i l'adreça del client es repeteix per a cada producte de la mateixa comanda. Això és una redundància que cal eliminar amb la 2FN.
Segona Forma Normal (2FN)
Una taula està en Segona Forma Normal (2FN) si:
Ja està en 1FN.
Tots els atributs no clau depenen de la clau primària completa, no només d'una part d'ella (eliminació de dependències parcials).
La 2FN només és rellevant quan la clau primària és composta (formada per més d'un atribut).
Anàlisi de dependències
A la taula en 1FN, la clau és (id_comanda, id_producte). Analitzem de quina part depèn cada atribut:
Atribut
Depèn de
Tipus
nom_client, carrer, poblacio
id_client (part de la clau)
Dependència parcial
nom_producte
id_producte (part de la clau)
Dependència parcial
quantitat
(id_comanda, id_producte)
Clau completa (ok)
Exemple animat: pas a pas cap a 2FN
2FN — Transformació pas a pas
1FN ✓
Taula en 1FN amb clau primària composta (id_comanda, id_producte). Analitzem de quina part de la clau depèn cada atribut no clau.
id_comanda
id_client
nom_client
carrer
poblacio
id_producte
nom_producte
quantitat
1
C01
Joan Garcia
C/ Major 5
Blanes
P01
Llapis
3
1
C01
Joan Garcia
C/ Major 5
Blanes
P02
Goma
1
2
C02
Maria Lopez
Av. Mar 10
Blanes
P03
Quadern
2
Clau primària: (id_comanda, id_producte)
Viola 2FN
Les columnes en taronja tenen dependències parcials: depenen d'una sola part de la clau, no de la clau completa.
Pas 1
Creem una taula per a cada determinant: CLIENTS, PRODUCTES i LINIES_COMANDA. Cada taula té la seva pròpia clau primària.
CLIENTS
id_client
nom_client
carrer
poblacio
C01
Joan Garcia
C/ Major 5
Blanes
C02
Maria Lopez
Av. Mar 10
Blanes
PRODUCTES
id_producte
nom_producte
P01
Llapis
P02
Goma
P03
Quadern
LINIES_COMANDA
id_comanda
id_client
id_producte
quantitat
1
C01
P01
3
1
C01
P02
1
2
C02
P03
2
2FN ✓
Tres taules independents. Tots els atributs no clau depenen de la clau primària completa de la seva taula. Cap redundància derivada de dependències parcials.
Cap atribut no clau depèn transitivament d'un altre atribut no clau (eliminació de dependències transitives).
Una dependència transitiva és una cadena del tipus A → B → C, on C depèn d'A indirectament a través de B.
Exemple animat: pas a pas cap a 3FN
3FN — Transformació pas a pas
2FN ✓
Taula EMPLEATS en 2FN amb clau simple id_empleat. Analitzem si algun atribut no clau depèn d'un altre atribut no clau.
id_empleat
nom
id_departament
nom_departament
ubicacio
1
Joan
D01
Informàtica
2a planta
2
Maria
D01
Informàtica
2a planta
3
Pere
D02
Comptabilitat
1a planta
Viola 3FNnom_departament i ubicacio (violeta) depenen de id_departament, que al seu torn depèn de id_empleat. Cadena transitiva: id_empleat → id_departament → {nom_departament, ubicacio}.
Pas 1
Extraiem nom_departament i ubicacio a la nova taula DEPARTAMENTS. L'atribut id_departament queda a EMPLEATS com a clau forana.
EMPLEATS
id_empleat
nom
id_departament
1
Joan
D01
2
Maria
D01
3
Pere
D02
DEPARTAMENTS (nova)
id_departament
nom_departament
ubicacio
D01
Informàtica
2a planta
D02
Comptabilitat
1a planta
3FN ✓
Dues taules sense dependències transitives. "Informàtica / 2a planta" apareix un sol cop. Actualitzar el departament requereix un sol UPDATE a DEPARTAMENTS.
La Forma Normal de Boyce-Codd (FNBC) és una variant més estricta de la 3FN. Es viola la FNBC quan un determinant d'una dependència funcional no és clau candidata.
La majoria de taules en 3FN ja estan en FNBC. La FNBC només és rellevant en casos amb múltiples claus candidates compostes que comparteixen atributs.
Regla pràctica: Per als casos habituals del curs, arribar a la 3FN és suficient.
Exemple animat: violació i descomposició FNBC
FNBC — Exemple pas a pas
3FN ✓
Taula ASSIGNACIO: cada estudiant cursa assignatures amb professors assignats. Un professor imparteix un sol curs. Identifiquem les dues claus candidates possibles.
Viola FNBC
La dependència nif_professor → codi_curs viola la FNBC perquè nif_professorno és una clau candidata sola (no determina id_estudiant). El parell P02 → PY001 es repeteix dues vegades.
id_estudiant
codi_curs
nif_professor
E01
BD001
P01
E01
PY001
P02
E02
BD001
P03
E02
PY001
P02
nif_professor → codi_curs (nif_professor no és CK!)⚠ P02 → PY001 apareix 2 vegades (redundància)
FNBC ✓
Descomposem en dues taules. La dependència que viola la FNBC nif_professor → codi_curs passa a ser la clau de PROFESSOR_CURS, on nif_professor és la clau primària.
PROFESSOR_CURS
nif_professor
codi_curs
P01
BD001
P02
PY001
P03
BD001
ESTUDIANT_PROFESSOR
id_estudiant
nif_professor
E01
P01
E01
P02
E02
P03
E02
P02
✓ PROFESSOR_CURS: codi_curs → nif_professor (ara nif_professor és CK)✓ ESTUDIANT_PROFESSOR: CK és (id_estudiant, nif_professor)
Resum del procés de normalització
flowchart TD
NN["Taula no normalitzada\n(redundàncies, atributs compostos, multivalorats)"]
FN1["1FN\nAtributs atòmics, clau primària"]
FN2["2FN\nEliminar dependències parcials\n(per a claus compostes)"]
FN3["3FN\nEliminar dependències transitives"]
FNBC["FNBC\nCada determinant és clau candidata\n(cas especial)"]
NN -->|"Fer atòmics, separar grups repetitius"| FN1
FN1 -->|"Separar atributs amb dependència parcial"| FN2
FN2 -->|"Separar atributs amb dependència transitiva"| FN3
FN3 -->|"Cas especial: múltiples claus candidates"| FNBC
style NN fill:#b71c1c,stroke:#c62828,color:#fff
style FN1 fill:#e65100,stroke:#f57f17,color:#fff
style FN2 fill:#2e7d32,stroke:#388e3c,color:#fff
style FN3 fill:#1b5e20,stroke:#2e7d32,color:#fff
style FNBC fill:#004d40,stroke:#00695c,color:#fff
AC0372/02/03 — Miniactivitat
RA2 · CA2.8
Normalitzeu fins a 3FN la següent taula de facturació. Identifiqueu la clau primària, les dependències funcionals i les formes normals que viola: