Banco de dados - segunda forma normal (2NF)

A segunda forma normal afirma que ela deve atender a todas as regras para 1NF e não deve haver dependências parciais de qualquer uma das colunas na chave primária -

Considere uma relação cliente-pedido e você deseja armazenar o ID do cliente, o nome do cliente, o ID do pedido e os detalhes do pedido e a data 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 tabela está na primeira forma normal; na medida em que obedece a todas as regras da primeira forma normal. Nesta tabela, a chave primária consiste em CUST_ID e ORDER_ID. Combinados, eles são únicos, assumindo que o mesmo cliente dificilmente faria o mesmo pedido.

No entanto, a tabela não está na segunda forma normal porque existem dependências parciais de chaves primárias e colunas. CUST_NAME depende de CUST_ID e não existe uma ligação real entre o nome de um cliente e o que ele comprou. Os detalhes do pedido e a data de compra também dependem do ORDER_ID, mas não dependem do CUST_ID, porque não há vínculo entre um CUST_ID e um ORDER_DETAIL ou seu SALE_DATE.

Para que esta tabela esteja em conformidade com a segunda forma normal, você precisa separar as colunas em três tabelas.

Primeiro, crie uma tabela para armazenar os detalhes do cliente, conforme mostrado no bloco de código abaixo -

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

A próxima etapa é criar uma tabela para armazenar os detalhes de cada pedido -

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

Finalmente, crie uma terceira tabela armazenando apenas o CUST_ID e o ORDER_ID para manter o controle de todos os pedidos de um 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-concepts.htm