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)
);