Salta el contingut

Normalització

Dependències funcionals fonament teòric (aprofundiment opcional)

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.

Consulta Dependències funcionals per al fonament teòric complet.

Per què normalitzar?

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:

  1. Tots els atributs són atòmics (indivisibles, no hi ha grups repetitius).
  2. Cada fila és única (hi ha una clau primària).
  3. 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
1C01Joan Garcia C/ Major 5Blanes P01Llapis3
1C01Joan Garcia C/ Major 5Blanes P02Goma1
2C02Maria Lopez Av. Mar 10Blanes P03Quadern2
✓ 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
1C01Joan Garcia C/ Major 5Blanes P01Llapis3
1C01Joan Garcia C/ Major 5Blanes P02Goma1
2C02Maria Lopez Av. Mar 10Blanes P03Quadern2
✓ 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:

  1. Ja està en 1FN.
  2. 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
1C01Joan Garcia C/ Major 5Blanes P01Llapis3
1C01Joan Garcia C/ Major 5Blanes P02Goma1
2C02Maria Lopez Av. Mar 10Blanes P03Quadern2
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.
id_comanda id_client nom_client carrer poblacio id_producte nom_producte quantitat
1 C01Joan Garcia C/ Major 5Blanes P01 Llapis3
1 C01Joan Garcia C/ Major 5Blanes P02 Goma1
2 C02Maria Lopez Av. Mar 10Blanes P03 Quadern2
id_client, nom_client, carrer, poblacio → id_comanda (parcial!) nom_producte → id_producte (parcial!) quantitat → (id_comanda, id_producte) ✓
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
C01Joan GarciaC/ Major 5Blanes
C02Maria LopezAv. Mar 10Blanes
PRODUCTES
id_producte nom_producte
P01Llapis
P02Goma
P03Quadern
LINIES_COMANDA
id_comanda id_client id_producte quantitat
1C01P013
1C01P021
2C02P032
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.
CLIENTS
id_client nom_client carrer poblacio
C01Joan GarciaC/ Major 5Blanes
C02Maria LopezAv. Mar 10Blanes
PRODUCTES
id_producte nom_producte
P01Llapis
P02Goma
P03Quadern
LINIES_COMANDA
id_comanda id_client id_producte quantitat
1C01 P013
1C01 P021
2C02 P032
✓ CLIENTS: nom_client, carrer, poblacio → id_client ✓ PRODUCTES: nom_producte → id_producte ✓ LINIES_COMANDA: quantitat → (id_comanda, id_producte)

Tercera Forma Normal (3FN)

Una taula està en Tercera Forma Normal (3FN) si:

  1. Ja està en 2FN.
  2. 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
1JoanD01Informàtica2a planta
2MariaD01Informàtica2a planta
3PereD02Comptabilitat1a planta
Viola 3FN nom_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}.
id_empleat nom id_departament nom_departament ubicacio
1Joan D01 Informàtica2a planta
2Maria D01 Informàtica2a planta
3Pere D02 Comptabilitat1a planta
id_empleat → id_departament → nom_departament, ubicacio ⚠ "Informàtica / 2a planta" apareix 2 vegades (redundància)
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
1JoanD01
2MariaD01
3PereD02
DEPARTAMENTS (nova)
id_departament nom_departament ubicacio
D01Informàtica2a planta
D02Comptabilitat1a 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.
EMPLEATS
id_empleat nom id_departament
1JoanD01
2MariaD01
3PereD02
DEPARTAMENTS
id_departament nom_departament ubicacio
D01Informàtica2a planta
D02Comptabilitat1a planta
✓ EMPLEATS: nom, id_departament → id_empleat ✓ DEPARTAMENTS: nom_departament, ubicacio → id_departament

Forma Normal de Boyce-Codd (FNBC)

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.
id_estudiant codi_curs nif_professor
E01BD001P01
E01PY001P02
E02BD001P03
E02PY001P02
CK1: (id_estudiant, codi_curs) → nif_professor CK2: (id_estudiant, nif_professor) [P01→BD001, P02→PY001, P03→BD001]
Viola FNBC La dependència nif_professor → codi_curs viola la FNBC perquè nif_professor no és una clau candidata sola (no determina id_estudiant). El parell P02 → PY001 es repeteix dues vegades.
id_estudiant codi_curs nif_professor
E01BD001P01
E01PY001P02
E02BD001P03
E02PY001P02
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
P01BD001
P02PY001
P03BD001
ESTUDIANT_PROFESSOR
id_estudiant nif_professor
E01P01
E01P02
E02P03
E02P02
✓ 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:

num_factura data cif_client nom_client adreca_client id_producte nom_producte categoria preu_unitari quantitat
F001 2025-10-01 B12345678 Empresa SA C/ Gran Via 1, BCN P001 Taula Mobles 250.00 2
F001 2025-10-01 B12345678 Empresa SA C/ Gran Via 1, BCN P002 Cadira Mobles 89.00 8
F002 2025-10-05 A98765432 Comerços SL Av. Pau Casals 5, BCN P003 Monitor Electrònica 320.00 1