Pular para o conteúdo principal

O que é a Terceira Forma Normal (3NF)?

Saiba como a terceira forma normal (3NF) pode ajudar você a organizar seus bancos de dados com mais eficiência, removendo a redundância e minimizando os problemas de dependência. Veja como a decomposição de tabelas pode simplificar o gerenciamento de dados.
Actualizado 14 de fev. de 2025  · 9 min de leitura

Imagine trabalhar com um banco de dados enorme e não estruturado, repleto de informações repetidas e redundantes. Cada atualização ou exclusão se torna um desastre em potencial, com risco de erros e inconsistências. A terceira forma normal (3NF) é um método comprovado de normalização de banco de dados para evitar esse caos. A implementação do 3NF limpa sua estrutura de dados, garantindo que ela seja eficiente, organizada e livre de redundâncias desnecessárias.

Neste artigo, exploraremos como o 3NF funciona, por que ele é valioso e como você pode colocá-lo em prática. Também compararemos o 3NF com outras formas e aprenderemos quando usar cada uma delas. Todos podem se beneficiar ao aprender mais sobre essas estruturas, mas esse conhecimento é particularmente valioso se você for um designer de banco de dados ou cientista de dados, pois pode simplificar significativamente seu trabalho e manter seus bancos de dados confiáveis. Se você estiver interessado no design de banco de dados como um todo, dê uma olhada no nosso curso completo de Design de banco de dados.

Definição da terceira forma normal (3NF)

A terceira forma normal é um conceito fundamental da normalização de bancos de dados que remove dependências indesejadas. O 3NF se baseia na primeira forma normal (1NF) e na segunda forma normal (2NF), o que significa que ele herda suas regras: O 1NF exige valores atômicos (indivisíveis) em cada célula, e o 2NF remove dependências parciais de uma chave primária composta. O 3NF vai além, removendo as dependências transitivas, uma situação em que os atributos que não são chaves dependem indiretamente da chave primária.

Ao se concentrar nisso, o 3NF garante que cada coluna sem chave em uma tabela esteja diretamente vinculada à chave primária e nada mais. Em termos mais práticos, o 3NF ajuda a minimizar a redundância e a evitar anomalias ao inserir, atualizar ou excluir dados.

Na década de 1970, Edgar F. Codd introduziu o 3NF para formalizar as condições para obter uma estrutura de banco de dados totalmente normalizada. Uma reformulação feita por Carlo Zaniolo alguns anos depois forneceu uma explicação mais clara da diferença entre a 3NF "clássica" e a forma normal Boyce-Codd (BCNF), mais restritiva. Não se preocupe muito com o BCNF por enquanto, pois voltaremos a ele mais adiante.

Entendendo as condições da terceira forma normal

Então, o que exatamente é necessário para você alcançar o 3NF? Para que uma tabela se qualifique, ela precisa atender a algumas condições:

  • Esteja em 2NF: Isso significa que ele já é atômico, sem grupos repetidos e sem dependências parciais de nenhuma chave composta.

Requisitos de 1NF, 2NF e 3NF

O 3NF inclui o 2NF e o 1NF. Imagem do autor

  • Não há dependências transitivas: Essa regra é fundamental. Em uma tabela 3NF, qualquer coluna que não seja de chave primária deve depender exclusivamente da chave primária, não indiretamente por meio de outra coluna que não seja de chave.

Vamos dar uma olhada no que isso significa na prática.

Decompondo tabelas para obter 3NF

Vamos examinar o processo de decomposição de tabelas para chegar a 3NF. Usaremos alguns dados de amostra dos cursos do DataCamp para ilustrar cada etapa.

Etapa 1: Identificar dependências transitivas

Para começar, procuraremos quaisquer atributos em uma tabela que dependam indiretamente da chave primária. Como regra geral, se algum atributo depender de algo que não seja a chave primária, isso indica umadependência transitiva . Esse é um sinal de que talvez seja hora de dividir sua mesa.

Dê uma olhada nas três tabelas abaixo. Qual deles tem uma dependência transitiva?

Tabela 1: Curso

ID do curso Nome do curso Dificuldade
201 Fundamentos de SQL Iniciante
202 Introdução ao Python Iniciante
203 Entendendo a ciência de dados Intermediário

Tabela 2: Instrutor

ID do instrutor Nome do instrutor Especialização
1 Sarah Johnson Ciência de dados
2 Tom Williams Aprendizado de máquina
3 Emily Brown Python

Tabela 3: Inscrições

ID de registro Nome do aluno ID do curso Nome do curso
1001 Alice Smith 201 Fundamentos de SQL
1002 Bob Green 202 Introdução ao Python
1003 Charlie Blue 201 Fundamentos de SQL

A resposta é... Tabela 3!

Nessa tabela, o nome do curso depende do ID do curso, mas não diretamente do ID de inscrição (a chave primária). Essa dependência indireta tornao Course Name uma dependência transitiva.

Etapa 2: Separar os dados em novas tabelas

Para abordar a dependência transitiva, dividiremos a Tabela 1 em duas tabelas. Cada tabela se concentrará em dados diretamente dependentes.

Tabela de matrículas revisada

ID de registro Nome do aluno ID do curso
1001 Alice Smith 201
1002 Bob Green 202
1003 Charlie Blue 201

Tabela de cursos

ID do curso Nome do curso
201 Fundamentos de SQL
202 Introdução ao Python

Agora, cada tabela contém apenas informações que dependem diretamente de sua chave primária: ID do curso é agora a chave primária para Nome do curso na seção Cursos e o ID de matrícula é a chave primária na tabela Inscrições tabela.

Com essa decomposição, as tabelas agora atendem aos requisitos de 3NF, eliminando a redundância e garantindo que cada tabela armazene somente informações diretamente relevantes.

Se você quiser colocar a mão na massa e criar seus próprios bancos de dados, dê uma olhada em nosso curso Criando bancos de dados PostgreSQL. Se você for um pouco mais avançado, poderá experimentar o Introduction to Data Modeling in Snowflake, que aborda ideias como entidade-relacionamento e modelagem dimensional.

Vantagens e limitações do uso da terceira forma normal

Então, por que você se esforça tanto para chegar ao 3NF? Aqui estão as principais vantagens:

  • Integridade de dados aprimorada: Ao eliminar as dependências transitivas, o 3NF ajuda a garantir que as atualizações e exclusões não resultem em dados conflitantes ou desatualizados nas tabelas.
  • Redundância reduzida: Menos redundância significa que a manutenção do seu banco de dados é mais fácil e o uso do armazenamento é reduzido.
  • Manutenção de dados mais simples: Manter informações semelhantes em tabelas dedicadas facilita a atualização de registros sem a necessidade de localizar entradas redundantes.

Dito isso, embora as estruturas 3NF ofereçam suporte à precisão dos dados, elas também podem levar a dados mais segmentados, o que, às vezes, torna as consultas complexas mais lentas devido a uniões de tabelas adicionais. Nos casos em que a necessidade de velocidade supera a necessidade de normalização, BCNF ou 4NF podem ser opções mais práticas.

Comparação: Primeira, segunda, terceira e BC formas normais

Vamos dar uma olhada nas diferenças de forma.

Tabela de comparação: primeira, segunda e terceira formas normais

Aqui está uma tabela de comparação para ajudar você a entender os requisitos de 1NF, 2NF e 3NF.

Recurso 1NF 2NF 3NF
Dados atômicos
Sem dependências parciais
Sem dependências transitivas

Terceira forma normal vs. Forma normal de Boyce-Codd (BCNF)

BCNF é uma forma "mais rigorosa" de 3NF que elimina ainda mais as anomalias que surgem com a sobreposição de chaves candidatas. Ele pode ser especialmente útil em casos complexos em que o 3NF sozinho não elimina totalmente as dependências. O BCNF se aplica quando um atributo não primo depende de um atributo que faz parte de uma chave candidata composta. Sei que isso parece complexo, então vamos explicar isso com um exemplo.

Estrutura atual (em 3NF)

Após a decomposição para obter 3NF, tínhamos essas duas tabelas:

Tabela de registros

ID de registro Nome do aluno ID do curso
1001 Alice Smith 201
1002 Bob Green 202
1003 Charlie Blue 201

Tabela de cursos

ID do curso Nome do curso
201 Fundamentos de SQL
202 Introdução ao Python

Nessa estrutura, cada tabela está em 3NF, sem dependências transitivas, e os dados são normalizados adequadamente.

Introdução de um novo requisito

Agora, vamos adicionar um novo atributo aos Cursos: a Sala de aula na qual cada curso é realizado. Esse novo atributo pode resultar em um cenário que exige BCNF.

Tabela de cursos atualizada (3NF)

ID do curso Nome do curso Sala de aula
201 Fundamentos de SQL Sala 101
202 Introdução ao Python Sala 102
203 Entendendo a ciência de dados Sala 101

Aqui, o ID do curso ainda é a chave primária, e todos os outros atributos dependem diretamente dele. Mas vamos supor que haja uma nova regra segundo a qual cada sala de aula pode conter apenas uma disciplina por vez. Suponhamos também que onome do curso "SQL Fundamentals" possa ser oferecido com diferentes IDs de curso (como 201, 204, etc.), se forem programados em horários diferentes. Nesse caso, cada oferta de "SQL Fundamentals" ainda seria realizada na "Sala 101", independentemente doID do curso específico . Como resultado,o Course Name também determina exclusivamente a sala de aula.

Isso significa que agora temos duas chaves candidatas:

  1. ID do curso
  2. Nome do curso

Com as duas chaves candidatas, agora temos um problema que o 3NF não resolve: Sala de aula Depende de Nome do curso em vez de apenas ID do curso.

Aplicação do BCNF

Para eliminar esse problema de dependência, precisaremos decompor ainda mais os Cursos em duas tabelas separadas que se alinham melhor com a BCNF:

  1. Um novo Cursos que inclui apenas o ID do curso e o Nome do curso.
  2. A CourseDetails que armazena o Nome do curso e Sala de aula associação.

Veja como isso se parece:

Tabela de cursos revisada (BCNF)

Tabela CourseDetails (BCNF)

Nome do curso Sala de aula
Fundamentos de SQL Sala 101
Introdução ao Python Sala 102
Entendendo a ciência de dados Sala 101

Com essa nova estrutura, cada tabela satisfaz as condições BCNF:

  • Nos Cursos você pode ver a tabela, ID do curso é a chave primária, e todos os atributos dependem exclusivamente dela.
  • Na seção CourseDetails você pode ver a tabela, Nome do curso é a chave primária, e Sala de aula depende apenas de Nome do curso.

Essa configuração elimina qualquer problema de dependência causado pela sobreposição de chaves candidatas, garantindo uma estrutura estritamente normalizada.

Conclusão

A terceira forma normal é uma ferramenta valiosa para os projetistas de bancos de dados que desejam manter os dados limpos, consistentes e livres de dependências problemáticas. Com o 3NF, a integridade dos dados é aprimorada, tornando o gerenciamento mais fácil e reduzindo a redundância. Lembre-se de que, embora o 3NF funcione bem na maioria das situações, os bancos de dados mais complexos podem se beneficiar de formas adicionais, como BCNF ou 4NF.

Se você achou este artigo útil, considere dar o próximo passo obtendo nossa certificação SQL Associate. É uma ótima maneira de validar suas habilidades de gerenciamento de banco de dados e SQL e demonstrar sua experiência para possíveis empregadores!


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 a terceira forma normal

A 3NF pode ser aplicada a todos os tipos de bancos de dados?

Embora o 3NF seja eficaz em bancos de dados relacionais, ele nem sempre é necessário para bancos de dados NoSQL, que geralmente priorizam a flexibilidade e o dimensionamento em vez da normalização rigorosa. Em alguns casos, um esquema desnormalizado pode ser preferível por motivos de desempenho, especialmente ao consultar grandes quantidades de dados rapidamente.

Quais são as desvantagens de seguir estritamente o 3NF?

A adesão estrita ao 3NF pode, às vezes, levar a esquemas complexos com muitas tabelas, o que pode exigir várias uniões em consultas. Isso pode afetar negativamente o desempenho, especialmente em grandes bancos de dados ou sistemas com altos volumes de transações. Nesses casos, abordagens alternativas, como a desnormalização ou o uso de BCNF, podem ser mais práticas.

A 3NF pode ser aplicada a bancos de dados já existentes ou é necessário reprojetá-los?

Definitivamente, o 3NF pode ser aplicado a bancos de dados existentes, embora possa exigir uma reestruturação significativa. Esse processo, chamado de refatoração do banco de dados, envolve a decomposição de tabelas para eliminar redundâncias e dependências. Dependendo do tamanho e da complexidade do banco de dados, isso pode envolver algum planejamento e testes para garantir que a integridade dos dados e o desempenho do sistema sejam mantidos.

Quais ferramentas ou técnicas podem ajudar a automatizar o processo de obtenção do 3NF?

Há várias ferramentas de design de banco de dados disponíveis, como MySQL Workbench, Oracle SQL Developer e ER/Studio, que ajudam a visualizar o esquema do banco de dados e a identificar problemas de normalização. Algumas dessas ferramentas podem sugerir ou automatizar etapas para alcançar o 3NF, embora a supervisão humana ainda seja importante para garantir a integridade e a consistência dos dados.

Qual é a diferença entre uma chave candidata e uma chave primária?

Uma chave candidata é um conjunto mínimo de atributos que pode identificar exclusivamente cada linha em uma tabela. Você pode ter várias chaves candidatas em uma tabela. Uma chave primária, por outro lado, é a chave candidata específica escolhida pelo designer do banco de dados para identificar as linhas de forma exclusiva. Somente uma chave primária é permitida por tabela, e ela não pode ter valores NULL.

Por que precisamos da forma normal de Boyce-Codd (BCNF) se uma tabela já está na terceira forma normal (3NF)?

O BCNF é mais rigoroso que o 3NF e aborda casos em que existem dependências nas chaves candidatas. Embora o 3NF remova as dependências transitivas, ele ainda pode permitir a redundância se uma dependência funcional tiver um determinante que não seja uma superchave. O BCNF elimina isso garantindo que todas as dependências funcionais tenham uma superchave no lado esquerdo.

Uma tabela pode ter mais de uma chave candidata?

Sim, uma tabela pode ter várias chaves candidatas. Cada chave candidata é um conjunto mínimo e exclusivo de atributos que podem identificar linhas.

Temas

Aprenda com a DataCamp

curso

Understanding Data Engineering

2 hr
263.9K
Discover how data engineers lay the groundwork that makes data science possible. No coding involved!
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

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 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

FUNÇÃO SQL FORMAT()

FORMAT() é uma das funções mais comumente usadas no SQL. Aprenda suas principais aplicações neste tutorial.
Travis Tang 's photo

Travis Tang

3 min

Ver maisVer mais