Normalização de Banco de Dados: Entendendo as Formas Normais
Entenda tudo sobre normalização de bancos de dados, desde a 1ª até a 5ª Forma Normal, com exemplos práticos, hacks SQL e dicas de otimização. Aprenda a projetar bancos de dados eficientes, eliminando redundâncias e garantindo integridade!
Este FAQ detalhado aborda as formas normais de banco de dados, desde a 1ª Forma Normal (1FN) até a 5ª Forma Normal (5FN), incluindo conceitos, exemplos e hacks úteis. Vamos explorar as melhores práticas para criar um banco de dados bem projetado e eficiente.
A normalização é um processo sistemático para organizar dados em tabelas de um banco de dados relacional, reduzindo a redundância e garantindo a integridade dos dados. Ela é dividida em formas normais (normal forms), cada uma com critérios específicos.
1ª Forma Normal (1FN)
Critérios:
Os dados devem ser armazenados em tabelas bidimensionais (linhas e colunas).
Cada célula deve conter um único valor (atomização).
Não deve haver grupos repetitivos ou listas dentro de colunas.
Exemplo:
Tabela Não Normalizada:
ID do Cliente
Nome
Telefones
1
João
12345, 67890
2
Maria
54321
Tabela em 1FN:
ID do Cliente
Nome
Telefone
1
João
12345
1
João
67890
2
Maria
54321
Hack:
Use o comando UNNEST em SQL para separar valores de uma lista em diferentes linhas:
SELECT ID, Nome, UNNEST(string_to_array(Telefones, ',')) AS Telefone FROM clientes;
2ª Forma Normal (2FN)
Critérios:
Satisfaz todos os requisitos da 1FN.
Cada coluna não-chave deve depender exclusivamente da chave primária (eliminação de dependências parciais).
Exemplo:
Tabela em 1FN:
ID do Pedido
Produto
Preço
Cliente
Endereço
1
Livro
30.00
João
Rua A, Nº 123
2
Caneta
5.00
Maria
Rua B, Nº 456
Problema:
Dependência Parcial: O endereço depende apenas do cliente, não do ID do Pedido.
Tabelas em 2FN:
Pedidos:
ID do Pedido
Produto
Preço
ID do Cliente
1
Livro
30.00
1
2
Caneta
5.00
2
Clientes:
ID do Cliente
Nome
Endereço
1
João
Rua A, Nº 123
2
Maria
Rua B, Nº 456
3ª Forma Normal (3FN)
Critérios:
Satisfaz todos os requisitos da 2FN.
Elimina dependências transitivas (uma coluna não-chave não deve depender de outra coluna não-chave).
Exemplo:
Tabela em 2FN:
ID do Cliente
Nome
CEP
Cidade
1
João
12345
São Paulo
2
Maria
67890
Rio
Problema:
Dependência Transitiva: O CEP determina a cidade.
Tabelas em 3FN:
Clientes:
✨ Novo Curso 2025
Programador com IA — Desenvolva 10x mais rápido
Domine as ferramentas de Inteligência Artificial mais poderosas do mercado aplicadas ao desenvolvimento web. Aprenda a automatizar tarefas, gerar componentes complexos e otimizar código profissionalmente.
Aulas práticasProjeto real completoCertificado incluso
Cada determinante deve ser uma chave candidata (elimina dependências funcionais inadequadas).
Exemplo:
Tabela em 3FN:
ID do Curso
Professor
Departamento
1
Dr. Silva
Matemática
2
Dr. Lima
Física
Problema:
Um professor pode ensinar em mais de um departamento, o que cria uma dependência funcional inadequada.
Tabelas em BCNF:
Cursos:
ID do Curso
Departamento
1
Matemática
2
Física
Professores:
Professor
Departamento
Dr. Silva
Matemática
Dr. Lima
Física
4ª Forma Normal (4FN)
Critérios:
Satisfaz todos os requisitos da BCNF.
Elimina dependências multivaloradas (uma entidade não deve ter múltiplos valores independentes associados).
Exemplo:
Tabela em BCNF:
Aluno
Curso
Atividade
João
Matemática
Xadrez
João
Física
Futebol
Problema:
A relação entre cursos e atividades não é dependente.
Tabelas em 4FN:
Alunos-Cursos:
Aluno
Curso
João
Matemática
João
Física
Alunos-Atividades:
Aluno
Atividade
João
Xadrez
João
Futebol
5ª Forma Normal (5FN)
Critérios:
Satisfaz todos os requisitos da 4FN.
Remove dependências de junção (a tabela não deve depender de mais de uma relação composta).
Exemplo:
Tabela em 4FN:
Aluno
Curso
Professor
João
Matemática
Dr. Silva
Maria
Física
Dr. Lima
Problema:
A dependência entre Aluno e Professor deve ser analisada separadamente.
Tabelas em 5FN:
Alunos-Cursos:
Aluno
Curso
João
Matemática
Maria
Física
Cursos-Professores:
Curso
Professor
Matemática
Dr. Silva
Física
Dr. Lima
Hacks e Dicas Práticas
Identifique Dependências: Use consultas para detectar dependências não normalizadas:sqlCopiar códigoSELECT coluna1, coluna2, COUNT(*) FROM tabela GROUP BY coluna1, coluna2 HAVING COUNT(*) > 1;
Automatize a Normalização: Utilize ferramentas de modelagem, como o MySQL Workbench ou pgAdmin, para identificar problemas de design.
Desnormalize Quando Necessário: Em sistemas de alto desempenho (OLAP), a desnormalização pode ser útil para reduzir o número de junções:sqlCopiar códigoCREATE VIEW view_denormalizada AS SELECT c.ID, c.Nome, e.Cidade FROM Clientes c JOIN Enderecos e ON c.CEP = e.CEP;
Teste o Desempenho: Utilize índices adequados para evitar lentidão após a normalização:sqlCopiar códigoCREATE INDEX idx_cliente_cep ON Clientes(CEP);
Resumo
A normalização é um processo crucial para o design de bancos de dados eficientes e livres de anomalias. Cada forma normal aborda um problema específico, desde a atomização de dados na 1FN até a eliminação de dependências complexas na 5FN. Aplicar essas técnicas garante um banco de dados robusto e escalável, pronto para atender às demandas do mundo real.
Se você tem dúvidas ou quer aprofundar o conhecimento, sinta-se à vontade para perguntar! 😊
Ramos da Informática é um hub de comunidade sobre linguagens de programação, banco de dados, DevOps, Internet das Coisas, tecnologia da indústria 4.0, Cyber Segurança e Startups.