Base de datos - Segunda forma normal (2NF)

La Segunda Forma Normal establece que debe cumplir con todas las reglas para 1NF y no debe haber dependencias parciales de ninguna de las columnas en la clave primaria -

Considere una relación cliente-pedido y desea almacenar el ID del cliente, el nombre del cliente, el ID del pedido y el detalle del pedido y la fecha de compra.

CREATE TABLE CUSTOMERS(
   CUST_ID    INT              NOT NULL,
   CUST_NAME VARCHAR (20)      NOT NULL,
   ORDER_ID   INT              NOT NULL,
   ORDER_DETAIL VARCHAR (20)  NOT NULL,
   SALE_DATE  DATETIME,
   PRIMARY KEY (CUST_ID, ORDER_ID)
);

Esta tabla está en la primera forma normal; en que obedece todas las reglas de la primera forma normal. En esta tabla, la clave principal consta de CUST_ID y ORDER_ID. Combinados, son únicos asumiendo que el mismo cliente difícilmente pediría lo mismo.

Sin embargo, la tabla no está en la segunda forma normal porque hay dependencias parciales de claves y columnas primarias. CUST_NAME depende de CUST_ID y no existe un vínculo real entre el nombre de un cliente y lo que compró. El detalle del pedido y la fecha de compra también dependen del ORDER_ID, pero no dependen del CUST_ID, porque no existe un vínculo entre un CUST_ID y un ORDER_DETAIL o su SALE_DATE.

Para que esta tabla cumpla con la segunda forma normal, debe separar las columnas en tres tablas.

Primero, cree una tabla para almacenar los detalles del cliente como se muestra en el bloque de código a continuación:

CREATE TABLE CUSTOMERS(
   CUST_ID    INT              NOT NULL,
   CUST_NAME VARCHAR (20)      NOT NULL,
   PRIMARY KEY (CUST_ID)
);

El siguiente paso es crear una tabla para almacenar los detalles de cada pedido:

CREATE TABLE ORDERS(
   ORDER_ID   INT              NOT NULL,
   ORDER_DETAIL VARCHAR (20)  NOT NULL,
   PRIMARY KEY (ORDER_ID)
);

Finalmente, cree una tercera tabla que almacene solo CUST_ID y ORDER_ID para realizar un seguimiento de todos los pedidos de un cliente:

CREATE TABLE CUSTMERORDERS(
   CUST_ID    INT              NOT NULL,
   ORDER_ID   INT              NOT NULL,
   SALE_DATE  DATETIME,
   PRIMARY KEY (CUST_ID, ORDER_ID)
);
sql-rdbms-conceptos.htm