Introdução
A normalização de bancos de dados é um conceito fundamental no mundo da gestão de bancos de dados. É um processo que otimiza a estrutura do banco de dados reduzindo a redundância de dados e melhorando a integridade dos dados. A normalização é um conjunto de regras e diretrizes que ajudam a organizar os dados de forma eficiente e a prevenir anomalias comuns nos dados, como anomalias de atualização, inserção e exclusão.
Neste artigo, vamos aprofundar os fundamentos da normalização de bancos de dados, as diversas formas normais e fornecer exemplos práticos para ilustrar cada nível de normalização.
Por que normalizar um banco de dados?
Antes de mergulharmos nos detalhes da normalização de bancos de dados, é essencial compreender por que ela é necessária. A normalização oferece várias vantagens:
- Integridade dos dados: A normalização ajuda a manter a precisão e a consistência dos dados reduzindo a redundância. Quando os dados são armazenados de forma não repetitiva, são menos propensos a erros.
- Armazenamento eficiente: Bancos de dados normalizados tendem a ocupar menos espaço de armazenamento, pois os dados duplicados são minimizados. Isso reduz o custo total de armazenamento.
- Otimização de consultas: As consultas tornam-se mais eficientes em bancos de dados normalizados, pois precisam acessar tabelas menores e bem estruturadas em vez de tabelas grandes e não normalizadas.
- Flexibilidade: Bancos de dados normalizados são mais flexíveis ao lidar com mudanças nas exigências de dados ou nas regras de negócios.
Níveis de normalização
A normalização de bancos de dados é geralmente dividida em vários níveis, conhecidos como formas normais. As formas normais mais comumente usadas são:
- Primeira Forma Normal (1FN): Garante que cada coluna em uma tabela contenha valores atômicos e indivisíveis. Não deve haver grupos repetidos, e cada coluna deve ter um nome único.
- Segunda Forma Normal (2FN): Baseando-se na 1FN, a 2FN elimina dependências parciais. Uma tabela está na 2FN se estiver na 1FN e todos os atributos não-chave forem funcionalmente dependentes da chave primária inteira.
- Terceira Forma Normal (3FN): Baseando-se na 2FN, a 3FN elimina dependências transitivas. Uma tabela está na 3FN se estiver na 2FN e todos os atributos não-chave forem funcionalmente dependentes da chave primária, mas não de outros atributos não-chave.
- Forma Normal de Boyce-Codd (BCNF): Uma versão mais rigorosa da 3FN, a BCNF garante que toda dependência funcional não trivial seja uma superchave. Isso significa que não são permitidas dependências parciais ou transitivas.
- Quarta Forma Normal (4FN): A 4FN lida com dependências multivaloradas, onde um atributo depende de outro atributo, mas não é uma função da chave primária.
- Quinta Forma Normal (5FN) ou Forma Normal de Projeto-Junção (PJNF): Essas formas lidam com casos em que uma tabela está na 4FN, mas existem dependências de junção que podem ser ainda mais otimizadas.
Agora, vamos ilustrar essas formas normais com exemplos:
Primeira Forma Normal (1FN)
Considere uma tabela não normalizada que armazena pedidos de clientes:
| ID do Pedido | Cliente | Produtos |
|---|---|---|
| 1 | João | Maçãs, Bananas, Laranjas |
| 2 | Alice | Uvas, Morangos |
| 3 | Bob | Limões, Limas |
Esta tabela viola a 1FN porque a colunaProdutos contém uma lista de itens. Para trazê-la à 1FN, dividimos os produtos em linhas separadas:
| ID do Pedido | Cliente | Produto |
|---|---|---|
| 1 | João | Maçãs |
| 1 | João | Bananas |
| 1 | João | Laranjas |
| 2 | Alice | Uvas |
| 2 | Alice | Morangos |
| 3 | Bob | Limões |
| 3 | Bob | Limões |
Agora, cada célula contém um valor atômico, e a tabela está na 1FN.
Segunda Forma Normal (2FN)
Considere uma tabela que armazena informações sobre alunos e seus cursos:
| ID do Aluno | ID do Curso | Nome do Curso | Instrutor |
|---|---|---|---|
| 1 | 101 | Matemática | Prof. Smith |
| 1 | 102 | Física | Prof. Johnson |
| 2 | 101 | Matemática | Prof. Smith |
| 3 | 103 | História | Prof. Davis |
Esta tabela viola a 2FN porque o Instrutor atributo depende de ambos ID do Aluno e ID do Curso. Para alcançar a 2FN, dividimos a tabela em duas tabelas separadas:
Tabela de Alunos:
| ID do Aluno | Nome do Aluno |
|---|---|
| 1 | John |
| 2 | Alice |
| 3 | Bob |
Tabela de Cursos:
| ID do Curso | Nome do Curso | Instrutor |
|---|---|---|
| 101 | Matemática | Prof. Smith |
| 102 | Física | Prof. Johnson |
| 103 | História | Prof. Davis |
Agora, o Instrutor atributo depende apenas do IDCurso, e a tabela está na 2FN.
Terceira Forma Normal (3FN)
Considere uma tabela que armazena informações sobre funcionários e seus projetos:
| IDFuncionário | IDProjeto | NomeProjeto | Gerente |
|---|---|---|---|
| 1 | 101 | ProjetoA | John |
| 1 | 102 | ProjetoB | Alice |
| 2 | 101 | ProjetoA | John |
| 3 | 103 | ProjetoC | Bob |
Esta tabela viola a 3FN porque o Gerente atributo depende do IDFuncionário, não diretamente na chave primária. Para levá-lo à 3FN, dividimos a tabela em duas tabelas separadas:
Tabela de Funcionários:
| IDFuncionário | NomeFuncionário |
|---|---|
| 1 | João |
| 2 | Alice |
| 3 | Bob |
Tabela de Projetos:
| IDProjeto | NomeProjeto |
|---|---|
| 101 | ProjetoA |
| 102 | ProjetoB |
| 103 | ProjetoC |
Tabela de FuncionáriosProjetos:
| IDFuncionário | IDProjeto |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
| 3 | 103 |
Agora, o Gerente atributo depende do ProjectID, e a tabela está na 3FN.
Forma Normal de Boyce-Codd (BCNF)
A BCNF é uma versão mais rigorosa da 3FN. Para ilustrar a BCNF, considere uma tabela que armazena informações sobre professores e suas áreas de pesquisa:
| ID do Professor | Área de Pesquisa | Número do Escritório |
|---|---|---|
| 1 | Inteligência Artificial | 101 |
| 2 | Aprendizado de Máquina | 102 |
| 3 | Inteligência Artificial | 103 |
Esta tabela viola a BCNF porque existe uma dependência funcional não trivial entre Área de Pesquisa e Número do Escritório (ou seja, o número do escritório depende da área de pesquisa). Para alcançar a BCNF, dividimos a tabela em duas tabelas separadas:
Tabela de Professores:
| ID do Professor | Nome do Professor |
|---|---|
| 1 | Prof. Smith |
| 2 | Prof. Johnson |
| 3 | Prof. Davis |
Tabela ResearchAreas:
| Área de Pesquisa | Número do Escritório |
|---|---|
| Inteligência Artificial | 101 |
| Aprendizado de Máquina | 102 |
Tabela ProfessorResearch:
| ID do Professor | Área de Pesquisa |
|---|---|
| 1 | Inteligência Artificial |
| 2 | Aprendizado de Máquina |
| 3 | Inteligência Artificial |
Agora, a tabela está em FNBC porque não existem dependências funcionais não triviais.
Quarta Forma Normal (4FN)
A 4FN lida com dependências multivaloradas. Considere uma tabela que armazena informações sobre livros e seus autores:
| ID do Livro | Título | Autores |
|---|---|---|
| 1 | LivroA | AuthorX, AuthorY |
| 2 | BookB | AuthorY, AuthorZ |
| 3 | BookC | AuthorX |
Esta tabela viola a 4NF porque existe uma dependência multi-valorada entre BookID e Autores. Para alcançar a 4NF, dividimos a tabela em três tabelas separadas:
Tabela de Livros:
| BookID | Título |
|---|---|
| 1 | BookA |
| 2 | BookB |
| 3 | BookC |
Tabela de Autores:
| AuthorID | Nome do Autor |
|---|---|
| 1 | AuthorX |
| 2 | AuthorY |
| 3 | AuthorZ |
Tabela BookAuthors:
| BookID | AuthorID |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
Agora, cada tabela está na 4FN, e as dependências multivaloradas foram removidas.
Quinta Forma Normal (5FN) ou Forma Normal de Projeto-Junção (FNPJ)
A 5FN ou FNPJ lida com dependências de junção, que estão além do escopo deste artigo introdutório. Alcançar a 5FN geralmente envolve uma decomposição adicional e é frequentemente necessária para bancos de dados complexos.
Conclusão
A normalização de bancos de dados é um processo crítico no design de bancos de dados, voltado para otimizar o armazenamento de dados, melhorar a integridade dos dados e reduzir anomalias de dados. Organizando os dados em tabelas normalizadas, você pode aumentar a eficiência e a manutenibilidade do seu sistema de banco de dados.
Lembre-se de que alcançar formas normais mais altas, como a BCNF e a 4NF, nem sempre é necessário para todos os bancos de dados. O nível de normalização depende dos requisitos específicos da sua aplicação e dos trade-offs entre integridade de dados e desempenho.
Ao projetar um banco de dados, é essencial encontrar um equilíbrio entre normalização e praticidade. Em muitos casos, alcançar a 3FN é suficiente para garantir a integridade dos dados, mantendo um bom desempenho de consultas.
Compreender os princípios da normalização e praticá-los com exemplos do mundo real é crucial para administradores de bancos de dados e desenvolvedores criarem sistemas de bancos de dados eficientes e robustos.











