4.2 Segunda Forma Normal (2FN)

Para estar de acordo com a 2FN é necessário que a tabela esteja também na 1FN, e que todos os atributos que não forem chave sejam dependentes de toda a chave primária e não somente de parte dela. Um dos principais benefícios desta regra de normalização é evitar a presença de valores redundantes.

A tabela (controle) abaixo não se enquadra na 2FN:

Exemplo para análise

Figura 27 - Exemplo para análise

Analisando a tabela acima:

  • A coluna id_servico faz referência às colunas servico e valor_hora, logo se imagina que em determinado momento os valores dessas duas colunas irão se repetir. Lembre-se que a duplicação de valores/dados é um dos elementos que quebram os conceitos da 2FN;
  • As colunas id e id_servico são claramente chaves compostas, pois servem para identificar registros únicos, porém a coluna id faz referência somente às colunas total_horas e subtotal, enquanto id_servico faz referência às demais colunas. A 2FN diz que todos os atributos não chave devem depender de toda a chave e não somente de parte dela, sendo assim estamos quebrando essa regra;
  • Outro problema no modelo acima é que, se em algum momento tivermos que alterar o nome de determinado serviço, será necessário aplicar update em N registros para alterar uma única informação.

Para nos adequar à Segunda Forma Normal devemos seguir estes passos:

a) Separar os atributos que possam gerar alguma redundância de valor, ou seja, mover as colunas id_servico, servico e valor_hora para outra entidade; b) Estabelecer um relacionamento por meio de uma chave estrangeira.

Veja abaixo o resultado final (tabela de acordo com a Segunda Forma Normal):

Tabela na 2FN

Figura 28 - Tabela na 2FN

Ótimo, agora sim! Na primeira coluna temos o controle de horas e o custo total para determinado serviço. Quando um serviço for prestado, basta efetuar um INSERT na primeira tabela e criar uma referência para o serviço por meio da coluna id_servico. Se por acaso um dia resolvermos trocar o nome do serviço Designer de Site para Designer Web precisaremos efetuar um único update na segunda tabela, que irá refletir em todas as outras, pois a referência se dá por meio do código, ou seja, por meio da coluna id_servico, e não pelo nome do serviço propriamente dito.

Agora podemos fazer a seguinte alusão: a primeira tabela se refere ao meu controle de horas trabalhadas, e a segunda tabela é o meu catalogo de serviços. Bom, não é? :)

results matching ""

    No results matching ""