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.
É também um complemento do artigo: O que é normalização de banco de dados?
O que é Normalização em Banco de Dados?
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:
ID do Cliente | Nome | CEP |
---|---|---|
1 | João | 12345 |
2 | Maria | 67890 |
Endereços:
CEP | Cidade |
---|---|
12345 | São Paulo |
67890 | Rio |
Forma Normal de Boyce-Codd (BCNF)
Critérios:
- Satisfaz todos os requisitos da 3FN.
- 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ódigo
SELECT 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ódigo
CREATE 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ódigo
CREATE 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! 😊
Comandos SQL: 10 essenciais para todo programador!
Gostou deste artigo? Apoie nosso trabalho e ajude a manter o site! Pague um café: