Por que normalizar?
A normalização é o processo de organizar as colunas e tabelas para eliminar a redundância (dados repetidos) e evitar as anomalias:
- Anomalia de inserção: você não pode guardar um dado sem inventar outro. Se a categoria de um produto vive na tabela de produtos, você não pode registrar uma categoria nova até que exista um produto dela.
- Anomalia de atualização: se um dado está repetido em muitas linhas, ao alterá-lo você tem que atualizá-las todas; se você deixar uma de fora, ficam inconsistentes.
- Anomalia de exclusão: ao apagar uma linha você perde informação que não queria perder (apagar o último pedido de um cliente também apagaria seus dados).
Avança-se por formas normais cumulativas: para estar na 3FN é preciso cumprir antes a 1FN e a 2FN.
Primeira forma normal (1FN)
Uma tabela está na 1FN se:
- Cada célula contém um valor atômico (nem listas nem vários valores).
- Não há grupos de colunas repetidas (
telefone1,telefone2, ...).
| ❌ Não 1FN | ✅ 1FN |
|---|---|
telefones = '600, 611' |
uma linha por telefone em uma tabela à parte |
Segunda forma normal (2FN)
Uma tabela está na 2FN se está na 1FN e, além disso, nenhum atributo não chave depende somente de uma parte de uma chave primária composta (não há dependências parciais).
Só é relevante quando a PK é composta. Exemplo: em
linha_pedido(pedido_id, produto_id, nome_produto), o
nome_produto depende somente de produto_id, não da chave completa →
viola a 2FN. A solução: mover nome_produto para a tabela produtos.
Terceira forma normal (3FN)
Uma tabela está na 3FN se está na 2FN e nenhum atributo não chave depende de outro atributo não chave (não há dependências transitivas).
Exemplo que viola a 3FN:
| pedido_id | cliente_id | cliente_cidade |
|---|
Aqui cliente_cidade depende de cliente_id (não da PK pedido_id).
Se Ana muda de cidade é preciso atualizar todos os seus pedidos. A solução é
separar: a cidade vive na tabela clientes, e pedidos só guarda
cliente_id.
Em resumo, 3FN = "cada atributo não chave depende da chave, de toda a chave e de nada além da chave". É o objetivo razoável para a maioria dos esquemas de aplicação.