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:
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):
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 é? :)