Cursos / Informática para Internet / Banco de dados / Aula

arrow_back Aula 06 - Normalização Básica

Segunda Forma Normal (2FN)

Uma tabela está na Segunda Forma Normal (2FN) se e somente se ela estiver na 1FN e todos os atributos não chave primária puderem ser obtidos da combinação de todos os atributos que formam a chave primária.

Para ilustrar o significado da 2FN, vamos observar a Figura 5, adaptada de (CONNOLLY; BEGG, 2000).

Exemplo de tabela que não está na 2FN.

Nessa figura, a tabela Alocação armazena as horas trabalhadas por funcionários temporários em determinadas agências de um banco. Na parte superior é mostrada a estrutura da tabela, na qual é possível identificar que a sua chave primária é formada pelos atributos NumEmp e NumAg. Além desses dois atributos, a tabela Alocação possui mais três atributos que não fazem parte da chave primária. São eles: AgEnd, NomeEmp e horasSem.

Como você viu anteriormente, para estar na 2FN, todos esses três atributos não chave (AgEnd, NomeEmp e horasSem) devem ser obtidos através dos dois atributos chaves (NumEmp e NumAg). Se for possível obter um atributo não chave primária através de apenas um dos atributos chave primária, então a tabela não está na 2FN.

Por exemplo, eu consigo saber o endereço da agência (atributo AgEnd) apenas através do atributo NumAg? A resposta é sim. O endereço da agência é uma informação intrínseca à agência e pode ser obtido através do atributo NumAg.

Vejamos outro exemplo. Eu consigo obter o nome do empregado (NomeEmp) através do código do empregado (NumEmp)? Sim, esta informação é intrínseca ao empregado e, através do atributo NumEmp, eu poderia obter seu nome. Finalmente, eu poderia obter as horas semanais trabalhadas pelo empregado apenas através de seu NumEmp? Não, isso acontece porque as horas semanais de cada empregado dependem da agência onde ele trabalha. Assim, o atributo horasSem depende dos dois atributos NumEmp e NumAg que compõem a chave primária para ser obtido.

Para concluir o exemplo, temos que a tabela Alocação mostrada na Figura 5 não está na 2FN porque possui pelo menos um atributo que pode ser obtido de apenas um dos atributos que formam a chave primária. Esse é o caso do atributo NomeEmp, que pode ser obtido apenas de NumEmp, e um outro exemplo é o caso do atributo AgEnd, que pode ser obtido apenas do atributo NumAg.

O fato de que uma tabela não está na 2FN pode gerar as anomalias mostradas anteriormente. Por exemplo, para modificar o endereço da agência de número 1550 você teria que modificar dois registros: o segundo e quarto registro na tabela da Figura 5.

Bem, depois de aprender como identificar se uma tabela está ou não na 2FN, agora vamos aprender com reestruturar uma tabela de modo que ela fique na 2FN. Para adequar uma tabela que não está na 2FN é necessário fazer os seguintes passos:

  1. Criar duas novas tabelas para armazenar os dados dos campos redundantes, em que seus valores apresentam repetição de valores;
  2. Remover os campos com valores redundantes da tabela original;
  3. Criar chaves primárias nas novas tabelas criadas com base na chave primária da tabela original;
  4. Criar relações um-para-muitos entre as novas tabelas criadas e a tabela original.

Os passos listados anteriormente são ilustrados na Figura 6, utilizando-se o exemplo da tabela Alocação.

Exemplo de normalização da tabela Alocação para a 2FN.

A primeira coisa a fazer é criar as tabelas Empregado e Agência. Essas tabelas irão armazenar os dados intrínsecos de Empregado e Agência que, na Figura 5, estavam na tabela Alocação.

Depois disso, você precisa definir as chaves primárias das tabelas Empregado e Agência. Para saber qual campo será a chave primária das tabelas criadas, você deve olhar para a chave primária da tabela Alocação e fazer a pergunta: qual o campo da chave primária da tabela Alocação está relacionado ao Empregado? Qual está relacionado a Agência? A resposta para essas perguntas é, respectivamente, NumEmp e NumAg. Assim, NumEmp será a chave primária da tabela Empregado e NumAg será a chave primária da tabela Agência.

Em seguida, você deve inserir nas tabelas criadas os seus atributos relacionados. Por exemplo, NomeEmp vai para a tabela Empregado e AgEnd vai para a tabela Agência. O próximo passo é remover os atributos NomeEmp e AgEnd da tabela Alocação.

Note que na tabela Alocação só devem ficar os atributos que só podem ser obtidos pela combinação dos atributos que formam a chave primária. Assim, a tabela Alocação só ficará com os atributos que formam a chave primária (NumEmp e NumAg) e o atributo horasSem. Para finalizar, você deve definir os atributos NumEmp e NumAg como chaves estrangeiras para as tabelas Empregado e Agência, respectivamente. Finalmente, a Figura 7 mostra a estrutura das tabelas que estão na 2FN.

Exemplo de tabelas que estão na 2FN.

Versão 5.3 - Todos os Direitos reservados