RVA

Introdução à normalização

Ao longo da disciplina, discutimos diferentes modelagens aplicáveis a um mesmo problema. Algumas eram equivalentes entre si, enquanto outras se mostraram mais eficientes. Agora, daremos continuidade à nossa exploração em Banco de Dados, com foco nos conceitos de normalização.

Como vimos no início do curso, bancos de dados relacionais oferecem uma série de benefícios, mas também exigem o cumprimento de boas práticas para que seu uso seja eficaz. A normalização é uma dessas práticas: é um processo que visa aprimorar a modelagem dos dados, reduzindo a redundância e promovendo maior consistência.

O processo de normalização em um banco de dados pode ser conduzido em etapas, nas quais o esquema é avaliado em relação a diferentes propriedades. Cada uma dessas propriedades define uma forma normal. Nem sempre um banco de dados atenderá a todas elas, mas é comum que os bancos sejam modelados considerando até a terceira forma normal (3FN) ou a Forma Normal de Boyce-Codd (FNBC).

Antes de conhecermos as formas normais, precisamos reforçar alguns conceitos importantes:

  1. Superchave: segundo Elmasri e Navathe (2011), uma superchave é um atributo (ou conjunto de atributos) cujos valores identificam unicamente cada tupla de uma relação. Um detalhe importante é que uma superchave pode conter atributos redundantes. Por exemplo, em uma relação PESSOA(cpf,nome)PESSOA(\underline{cpf}, nome), o conjunto cpf,nome\underline{cpf}, nome é uma superchave, embora o atributo nome seja redundante, já que cpf\underline{cpf} por si só é suficiente para identificar exclusivamente cada pessoa. O conceito de chave candidata, por sua vez, elimina esses atributos não essenciais, exigindo minimalidade.
  2. Atributo principal (ou primo): um atributo principal é aquele que faz parte de alguma chave candidata da relação. Por exemplo, considerando a relação PESSOA(rgNumero,rgUF,rgOrgao,nome)PESSOA(\underline{rgNumero, rgUF, rgOrgao}, nome), o atributo rgOrgaorgOrgao é um atributo principal, pois pertence a uma chave candidata (no caso, a chave primária composta da relação). Uma observação importante é que um atributo é considerado principal mesmo que pertença a uma chave candidata que não foi escolhida como chave primária.
  3. Dependência funcional: em bancos de dados, uma dependência funcional XYX → Y ocorre quando, para quaisquer duas tuplas de uma relação, se elas possuem o mesmo valor para os atributos em X, então necessariamente possuem o mesmo valor para os atributos em Y. Em outras palavras, os valores de X determinam os valores de Y. Por exemplo, considerando a relação UNIVERSIDADE_FEDERAL(<u>sigla</u>, nome), podemos dizer que existe a dependência funcional sigla → nome, pois uma mesma sigla, como UFMT, está associada a um único nome, como “Universidade Federal de Mato Grosso”.
  • Uma dependência funcional (X>Y)(X->Y) será considerada não trivial quando o(s) atributo(s) determinado(s) não fizer(em) parte do conjunto de atributos determinantes. Ou seja: (Y⊈X)(Y \not\subseteq X).
  1. Dependência funcional transitiva: corre quando existem duas dependências funcionais X->Y e Y->Z, de modo que Z depende indiretamente de Y. Nesse caso, dizemos que há uma dependência transitiva X->Z, desde que Y não seja uma superchave. Por exemplo, considerando a relação CAMPUS(universidade_federal_sigla, estado, regiao), temos:
  • universidade_federal_sigla → estado
  • estado → regiao

Assim, regiao depende transitivamente de universidade_federal_sigla.

Agora que já reforçamos os conceitos, vamos às definições.

Copyright © 2026