Você está na página 1de 7

BANCO DE DADOS

Profa. Gisele Busichia Baioco


gisele@ft.unicamp.br

Normalização e Dependência Funcional

1 Introdução
O controle de consistência de uma BD pode ser realizado:
- pelo SGBD;
- pelos Aplicativos;
- pela própria construção do sistema.

O controle de consistência obtido pela própria construção do sistema é, em geral, o


melhor, pois não incorre em perda de eficiência durante a execução.
O MRel, devido a sua natureza formal, permite modelar de diversas formas o controle
de consistência. Assim, o controle através da própria construção do sistema é obtido no MRel
construindo-se as relações segundo regras que garantem a manutenção de certas propriedades.
As relações que atendem a um determinado conjunto de regras diz-se estarem normalizadas
em uma determinada forma normal.
A maior parte da teoria de normalização foi baseada no conceito de dependência
funcional.

2 Dependência Funcional
Uma dependência funcional é uma restrição entre dois conjuntos de atributos de uma
relação da BD.
Suponha-se o esquema de relação R = { A1, A2, ..., An }. Uma dependência funcional,
denotada por X→Y, entre dois conjuntos de atributos X e Y que são subconjuntos de R,
especifica uma restrição sobre as possíveis tuplas que podem existir na relação instância r de
R. A restrição estabelece que para quaisquer tuplas t1 e t2 em r:

se t1(X) = t2(X), então t1(Y) = t2(Y).

Isso significa que os valores de Y de uma tupla em r dependem de, ou são


determinados pelos, valores de X, ou alternativamente, os valores de X de uma tupla
determinam de maneira única (ou funcionalmente) os valores de Y. Logo, pode-se dizer que
existe uma dependência funcional de X para Y ou que Y é dependente funcionalmente de
X.
Pode-se notar que:
- Se uma restrição sobre R estabelece que não pode existir mais que uma tupla com
um dado valor de X, em quaisquer instâncias de relação r(R), isto é, X é uma chave
candidata de R, implica que X→Y para quaisquer subconjuntos de atributos Y de
R;
- Se X→Y em R, não significa que Y→X em R.

1
Uma dependência funcional é uma propriedade do significado ou semântica dos
atributos em um esquema de relação R. Utiliza-se o entendimento da semântica de atributos
de R, isto é, como eles se relacionam, para especificar as dependências funcionais envolvidas
em todas as instâncias r da relação R. Assim, a principal utilização das dependências
funcionais é o de descrever um esquema de relação R especificando restrições sobre seus
atributos que devem ser válidas sempre.
Por exemplo, de acordo com a o esquema da relação Emp_Proj :

Emp_Proj = {nr_segsoc, nr_proj, horas, nm_empr, nm_proj, local_proj}

As dependências funcionais existem nos seguintes atributos :


a) nr_segsoc → nm_empr
b) nr_proj → nm_proj, local_proj
c) nr_segsoc, nr_proj → horas

Essas dependências funcionais especificam que, por exemplo:


- em a) o valor do número do seguro social do empregado determina unicamente o
nome do empregado. Alternativamente, dizemos que o nome do empregado é
determinado funcionalmente (ou funcionalmente dependente) do número do
seguro social ou que dado um valor do número do seguro social, determina-se o
nome do empregado;
- em b) o número do projeto determina unicamente o nome do projeto e a
localização;
- em c) a combinação do número do seguro social e do projeto determina
unicamente o número de horas que o empregado trabalha no projeto.

Vale ressaltar que uma dependência funcional é uma propriedade do esquema da


relação R e não de uma instância particular r de R. Assim, uma dependência funcional não
pode ser automaticamente inferida a partir de uma instância de relação r, mas deve ser
definida por alguém que conheça a semântica dos atributos de R. Por exemplo, considerando
a relação Ensino e a instância r(Ensino) seguinte:

Ensino = {professor, curso, texto}


r(Ensino) = {<Rogério, Estrutura de Dados, Texto1>,
<Paulo, Gerenciamento Dados, Texto2>,
<Roberto, Compiladores, Texto3>,
<Mauro, Estrutura de Dados, Texto4>}

A primeira vista, pode-se dizer que texto → curso, porém não é possível confirmar
isso, a menos que se saiba que isso seja verdade para todas as instâncias de Ensino. Por outro
lado, é suficiente para demonstrar um contra-exemplo para refutar uma dependência
funcional. Por exemplo: Estrutura de Dados é ensinada por Rogério e por Mauro, então pode-
se concluir que professor não depende funcionalmente de curso.
Dada uma instância de uma relação é possível verificar se dois conjuntos de atributos
quaisquer atendem a uma dependência funcional. Por exemplo: Considerando o esquema de
relação Alunos e a instância r(Alunos):

2
Alunos = {nome, curso, idade}
r(Alunos) = {<Mario, comput, 21>,
<Paulo, elétrica, 22>,
<Mauro, física, 22>,
<Ricardo, comput, 21>,
<Adriana, elétrica, 22>}

nome → curso, idade


Sim, pois sempre que nome se repete, curso e idade se repetem também.

idade → curso
Não, pois tem-se:
21 => comput
22 => elétrica
22 => física

curso → idade
Sim, pois :
comput => 21
elétrica => 22
física => 22

Para controlar consistência é necessário conhecer todas as dependências funcionais.


Sendo uma informação semântica, todas deveriam ser fornecidas pelo projetista. No entanto, é
possível inferir-se dependências funcionais a partir de outras já conhecidas. A partir de um
conjunto básico, é possível ampliar esse conjunto por meio de 6 regras de inferência. Note-se
que não se pode inferir todas as dependências funcionais, mas apenas aquelas que podem ser
obtidas através desse conjunto de regras. Assim, elaborar um conjunto inicial o mais completo
possível é de importância fundamental para se controlar consistência adequadamente.
As regras de inferência são as seguintes:

 Reflexiva
Se A B  B→ A
 Aumentativa
Se A → B  AC → B
 Separação
Se A → BC  A → B, A → C
 Aditiva
Se A → B, A → C  A → BC
 Transitiva
Se A → B, B → C  A → C
 Pseudo-transitiva
Se A → B, BC → D  AC → D

3
3 Normalização
O processo de normalização permite ao projetista controlar quanto de consistência é
garantida pela maneira de construção do sistema e quanto deve ser de responsabilidade dos
aplicativos e/ou do SGBD.
Normalizar demais diminui a eficiência dos aplicativos e de menos abre caminhos para
inconsistências.

1a. Forma Normal (1FN)


Uma relação está na 1a. Forma Normal quando todos os seus atributos são atômicos e
monovalorados.
Atributo atômico: é um atributo que não é tratado em partes separadas.
Atributo monovalorado: não pode ter mais que um valor.
Exemplo:
Pessoa = {RG, nome, endereço, telefone}
- o atributo endereço será atômico se não puder ser utilizado em partes separadas
tais como, rua, número, bairro, cep;
- o atributo telefone será monovalorado se não for permitido ter mais que um
número de telefone cadastrado.

Como normalizar relações para a 1a. Forma Normal?

Atributos não atômicos da relação são “quebrados” em seus atributos componentes.


Por exemplo:
Pessoa = {RG, nome, endereço, telefone}
Se o atributo endereço não for atômico, deve-se fazer:
Pessoa = {RG, nome, rua número, bairro, cep, telefone}

Atributos multivalorados podem ser tratados de duas maneiras:


 a quantidade de valores é pequena e conhecida a priori.
Nesse caso, substitui-se o atributo multivalorado por um conjunto de atributos de
mesmo domínio, cada um monovalorado representando uma ocorrência do valor. Por
exemplo:
Paciente = {nome, graus_das_lentes, tipo_sanguíneo}
Considerando que o atributo graus_das_lentes é multivalorado, deve-se fazer:
Paciente = {nome, grau_esquerdo, grau_direito, tipo_sanguíneo}

 a quantidade de valores é muito variável, desconhecida ou grande.


Nesse caso, retira-se o atributo multivalorado e cria-se uma nova relação que tem o
mesmo conjunto de atributos chave, mais o atributo multivalorado também como chave, mas
tomado como monovalorado. Por exemplo:
Aluno = {nome, idade, disciplinas, nusp}
Considerando que o atributo disciplinas é multivalorado, deve-se fazer:
Aluno = {nome, idade, nusp}
Disciplina = {nome, disciplina}

A 1a. Forma Normal é uma das maneiras de controlar consistência. As formas normais
seguintes estão relacionadas ao conceito de dependência funcional e também permitem o
controle da consistência.

4
2a. Forma Normal (2FN)
Uma relação está na 2a. Forma Normal se :
• está na 1a. Forma Normal;
• todos os atributos que não participam da chave primária são dependentes de toda a
chave primária.
Exemplo:
Ministra = {professor, sigla, livro}
Turma = {número, sigla, sala, num_créditos}

Dependências funcionais:
Ministra:
professor → sigla
sigla → livro

Turma:
número, sigla → sala
sigla → num_créditos

Logo, a relação Ministra está na 2a. Forma Normal, pois os atributos sigla e livro
dependem de professor, o que não ocorre na relação Turma, pois num_créditos não depende
da chave primária inteira, mas apenas de sigla.

Como normalizar relações para a 2a. Forma Normal?

 verifica-se os grupos de atributos que dependem da mesma parte da chave;


 retira-se da relação todos os atributos de um desses grupos;
 cria-se uma nova relação, que tem esse grupo como atributos não chave, e os
atributos que determinam esse grupo como chave;
 repete-se o procedimento para cada grupo, até que a relação toda somente contenha
atributos que dependem da chave toda.

Exemplo :
Turma = {número, sigla, sala, num_creditos}

Dependências funcionais:
número, sigla → sala
sigla → num_creditos

sigla - grupo de atributos que faz parte da chave e determina o outro grupo;
num_creditos - grupo de atributos que depende de parte da chave.

Transforma-se em:

Turma = {número, sigla, sala}


Disciplina = {sigla, num_creditos}

Observação: Na maioria dos casos a normalização é baseada na decomposição de


relações.

5
A 2a. Forma Normal evita:
- inconsistência devido à duplicidade de informações;
- perda de dados em operações de remoção/alteração na relação.

Exemplo:
Turma = {sigla, número, sala, num_créditos}
r(Turma) = {<COM122, 1, 10, 2>,
<COM122, 2, 14, 2>,
<COM189, 1, 8, 3>,
<COM189, 2, 15, 4>,
<COM134, 1, 16, 2>}

Dependências funcionais:
sigla, número → sala
sigla → num_créditos

Observa-se que:
- pode ter inconsistência pois uma mesma disciplina (mesma sigla) pode ter número de
créditos diferentes (no exemplo a sigla COM189);
- se não houver uma turma da disciplina em um semestre, há perda da informação de
quantos créditos tem essa disciplina!
Logo, deve-se ter:

Turma = {sigla, número, sala}


r(Turma) = {<COM122, 1, 10>,
<COM122, 2, 14>,
<COM189, 1, 8>,
<COM189, 2, 15>,
<COM134, 1, 16>)

Disciplina = {sigla, num_créditos}


r(Disciplina) = {<COM122, 2>,
<COM189, 3>,
<COM134, 2>}

3a. Forma Normal (3FN)


Uma relação está na 3a. Forma Normal quando:
• está na 2a. Forma Normal;
• todos os atributos que não participam da chave primária são dependentes não
transitivos de toda a chave primária.

Exemplos :
Ministra = {professor, sigla, livro}
Turma = {número, sigla, sala}

Dependências funcionais:
Ministra:
professor → sigla
sigla → livro

6
Turma:
número, sigla → sala

A relação Turma está na 3a. Forma Normal, porém isso não ocorre com a relação
Ministra, já que nem todos os seus atributos dependem diretamente da chave primária, mas
sim transitivamente.

Como normalizar relações para a 3a. Forma Normal?

 verifica-se um grupo de atributos que não depende diretamente da chave;


 retira-se da relação esse grupo de atributos;
 cria-se uma nova relação que contém esse grupo de atributos, e inclui-se como
chave os atributos dos quais esse grupo depende diretamente;
 repetem-se esses passos até que todos os atributos restantes na relação original
dependam diretamente de toda sua chave.

Exemplo:
Turma = {número, sigla, sala, prédio}

Dependências funcionais:
número, sigla → sala
sala → prédio

Normalizando para a 3a. Forma Normal fica:


Turma = {número, sigla, sala}
Salas = {sala, prédio}

Você também pode gostar