Pular para o conteúdo principal

O que é a Segunda Forma Normal (2NF)?

Saiba como a segunda forma normal (2NF) pode melhorar o design do seu banco de dados, eliminando dependências parciais.
Actualizado 6 de jan. de 2025  · 9 min de leitura

Ao trabalhar com bancos de dados, é comum você encontrar problemas como dados redundantes e atualizações inconsistentes. A segunda forma normal é uma etapa de normalização do banco de dados que se baseia na primeira forma normal (1NF) para criar tabelas mais limpas e eficientes. 

Compreender a 2NF é fundamental para quem trabalha com design de banco de dados ou gerenciamento de dados, e ela estabelece a base para formas de normalização mais elevadas, como a terceira forma normal (3NF). Neste artigo, exploraremos como o 2NF funciona e como transformar tabelas para atender aos requisitos do 2NF, com exemplos práticos. Também falaremos sobre as vantagens e desvantagens do 2NF e os casos de uso mais adequados para você.

Entendendo a segunda forma normal

A segunda forma normal é uma etapa de normalização do banco de dados que se concentra na eliminação de dependências parciais. Foi introduzido por Edgar F. Codd, o pioneiro dos bancos de dados relacionais, como parte de seu trabalho sobre normalização.  

Para que uma tabela possa estar em 2NF, ela deve satisfazer as regras da primeira forma normal:

  • Atomicidade: Cada célula deve conter um único valor (sem grupos ou matrizes de repetição).
  • Linhas exclusivas: A tabela deve ter uma chave primária clara.

O 2NF vai um passo além com uma regra adicional: eliminar dependências parciais.

Uma dependência parcial ocorre quando um atributo não principal (coluna que não faz parte de nenhuma chave candidata) depende apenas de parte de uma chave composta em vez de toda a chave. A regra 2NF garante que todos os atributos não-prime dependam de toda a chave primária, e não apenas de uma parte dela. Deixar dependências parciais em uma tabela significa que dados redundantes podem se infiltrar no banco de dados, levando à ineficiência e a possíveis inconsistências durante atualizações ou exclusões.

A teoria por si só pode ser um pouco árida, portanto, vamos dar uma olhada em um exemplo prático.

Abaixo você encontra uma Matrícula no curso dos alunos da Datacamp.

ID do aluno ID do curso Nome do curso Nome do instrutor
1001 201 Fundamentos de SQL Ken Smith
1002 202 Introdução ao Python Merlin O'Donnell
1001 202 Introdução ao Python Merlin O'Donnell

Aqui, a chave primária é a combinação do ID do aluno e do ID do curso. No entanto, os atributos não primários Course Name e Course Fee dependem apenas do ID do curso, e não da chave inteira. Isso viola o 2NF.

Etapas para decompor tabelas para obter 2NF

Para garantir que uma tabela siga as regras de 2NF, você precisa:

  1. Identifique todas as chaves candidatas: Determine os conjuntos mínimos de atributos que identificam exclusivamente as linhas da tabela. Essas são as chaves para você se candidatar.
  2. Determine as dependências funcionais: Identifique todas as dependências funcionais na tabela. Especificamente, procure dependências em que atributos não-prime (aqueles que não fazem parte de nenhuma chave candidata) dependam apenas de uma parte de uma chave composta.
  3. Eliminar dependências parciais: Para cada dependência parcial:
    • Mova os atributos dependentes para uma nova tabela junto com a parte da chave da qual eles dependem.
    • Certifique-se de que a nova tabela tenha uma chave primária exclusiva.
  4. Repita até que não haja mais dependências parciais: Confirme se todos os atributos não primários em todas as tabelas são totalmente dependentes de suas respectivas chaves primárias.

Exemplos da segunda forma normal na prática

Vamos dar uma olhada em dois exemplos.

Exemplo 1: Tabela de inscrição no curso

Anteriormente, vimos a seguinte tabela de matrículas no curso:

ID do aluno ID do curso Nome do curso Nome do instrutor
1001 201 Fundamentos de SQL Ken Smith
1002 202 Introdução ao Python Merlin O'Donnell
1001 202 Introdução ao Python Merlin O'Donnell

Vamos seguir as etapas que descrevemos na seção anterior.

1. Identificar nossa chave de candidato.

Nesse caso, a chave candidata é uma chave composta de ID do aluno e ID do curso. Essa combinação exclusiva identifica cada linha da tabela.

2. Determinar nossas dependências funcionais

O nome do curso e o nome do instrutor dependem do ID do curso, não da chave composta completa (ID do aluno, ID do curso). Essa é uma dependência parcial porque esses atributos dependem apenas de parte da chave composta.

3. Eliminar dependências parciais

Precisamos mover os atributos que dependem apenas de parte da chave (Nome do curso e Nome do instrutor) para uma nova tabela que se baseia somente no ID do curso.

Após a decomposição, nossas novas tabelas têm a seguinte aparência:

Tabela de inscrição no curso

ID do aluno ID do curso
1001 201
1002 202
1001 202

Tabela de detalhes do curso

ID do curso Nome do curso Nome do instrutor
201 Fundamentos de SQL Ken Smith
202 Introdução ao Python Merlin O'Donnell

Se você quiser colocar a mão na massa e criar seus próprios bancos de dados, dê uma olhada no nosso curso PostgresQL. Se você for um pouco mais avançado, pode tentar esta Introdução à modelagem de dados no Snowflake, que aborda ideias como entidade-relacionamento e modelagem dimensional.

Exemplo 2: Tabela de pedidos

Começaremos com essa tabela de pedidos. Tente seguir as etapas que descrevemos acima e decomponha você mesmo essa mesa! 

ID do pedido ID do produto Data do pedido Nome do produto Nome do fornecedor
1 201 2024-11-01 Laptop TechSupply
1 202 2024-11-01 Mouse TechSupply
2 201 2024-11-02 Laptop TechSupply
3 203 2024-11-03 Teclado KeyMasters

1. Identificar nossa chave de candidatos

A combinação deID do pedido e ID do produto identifica exclusivamente cada linha, tornando (ID do pedido, ID do produto) uma chave candidata composta. Nenhuma coluna única pode identificar exclusivamente as linhas porque:

  • ID do pedido sozinho não é exclusivo, pois vários produtos podem fazer parte do mesmo pedido.
  • ID do produto sozinho não é exclusivo, pois o mesmo produto pode aparecer em pedidos diferentes.

Isso significa que (ID do pedido, ID do produto) também é nossa chave primária.

2. Determinar nossas dependências funcionais

A data do pedido depende do ID do pedido (não da chave composta completa). Essa é uma dependência parcial.

O nome do produto e o nome do fornecedor dependem do ID do produto (não da chave composta completa). Essas também são dependências parciais.

3. Eliminar dependências parciais

Precisamos dividir a tabela em tabelas menores, cada uma abordando uma dependência lógica. 

Primeiro, criaremos uma tabela para informações do pedido, que contém informações específicas para ID do pedido.

Tabela de pedidos

ID do pedido Data do pedido
1 2024-11-01
2 2024-11-02
3 2024-11-03

Em seguida, criamos uma tabela que contém informações específicas para ID do produto.

Tabela de pedidos

ID do produto Nome do produto Nome do fornecedor
201 Laptop TechSupply
202 Mouse TechSupply
203 Teclado KeyMasters

A tabela original agora está reduzida apenas à chave composta e às relações entre pedidos e produtos.

ID do pedido ID do produto
1 201
1 202
2 201
3 203

Agora, nosso banco de dados está em 2NF porque 1) todas as dependências parciais foram eliminadas e 2) natributos não-primários dependem inteiramente de suas respectivas chaves primárias.

Quando implementar a segunda forma normal

Então, por que você deve refatorar seu banco de dados para 2NF? Isso é suficiente por si só ou você deve dar um passo adiante e buscar o 3NF? 

Benefícios e limitações da segunda forma normal

A segunda forma normal oferece várias vantagens, o que a torna uma etapa útil no processo de normalização do banco de dados:

  • Integridade de dados aprimorada: Ao eliminar as dependências parciais, o 2NF minimiza as anomalias de inserção, atualização e exclusão, resultando em um banco de dados mais confiável.
  • Redução da redundância: O 2NF diminui a repetição de dados, otimizando o uso do armazenamento e simplificando a manutenção dos dados.
  • Estrutura de dados aprimorada: Ele estabelece as bases para uma normalização adicional, como a progressão para a terceira forma normal, criando um design de banco de dados mais limpo e eficiente.

Mas ele tem algumas limitações:

  • Maior complexidade: A decomposição de tabelas para atender ao 2NF pode tornar o processo de design mais complexo, principalmente ao lidar com chaves compostas e dependências.
  • Junções adicionais: A divisão de tabelas pode exigir mais uniões em consultas, o que pode afetar o desempenho em sistemas com grandes conjuntos de dados ou consultas complexas - mais sobre isso abaixo.
  • Redundância residual: Embora o 2NF reduza as dependências parciais, ele não aborda as dependências transitivas, deixando algumas redundâncias até que sejam abordadas no 3NF.

Considerações sobre o desempenho com a segunda forma normal

A decomposição de tabelas para eliminar dependências parciais pode afetar diretamente o desempenho do banco de dados. Por um lado, a obtenção do 2NF reduz a redundância de dados e melhora a consistência, levando a menos anomalias durante as operações de inserção, atualização ou exclusão. Por outro lado, a normalização pode aumentar o número de tabelas, o que significa que são necessárias junções adicionais ao recuperar dados relacionados. Isso pode afetar o desempenho da consulta em grandes conjuntos de dados.

Para garantir que o desempenho do seu banco de dados normalizado permaneça, certifique-se de que você siga estas práticas recomendadas:

  • Indexação: Use índices para acelerar as uniões entre tabelas decompostas.
  • Otimização de consultas: Otimize as consultas para minimizar o custo de uniões adicionais.
  • Abordagem híbrida: Combine a normalização com a desnormalização em áreas em que o desempenho é importante, como tabelas de relatórios.
  • Monitoramento regular: Avalie continuamente o desempenho do seu banco de dados com ferramentas de criação de perfil para detectar qualquer problema em potencial.

A 2NF é apenas uma etapa de transição para você atingir a terceira forma normal?

Na maioria dos casos, os projetistas de bancos de dados se esforçam para atingir a terceira forma normal devido à sua capacidade de reduzir ainda mais a redundância e melhorar a integridade geral dos dados. No entanto, alcançar o 3NF geralmente envolve trabalho adicional, como a criação de mais tabelas e relacionamentos, o que pode introduzir complexidade e compensações de desempenho na execução de consultas.

Há casos em que o uso da segunda forma normal por si só pode ser suficiente. Se a simplicidade e a implementação rápida forem prioridades, como em projetos de pequena escala, prototipagem ou situações em que a redundância de dados é mínima, o 2NF pode ser suficiente. Por exemplo, em sistemas em que todos os atributos já são totalmente dependentes de uma chave primária simples, a obtenção de 2NF pode cumprir o objetivo principal de reduzir a dependência parcial, sem a necessidade de normalização adicional.

Indo além da segunda forma normal: em direção à terceira forma normal

Se quiser normalizar ainda mais o banco de dados, você pode continuar refatorando as tabelas para chegar à terceira forma normal.

O 3NF se baseia no 2NF ao tratar de dependências transitivas - situações em que atributos não-chave dependem de outros atributos não-chave em vez da chave primária. Essa progressão garante que cada atributo seja diretamente dependente da chave primária e nada mais.

Por exemplo, em uma tabela que rastreia as matrículas em cursos:

  • 2NF: Garante que atributos como o nome do curso e o nome do aluno dependam inteiramente de suas respectivas chaves primárias (por exemplo, ID do aluno e ID do curso). Isso elimina as dependências parciais, em que os atributos que não são chaves dependem apenas de parte da chave composta.
  • 3NF: Garante que atributos como detalhes do instrutor ou informações do departamento sejam armazenados em tabelas separadas, eliminando dependências transitivas.

O 3NF é ideal para sistemas mais complexos em que a integridade e a eficiência dos dados são fundamentais, especialmente à medida que o volume de dados aumenta. Consulte nosso artigo O que é a terceira forma normal? se você quiser saber mais sobre a 3NF e sua forma mais restritiva, a BCNF.

Conclusão

A segunda forma normal é uma etapa essencial na normalização do banco de dados, preenchendo a lacuna entre a 1NF e as formas superiores, como a 3NF. Ao remover as dependências parciais, o 2NF reduz a redundância e aumenta a confiabilidade dos seus dados. Embora possa acrescentar alguma complexidade, os benefícios da integridade aprimorada dos dados e da manutenção simplificada fazem dela uma parte essencial do design eficaz do banco de dados.

Se você estiver pronto para aprimorar suas habilidades, explore nosso curso de Design de banco de dados para aprofundar sua compreensão das técnicas de normalização e suas aplicações práticas. Você também pode validar suas habilidades de gerenciamento de banco de dados e SQL e demonstrar sua experiência para possíveis empregadores com a nossa Certificação SQL Associate!

Por fim, gostaria de dizer que, se você é um tomador de decisões em uma empresa e sabe que precisa trabalhar para criar bancos de dados mais limpos e eficientes, considere a possibilidade de participar de um DataCamp for Business . Podemos ajudar a transformar os recursos da sua equipe para que você possa criar sistemas de banco de dados escalonáveis que impulsionem a eficiência e a inovação dos negócios. Podemos até mesmo criar caminhos de aprendizagem e trilhas personalizadas. 

Você está treinando duas ou mais pessoas? Confira nossas soluções de negócios

Dê à sua equipe acesso à biblioteca completa do DataCamp, com relatórios centralizados, atribuições, projetos e muito mais

Experimente O DataCamp for Business
business-homepage-hero.png

Marie Fayard's photo
Author
Marie Fayard

Engenheiro de software sênior, redator técnico e consultor com formação em física. Comprometida em ajudar as startups em estágio inicial a atingir seu potencial e tornar conceitos complexos acessíveis a todos.

Perguntas frequentes sobre o 2NF

A segunda forma normal (2NF) pode ser aplicada a bancos de dados sem chaves compostas?

Sim! Embora o 2NF geralmente envolva chaves compostas, as tabelas de chave única também podem seguir os princípios do 2NF se todos os atributos não primários dependerem totalmente da chave primária.

A obtenção do 2NF garante a eliminação de toda a redundância em um banco de dados?

Não. Embora o 2NF elimine as dependências parciais, ele não trata das dependências transitivas. Para isso, você precisa passar para a terceira forma normal (3NF).

Há situações em que um banco de dados em 1NF é suficiente sem passar para 2NF?

Sim. Em sistemas muito simples com redundância mínima de dados ou em protótipos, o 1NF pode ser suficiente. Em geral, eu não recomendaria parar em 1NF, a menos que você tenha um motivo muito específico e justificável.

Qual é a diferença entre 2NF e terceira forma normal (3NF)?

O 2NF remove dependências parciais, garantindo que os atributos dependam de toda a chave. O 3NF vai além ao remover as dependências transitivas, garantindo que os atributos dependam diretamente da chave primária e não de outros atributos que não sejam chaves.

Como faço para verificar se meu banco de dados existente já está em 2NF?

Você pode verificar revisando todas as tabelas com chaves compostas e verificando se todos os atributos não-prime dependem de toda a chave composta, e não apenas de uma parte dela.

Temas

Aprenda com a DataCamp

Certificação disponível

curso

Projeto de banco de dados

4 hr
82.2K
Aprenda a projetar bancos de dados em SQL para processar, armazenar e organizar dados de forma mais eficiente.
Ver DetalhesRight Arrow
Iniciar Curso
Ver maisRight Arrow
Relacionado
SQL Programming Language

blog

O que é SQL? - A linguagem essencial para o gerenciamento de bancos de dados

Saiba tudo sobre o SQL e por que ele é a linguagem de consulta ideal para o gerenciamento de bancos de dados relacionais.
Summer Worsley's photo

Summer Worsley

16 min

blog

O que é um banco de dados gráfico? Um guia para iniciantes

Explore o intrincado mundo dos bancos de dados gráficos com nosso guia para iniciantes. Entenda as relações entre os dados, aprofunde-se na comparação entre bancos de dados relacionais e gráficos e explore casos de uso práticos.
Kurtis Pykes 's photo

Kurtis Pykes

11 min

tutorial

Tutorial de visão geral do banco de dados SQL

Neste tutorial, você aprenderá sobre bancos de dados em SQL.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

SELEÇÃO de várias colunas no SQL

Saiba como selecionar facilmente várias colunas de uma tabela de banco de dados em SQL ou selecionar todas as colunas de uma tabela em uma consulta simples.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

Como usar um alias SQL para simplificar suas consultas

Explore como o uso de um alias SQL simplifica os nomes de colunas e tabelas. Saiba por que usar um alias SQL é fundamental para melhorar a legibilidade e gerenciar uniões complexas.
Allan Ouko's photo

Allan Ouko

9 min

tutorial

Tutorial do MySQL: Um guia abrangente para iniciantes

Descubra o que é o MySQL e como começar a usar um dos sistemas de gerenciamento de banco de dados mais populares.
Javier Canales Luna's photo

Javier Canales Luna

15 min

See MoreSee More