¿Cuál es la diferencia entre 2FN y 3FN?

La Tercera Forma Normal (3FN) Explicada

Valoración: 3.97 (2769 votos)

En el fascinante mundo del diseño de bases de datos relacionales, la normalización es un proceso fundamental para asegurar la integridad, reducir la redundancia y optimizar el almacenamiento. La normalización se divide en diferentes niveles, conocidos como Formas Normales (FN), siendo las más comunes la Primera, Segunda y Tercera Forma Normal.

Entender cuándo una tabla está en la Tercera Forma Normal (3FN) es un paso crucial para construir bases de datos robustas y eficientes. La 3FN se basa en las formas normales anteriores y añade una restricción clave para eliminar un tipo particular de dependencia que aún puede causar problemas.

¿Cuando una tabla está en 3FN?
Tercera Forma Normal o 3FN: Una tabla está en Tercera Forma Normal o 3FN si está en 2FN y no existen atributos que no pertenezcan a la clave primaria que puedan ser conocidos mediante otro atributo que no forma parte de la clave primaria, es decir, no hay dependencias funcionales transitivas.
Índice de Contenido

¿Qué es la Normalización y por qué es Importante?

Antes de sumergirnos en la 3FN, recordemos brevemente por qué normalizamos. La normalización es un proceso sistemático para descomponer una tabla con anomalías en tablas más pequeñas y bien estructuradas. Los principales objetivos son:

  • Reducir la redundancia de datos: Evitar almacenar la misma información múltiples veces.
  • Mejorar la integridad de los datos: Asegurar que los datos sean consistentes y precisos.
  • Evitar anomalías: Prevenir problemas al insertar, actualizar o eliminar datos. Existen tres tipos principales:
    • Anomalía de Inserción: No poder insertar datos sobre una entidad hasta que se inserten datos sobre otra.
    • Anomalía de Actualización: Tener que actualizar múltiples filas para un solo cambio lógico, con el riesgo de inconsistencia.
    • Anomalía de Eliminación: Perder información sobre una entidad al eliminar información sobre otra.

Las Formas Normales son una serie de reglas o condiciones que una tabla debe cumplir para alcanzar un cierto nivel de normalización.

Requisitos Previos: 1FN y 2FN

Para que una tabla esté en 3FN, primero debe cumplir con las condiciones de las formas normales anteriores:

Primera Forma Normal (1FN)

Una tabla está en 1FN si:

  • Cada intersección de fila y columna contiene un único valor atómico (indivisible).
  • No hay grupos repetidos de columnas.
  • Cada columna tiene un nombre único.
  • El orden de las filas y columnas no importa.

En esencia, 1FN trata de aplanar la estructura de la tabla, eliminando listas de valores dentro de una celda o columnas repetitivas.

Segunda Forma Normal (2FN)

Una tabla está en 2FN si:

  • Está en 1FN.
  • Todos los atributos no clave dependen completamente de la clave primaria completa.

Esta regla es relevante principalmente para tablas con claves primarias compuestas (formadas por dos o más atributos). La 2FN elimina las dependencias parciales, donde un atributo no clave depende solo de una parte de la clave primaria compuesta.

Definiendo la Tercera Forma Normal (3FN)

Una tabla está en Tercera Forma Normal (3FN) si:

  1. Está en Segunda Forma Normal (2FN).
  2. No existe ninguna dependencia transitiva de un atributo no clave con respecto a la clave primaria.

La clave aquí es entender qué es una dependencia transitiva.

¿Qué es una Dependencia Transitiva?

Una dependencia transitiva ocurre cuando un atributo no clave depende de otro atributo no clave, y este último, a su vez, depende de la clave primaria.

Formalmente, si tenemos una tabla con atributos A, B y C, y A es la clave primaria:

  • Existe una dependencia funcional A -> B (B depende de A).
  • Existe una dependencia funcional B -> C (C depende de B).

Si A -> B y B -> C, entonces indirectamente A -> C. Esta dependencia indirecta de C a través de B (donde B no es parte de la clave) es una dependencia transitiva. La 3FN prohíbe esta situación para los atributos no clave.

En otras palabras, en 3FN, cada atributo no clave debe depender directamente de la clave primaria y de *ningún otro* atributo no clave.

Ejemplo de una Tabla que NO está en 3FN

Consideremos una tabla hipotética para gestionar información de pedidos y los productos que contienen:

ID_PedidoFecha_PedidoID_ClienteNombre_ClienteCiudad_ClienteID_ProductoNombre_ProductoPrecio_UnitarioCantidad
1012023-10-26C001Juan PérezMadridP10Laptop1200.001
1012023-10-26C001Juan PérezMadridP20Mouse25.002
1022023-10-27C002Ana LópezBarcelonaP10Laptop1200.001

Asumamos que la clave primaria para esta tabla es `(ID_Pedido, ID_Producto)` (una clave compuesta, ya que un pedido puede tener varios productos).

Analicemos las dependencias funcionales:

  • `(ID_Pedido, ID_Producto)` -> Todos los demás atributos (por definición de clave primaria).
  • `ID_Pedido` -> `Fecha_Pedido`, `ID_Cliente` (Cada pedido tiene una fecha y un cliente).
  • `ID_Cliente` -> `Nombre_Cliente`, `Ciudad_Cliente` (Cada cliente tiene un nombre y una ciudad, y estos dependen solo del ID del cliente, no del pedido o producto específico).
  • `ID_Producto` -> `Nombre_Producto`, `Precio_Unitario` (Cada producto tiene un nombre y un precio, dependientes solo del ID del producto).

Esta tabla está en 1FN (valores atómicos, no hay grupos repetidos). También parece estar en 2FN porque los atributos no clave `Nombre_Producto` y `Precio_Unitario` dependen de `ID_Producto` (parte de la clave primaria) y `Fecha_Pedido`, `ID_Cliente`, `Nombre_Cliente`, `Ciudad_Cliente` dependen de `ID_Pedido` (otra parte de la clave primaria), pero no hay atributos no clave que dependan *solo* de una parte de la clave compuesta que no sea su determinante completo.

Sin embargo, la tabla NO está en 3FN debido a la dependencia transitiva:

`(ID_Pedido, ID_Producto)` -> `ID_Cliente` -> `Nombre_Cliente`, `Ciudad_Cliente`

Aquí, `Nombre_Cliente` y `Ciudad_Cliente` son atributos no clave que dependen del atributo no clave `ID_Cliente`, el cual a su vez depende de la clave primaria `(ID_Pedido, ID_Producto)` (indirectamente, a través de `ID_Pedido`).

Normalizando la Tabla a 3FN

Para llevar la tabla a 3FN, debemos eliminar la dependencia transitiva. Esto se hace separando los atributos que dependen transitivamente de la clave primaria en una nueva tabla. En nuestro ejemplo, la información del cliente (`Nombre_Cliente`, `Ciudad_Cliente`) depende de `ID_Cliente`, que es un atributo no clave en la tabla original `Pedidos`. Por lo tanto, crearemos una nueva tabla para los clientes.

Tabla original (NO 3FN):

ID_PedidoFecha_PedidoID_ClienteNombre_ClienteCiudad_ClienteID_ProductoNombre_ProductoPrecio_UnitarioCantidad
1012023-10-26C001Juan PérezMadridP10Laptop1200.001
1012023-10-26C001Juan PérezMadridP20Mouse25.002
1022023-10-27C002Ana LópezBarcelonaP10Laptop1200.001

Tablas en 3FN:

Tabla Pedidos_Productos:

ID_PedidoID_ProductoID_ClienteFecha_PedidoCantidad
101P10C0012023-10-261
101P20C0012023-10-262
102P10C0022023-10-271

Clave primaria: `(ID_Pedido, ID_Producto)`

Tabla Productos:

ID_ProductoNombre_ProductoPrecio_Unitario
P10Laptop1200.00
P20Mouse25.00

Clave primaria: `ID_Producto`

Tabla Clientes:

ID_ClienteNombre_ClienteCiudad_Cliente
C001Juan PérezMadrid
C002Ana LópezBarcelona

Clave primaria: `ID_Cliente`

En este diseño normalizado:

  • La tabla `Pedidos_Productos` relaciona pedidos, productos, clientes y cantidades. `ID_Cliente` es una clave foránea referenciando la tabla `Clientes`.
  • La tabla `Productos` almacena la información de cada producto, eliminando la redundancia del nombre y precio del producto en cada línea de pedido donde aparece.
  • La tabla `Clientes` almacena la información de cada cliente, eliminando la redundancia del nombre y ciudad del cliente en cada pedido que realiza.

Ahora, cada tabla está en 3FN. En `Pedidos_Productos`, todos los atributos no clave (`Fecha_Pedido`, `ID_Cliente`, `Cantidad`) dependen directamente de la clave primaria `(ID_Pedido, ID_Producto)` (o de una parte relevante de ella, como `ID_Pedido` para `Fecha_Pedido` y `ID_Cliente`, lo cual ya fue tratado en 2FN). En `Productos`, `Nombre_Producto` y `Precio_Unitario` dependen directamente de `ID_Producto`. En `Clientes`, `Nombre_Cliente` y `Ciudad_Cliente` dependen directamente de `ID_Cliente`.

Beneficios de estar en 3FN

Al llevar una tabla a la Tercera Forma Normal, obtenemos ventajas significativas:

  • Menor Redundancia: La información como el nombre del cliente o el precio del producto se almacena una sola vez en sus respectivas tablas, en lugar de repetirse en cada línea de pedido.
  • Reducción de Anomalías:
    • Inserción: Podemos añadir un nuevo cliente a la tabla `Clientes` incluso si aún no ha hecho un pedido, o añadir un nuevo producto a la tabla `Productos` antes de que sea pedido.
    • Actualización: Para cambiar la ciudad de un cliente, solo necesitamos actualizar una fila en la tabla `Clientes`, en lugar de potencialmente muchas filas en la tabla original de pedidos.
    • Eliminación: Si eliminamos un pedido en `Pedidos_Productos`, no perdemos la información del cliente (que sigue en `Clientes`) ni la información del producto (que sigue en `Productos`).
  • Mayor Integridad de Datos: Al reducir la redundancia y las anomalías, es más fácil mantener la consistencia y precisión de los datos. Por ejemplo, la ciudad de un cliente siempre será la misma en toda la base de datos.
  • Uso Eficiente del Almacenamiento: Aunque puede haber más tablas, la reducción de datos repetidos generalmente resulta en un menor espacio de almacenamiento total.

Comparación Rápida: 2FN vs 3FN

La diferencia clave radica en el tipo de dependencia que eliminan:

CaracterísticaSegunda Forma Normal (2FN)Tercera Forma Normal (3FN)
Requisitos previosDebe estar en 1FN.Debe estar en 2FN.
Tipo de dependencia que eliminaDependencias parciales (atributos no clave dependen de una parte de la clave primaria compuesta).Dependencias transitivas (atributos no clave dependen de otros atributos no clave que no son parte de la clave candidata).
Enfoque principalAsegurar que los atributos no clave dependan de la clave primaria *completa*.Asegurar que los atributos no clave dependan *directamente* de la clave primaria y no de otros atributos no clave.
Problemas que resuelveAnomalías relacionadas con dependencias parciales en claves compuestas.Anomalías relacionadas con dependencias entre atributos no clave.

Una tabla puede estar en 2FN y aún así tener dependencias transitivas, como vimos en nuestro ejemplo. La 3FN es el siguiente paso lógico para refinar el diseño y eliminar estas dependencias.

Consideraciones Adicionales sobre 3FN

Alcanzar la 3FN es un objetivo común en el diseño de bases de datos transaccionales. Sin embargo, una mayor normalización (como BCNF o 4FN) podría ser necesaria en algunos casos, mientras que en otros, desnormalizar intencionadamente (ir a una forma normal inferior) podría ser beneficioso para mejorar el rendimiento de lectura (a costa de introducir algo de redundancia y complejidad en las escrituras), especialmente en bases de datos orientadas a la analítica o data warehousing.

Pero para la mayoría de las aplicaciones OLTP (Procesamiento de Transacciones Online), la 3FN ofrece un excelente equilibrio entre la reducción de redundancia y la complejidad del diseño.

Preguntas Frecuentes sobre la Tercera Forma Normal

¿Una tabla que está en 3FN siempre está en 2FN y 1FN?

Sí. Las Formas Normales son acumulativas. Para estar en 3FN, una tabla debe primero cumplir con los requisitos de 2FN, y para estar en 2FN, debe cumplir con los de 1FN.

¿Cuál es la principal diferencia práctica entre 2FN y 3FN?

2FN se enfoca en tablas con claves primarias compuestas y elimina dependencias donde un atributo no clave depende solo de una *parte* de la clave. 3FN se enfoca en eliminar dependencias donde un atributo no clave depende de *otro atributo no clave* (dependencia transitiva), independientemente de si la clave primaria es simple o compuesta.

¿La 3FN elimina *toda* la redundancia?

Reduce significativamente la redundancia relacionada con dependencias parciales y transitivas. Sin embargo, puede haber redundancia controlada o necesaria por otras razones (como claves foráneas). La normalización busca minimizar la redundancia *problemática* que causa anomalías.

¿Es siempre deseable alcanzar la 3FN?

En la mayoría de los casos, sí, para bases de datos transaccionales. La 3FN mejora la integridad y reduce las anomalías. Sin embargo, en sistemas donde el rendimiento de lectura es crítico y las escrituras son menos frecuentes, se podría considerar la desnormalización controlada, aunque esto implica manejar la redundancia y las posibles anomalías manualmente.

¿Cómo identifico las dependencias transitivas en mi tabla?

Analiza cada atributo no clave. Pregúntate: ¿Este atributo depende *directamente* de la clave primaria, o depende de otro atributo no clave? Si depende de otro atributo no clave, y ese otro atributo no clave depende de la clave primaria, tienes una dependencia transitiva. Puedes listarlas como A -> B y B -> C, donde A es la clave primaria y B y C son atributos no clave.

Conclusión

La Tercera Forma Normal es un pilar en el diseño eficiente de bases de datos relacionales. Al asegurar que tus tablas cumplan con la 3FN, eliminas dependencias transitivas que pueden llevar a redundancia y anomalías perjudiciales. El proceso implica identificar y separar los atributos que dependen de otros atributos no clave en tablas separadas, vinculadas por claves foráneas. Dominar la 3FN te permitirá construir sistemas de bases de datos más robustos, fáciles de mantener y con mayor integridad de datos, sentando una base sólida para aplicaciones confiables y escalables.

Si quieres conocer otros artículos parecidos a La Tercera Forma Normal (3FN) Explicada puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir