.1. Normalização
Apresentada pelo Codd em 1971, é um processo para se obter bons projetos lógicos baseados no Modelo Relacional por meio da otimização de redundâncias e eliminação de anomalias.
Normalização, logicamente, está na definição do Projeto Lógico.
Em 71 o Codd apresenta a primeira, segunda, a terceira forma normal, juntamente a terceira corrigida (1FN, 2FN, 3FN, 3FNC) e finalmente, apresenta a 4FN (quarta forma normal).
Anomalias:
| $\underline{Nro_cli}$ | Nome_cli | End_cli | Nro_Prod. | Nome_prod | Preco_prod | qtd_prod |
|---|---|---|---|---|---|---|
| 123 | Joao | XXX | 1 | ABCD | 50,00 | 10 |
| 135 | Pedro | yyy | 1 | ABCD | 80,00 | 15 |
| 143 | Joao | zzz | 2 | FGHI | 20,00 | 5 |
| ? | ? | ? | 3 | JLM | 35,00 | ? |
Inclusão: Valores Nulos não devem ser incluídos na tabela, se possível.
Exclusão: Não se pode excluir dados associados.
Atualizações: Propagação de esforços para atualização.
O processo de normalização evita este tipo de erros, de maneira contundente.
As definições a seguir são requeridas para o processo de normalização:
Dependência Funcional
Seja R (A, B, C), diz-se que B é funcionalmente dependente de A se, para um valor do atribuo A, determina-se um único valor para B. Notação: $A\rightarrowtail B$
obs: R é uma relação e A, B e C são seus atributos.
![[Pasted image 20250506144910.png]]
Não é: $A \nrightarrow B$
Dependência Funcional Transitiva
A dep. funcional transitiva se dá quando: se $A \rightarrowtail B$ e $B \rightarrowtail C$, então, $A \rightarrowtail C$
Chaves
A é Superchave em R se:
- Todos os demais atributos de R são funcionalmente dependentes de A.
A é Chave Candidata em R se:
- Não existe nenhum subconjunto próprio de A que seja uma Superchave de R.
Chave primária é a chave candidata eleita pelo projetista de banco de dados.
![[Pasted image 20250506151440.png]]
Os Atributos definidos como atributos não chave, são os atributos que não estão na chave primária.
Teoria da normalização
Primeira Forma Normal
Quando você faz o processo de normalização, deve-se demonstrar as dependências funcionais e chaves possíveis.
R está na 1FN se:
- R tem chave primária
- Em R, todos os atributos são mono valorados.
ex: cliente(nome, {fone}) -> não está na primeira forma normal. devemos tirar o atributo multi valorado.
[!tip] A normalização só é eficaz a partir da 4° forma.
Colocando na 1FN
cliente1($\underline{nome}$, $\underline{fone}$) nome $\rightarrowtail fone$ chave primária é $(nome, \ fone)$ o par e, portanto, fone não é mais multi valorado.
2° Forma Normal
Seja R (A, B, C). R está na 2° Forma Normal se:
- R está na 1° Forma Normal; e
- todos os atributos de R não chave são funcionalmente dependentes de toda a chave primária e não apenas parte dela.
empregado.Maquina($\underline{\text{Nro_empr}}$, $\text{nome_empregado}$, $\underline{nro_maquina_alocada}$, $data_alocacao$)
Não esta na segunda forma normal pois: $\text{Nro_Empr}\rightarrowtail \text{nome_empr}$
Entretanto, vemos que a data esta corretamente dependente completamente da chave por completo. $\text{Nro_empr} , \ \text{nro_maq_alocada} \rightarrowtail \text{data_alocação}$
Colocando na 2° forma normal
Procedimento:
- Identificar todas as dependências funcionais de atributos não chave de parte da chave primária;
- Remover da relação os atributos que participam da dependência funcional citada acima e criar uma nova relação contendo-os. A chave primária desta nova relação será o atributo de que os atributos são funcionalmente dependentes.
No exemplo acima: $\text{Nro_Empr}\rightarrowtail \text{nome_empr}$ -> $\text{empregado}(\underline{Nro_Empregado}, Nome_empregado)$ $\text{empregado_Maquina_2}(\underline{Nro_Empregado}, \ \underline{Nro_Máquina},\ data_alocação)$
sem mostrar as dependências funcionais ao longo do processo, você não pode quebrar a relação.
3° Forma Normal
R está na 3°. Forma Normal se:
- R está na 2°. Forma Normal e
- Não existe dependência funcional transitiva em R
gerente.conta($\underline{nro_cli}$, nome_cli, num_gerente_cta, nome_gerente_conta)
Transitiva:
nro_cli $\rightarrowtail$ num_gerente_cta $\rightarrowtail$ nome_gerente_conta
Colocando na 3FN:
• Identificar todos os atributos não chave que são funcionalmente dependentes de outros não chave. • Criar nova relação que contenha os atributos não chave e que contemplam a dependência funcional acima. • Definir a chave primária desta nova relação com o atributo que os outros não chave são funcionalmente dependentes. Uma cópia deste atributo que agora compõe a chave primária desta nova relação deve ficar na relação de onde originou-se.
gerente.conta($\underline{nro_cli}$, nome_cli, num_gerente_cta, nome_gerente_conta) ->
gerente.conta.2($\underline{nro_cli}$, nome_cli, num_gerente_cta) gerente($\underline{num_gerente_cta}$, nome_gerente_conta)
3° Forma Normal de Boyce-Codd
Considere R uma relação e seus atributos $A, B \ \text{e} \ C$. $R ( A, B, C )$
R está na 3a. Forma Normal de BC se: • R está na 2a. Forma Normal; e • A unica dependência funcional transitiva permitida é a que envolve chaves candidatas
ex: cliente($\underline{RG}$, CPF, nome_cli) RG -> CPF -> NOME_CLI, RG->CPF e RG-> NOME_CLI. Então, esta é permitida pela 3FNBC, pois CPF é chave candidata.
Dependência Funcional Multivalorada
cliente_vendedor($nro_vend$, {$nro_cliete$}, {$nome_filho_vendedor$}) esse simbolo {} encapsula um atributo multivalorada.
Primeira Forma normal -> não pode haver att multivalorado. Porém, haverá um erro.
Percebemos então, uma dep. func. multivalorada.
Há uma dependência multivalorada de B com A se a um valor de A está associada uma coleção de valores para B, independentemente de qualquer valor de C. Notação: A -» B ![[Pasted image 20250513152234.png]]
4a. Forma Normal
Considere R uma relação e seus atributos A, B e C. R ( A, B, C )
R está na 4a. Forma Normal se: • Está na 3FNBC e • Não possui dependência funcional multivalorada.
Procedimento
• Identificar as dependências funcionais multivaloradas. • Criar uma nova relação que contenha cada dependência funcional multivalorada. • Definir como a chave primária desta nova relação o atributo determinante da dependência multivalorada.
exemplo: vendedor($nro_vend$, {$nro_cliete$}, {$nome_filho_vendedor$}) $nro_vend$ {$nro_cliete$} {$nome_filho_vendedor$}
- vemos que nome filho vendedor, mesmo que nro_cliente se altera, apenas muda de acordo com nro_vend. O mesmo vale para nro_cliente ->-> nro_vend, que é multivalorado por nro_vend e independe de nome_filho_vendedor. Portanto:
- cliente_vendedor($nro_vend$, {$nro_cliete$})
- filho_vendedor($nro_vend$, {$nome_filho_vendedor$})
- passando para 1FN
- cliente_vendedor_2($\underline{nro_vend}$, $\underline{nro_cliete}$)
- filho_vendedor_2($\underline{nro_vend}$, $\underline{nome_filho_vendedor}$)
Ordem de Execução
O processo de normalização deve iniciar-se pela verificação das dependencias funcionais multivaloradas. Após absorvê-las em novas relações, então aplica-se o processo de normalização de 1FN a 3FNBC.

