As formas Normais são uma serie de procedimentos aplicados em um banco de dados para garantir que as suas tabelas estejam bem estruturadas e não contenham qualquer tipo de anomalia, seja de inclusão, atualização ou exclusão.
Damos a esse série de procedimentos o nome de Normalização.
5 conceitos necessários para uma melhor compreensão:
Uma dependência funcional é um relacionamento entre dois ou mais atributos, de forma que o valor de um atributos identifique o valor para cada um dos atributos, ou seja, um atributo está relacionado a outro.
Exemplo:
CPF | NOME |
111 | Ana |
222 | Bruno |
333 | Carla |
444 | Diego |
555 | Ana |
Temos uma tabela cliente que possui dois atributos “CPF” e “NOME”, o atributo nome é dependente do atributo “CPF”. Por outro lado o atributo “CPF” não depende de nome.
Uma dependência parcial ocorre quando os atributos não chave (não identificadores) não dependam de toda a chave primária quando ela for composta.
Exemplo:
Matricula_Aluno | Cod_Disciplina | Período | Nome_Disciplina | Nota |
111 | 1 | 1 | Calculo 1 | 8 |
222 | 2 | 1 | Física | 9.5 |
333 | 3 | 1 | Contabilidade | 10 |
444 | 4 | 1 | Química | 7.5 |
555 | 5 | 1 | Intro. Eng. | 8.5 |
A chave primaria necessita mais de um atributo para identificar atributo nota na linha da tabela, ou seja, a chave primária e composta por matricula_aluno, cod_disciplina, nome_disciplina. Mas o atributo nome_disciplina precisa de parte da chave_primaria no caso o cod_disciplina, ele depende parcialmente da chave primária.
Quando um ou mais campos de uma entidade não são dependentes diretamente da chave primária ou de parte dela, mas sim dependente de outro campo da tabela (campo este que não a Chave Primária), temos uma dependência funcional transitiva.
Exemplo:
ID_Funcionário | Nome_Funcionário | ID_Cargo | Nome_Cargo | Salario |
1 | João | 1 | Analista | 3500 |
2 | Katia | 1 | Analista | 3500 |
3 | Luis | 2 | Técnico | 4100 |
4 | Maria | 2 | Técnico | 4100 |
5 | Neto | 3 | Assistente | 2200 |
Uma coluna da tabela não depende da chave primária, neste caso a coluna Nome_Cargo não precisa da coluna ID_Funcionário, que é a chave primária da tabela;
Atributos Multivalorados
Atributos multivalorados são atributos que podem conter mais de um valor para um mesmo registro.
Exemplo:
ID_Funcionário | Nome_Funcionário | Telefone |
1 | João | (21) 99999-0001 (21) 99999-0002 (21) 99999-0003 |
2 | Katia | (21) 99999-0004 |
3 | Luiz | (21) 99999-0005 (21) 99999-0006 |
4 | Marla | (21) 99999-0007 |
5 | Neto | (21) 99999-0008 |
Quando na célula de uma tabela possui mais de uma informação, no caso a coluna “Telefone” para joão e Luiz possuem mais de uma informação na célula.
Atributos Compostos
Atributos compostos são atributos que poderiam ser subdivididos em vários atributos.
ID_Funcionário | Nome_Funcionário | Endereço |
1 | João | Av. Mem de Sá, 100, apto 101 – Centro – Rio de Janeiro – RJ |
2 | Katia | Av. Portugal, 324, casa 01 – Urca – Rio de Janeiro – RJ |
3 | Luiz | Av. Vieira Souto, 1300, apto 802 – Leblon – Rio de Janeiro – RJ |
O ideal seria dividir esta única coluna em várias colunas, para que assim a gente elimine o atributo composto.
ID_Funcionário | Nome_Funcionário | Endereço | Bairro | Cidade | UF |
1 | João | Av. Mem de Sá, 100, apto 101 | Centro | Rio de Janeiro | RJ |
2 | Katia | Av. Portugal, 324, casa 01 | Urca | Rio de Janeiro | RJ |
3 | Luiz | Av. Vieira Souto, 1300, apto 802 | Leblon | Rio de Janeiro | RJ |
Tenho varias informações dentro de uma célula o ideal e que fossem separadas.
Podemos definir a Normalização como uma sequência de passos e verificações aplicadas a um banco de dados com o objetivo de eliminar, ou pelo menos minimizar as redundâncias e inconsistências no banco.
Tal procedimento é feito a partir da identificação de anomalias de inserções, exclusão e atualização em uma relação, decompondo-a em relações melhor estruturadas e minimizando a redundância.
Eliminar a redundância nos dados possui algumas vantagens:
O processo de normalização é aplicado em etapas, conhecidas como Formas Normais, que vão garantir que o banco de dados fique bem estruturado.
Existem uma série de formas normais na literatura, são elas:
As formas Normais é como se fossem fases de um jogo. Você só pode passar para a próxima se estiver adequado à Forma anterior.
Para muitos autores, a aplicação das três primeiras já é suficiente para garantir que o banco de dados não terá redundâncias e inconsistências.
A primeira forma normal tem como objetivo ele atributos multivalorados e atributos compostos.
Em resumo, para adequar uma tabela que não está na 1FN é necessário os seguintes passos:
Vejamos um exemplo. Na tabela abaixo, temos que uma série de atributos sobre a entidade PESSOA. Essa tabela não está na Primeira Forma Normal. Vamos fazer a adequação.
CPF | Nome | Sexo | Localização | Telefone |
111 | Ana | F | Rio de Janeiro, RJ | 999-444, 999-000 |
222 | Bruno | M | São Paulo, SP | 888-888,444-333 |
333 | Carla | F | Belo Horizonte, MG | 555-777 |
444 | Diego | M | Vitória, ES | 999-999 |
Identificar atributos compostos e multivalorados, a coluna Localização possui atributos composto e a coluna Telefone possui atributos multivalorados.
CPF | Telefone |
111 | 999-444 |
111 | 999-000 |
222 | 888-888 |
222 | 444-333 |
333 | 555-777 |
444 | 999-999 |
A chave primária da tabela original se torna a chave estrangeira da nova tabela, no caso a chave estrangeira da tabela Telefone é o CPF.
Depois remover a coluna de atributos multivalorados da tabela original.
CPF | Nome | Sexo | Localização |
111 | Ana | F | Rio de Janeiro, RJ |
222 | Bruno | M | São Paulo, SP |
333 | Carla | F | Belo Horizonte, MG |
444 | Diego | M | Vitória, ES |
A coluna Localização é um atributo composto. Sabemos que podemos separá-la em mais de uma, com as informações de Cidade e Estado.
CPF | Nome | Sexo | Cidade | Estado |
111 | Ana | F | Rio de Janeiro | RJ |
222 | Bruno | M | São Paulo | SP |
333 | Carla | F | Belo Horizonte | MG |
444 | Diego | M | Vitória | ES |
E assim, corrigimos a tabela criando duas outras tabelas, fazendo com que no final a Primeira Forma Normal seja atingida.
Uma tabela encontra-se na segunda forma normal se ela atende todos os requisitos da primeira forma normal e se os registros na tabela, que não são chaves, dependam da chave primária em sua totalidade e não apenas parte dela.
Aqui, vamos eliminar a dependência funcional parcial.
Em resumo, para adequar uma tabela que não está na 2FN é necessário realizar os seguintes passos:
Exemplo : a tabela abaixo contém duas colunas que formam uma chave primária: id_func e id_proj. Repare agora, por exemplo, na coluna nome_func. Essa coluna depende apenas de parte da chave primária, ou seja, ela depende apenas do Id_func. Da mesma forma que as colunas nome_proj e local_proj dependem apenas da coluna id_proj.
id_func | id_proj | horas_trabalhadas | nome_func | nome_proj | local_proj |
1 | A | 10 | Luis | Plan.Est. | RJ |
2 | B | 20 | Marta | Plano Neg. | SP |
1 | B | 15 | Luis | Plano Neg. | SP |
3 | Diego | 30 | Neide | Map. Processos | MG |
A tabela possui chave primária composta id_func e id_proj,
Temos portanto dois conjuntos de atributos não chave dependentes de parte da chave primária, são eles:
Portanto, criaremos mas duas tabelas, uma para cada conjunto de atributos não chaves não dependentes de toda a chave primária:
id_func | nome_func |
1 | Luis |
2 | Marta |
3 | Neide |
id_func | id_proj | horas_trabalhadas |
1 | A | 10 |
2 | B | 20 |
1 | B | 15 |
3 | C | 30 |
id_proj | nome_proj | local_proj |
A | Plan.Est. | RJ |
B | Plano Neg. | SP |
C | Map. Processos | MG |
Se uma tabela está na primeira e na segunda forma normal, mas ao analisarmos um registro encontramos um atributo não chave dependente de outro atributo não chave, precisamos corrigir a tabela para a terceira forma normal.
Aqui basicamente estaremos corrigindo a dependência funcional transitiva.
Em resumo, para adequar uma tabela que não está na 3FN é necessário realizar os seguintes passos:
Vejamos um exemplo. Na tabela abaixo, temos uma lista de funcionários e suas respectivas informações. A chave primária dessa tabela é a coluna id_func.
id_func | nome_func | sexo | id_dep | nome_dep | gerente_dep |
1 | Paula | F | 100 | Finanças | André |
2 | Rodrigo | M | 101 | RH | Bruna |
1 | Sandra | F | 102 | TI | Caio |
3 | Tiago | M | 101 | RH | Bruna |
Porém, existem atributos dessa tabela que não dependem da chave primária da tabela.
As colunas nome_dep e gerente_dep não são definidas pela chave primária (id_func), mas sim pelo atributo id_dep. Ou seja, temos atributos não chave (nome_dep e gerente_dep) dependendo exclusivamente de um outro atributo não chave (id_dep).
Criamos uma nova tabela Departamento, contendo os atributos não chave que não dependem da chave primária da tabela original + atributo não-chave da tabela original que serve para identificar os outros atributos não-chave.
id_dep | nome_dep | gerente_dep |
100 | Finanças | André |
101 | RH | Bruna |
102 | TI | Caio |
id_func | nome_func | sexo | id_dep |
1 | Paula | F | 100 |
2 | Rodrigo | M | 101 |
1 | Sandra | F | 102 |
3 | Tiago | M | 101 |
Desmembramos a nossa tabela original em duas. Na tabela original mantemos apenas a chave primária e os atributos não chave associados a ela e transformamo id_dep em chave estrangeira, para se conectar com a tabela nova criada, de Departamento.