2. Formas Normais
Dado um esquema de relação, precisamos decidir se ele é um bom projeto
ou se precisamos decompô-lo em relações menores. Tal decisão deve ser
conduzida por um entendimento de quais problemas (se houver) surgem a
partir do esquema corrente.
Para fornecer tal condução, diversas formas normais foram propostas. Se
um esquema de relação está em uma dessas formas normais, sabemos
que certos tipos de problemas não podem surgir.
2
3. Formas Normais
As Formas Normais são uma série de procedimentos aplicados em um
banco de dados para garantir que as suas tabelas estejam bem
estruturadas e não contenham nenhum tipo de anomalia, seja de inclusão,
modificação ou exclusão.
3
4. Normalização
Foi criado por Codd em 1972
Aplica uma série de testes sobre um esquema de relação para certificar se ele
satisfaz uma certa forma normal
Inicialmente, Codd propôs 3 formas normais: 1FN, 2FN e 3FN
4
5. Normalização
Posteriormente, Boyce e Codd definiram uma 3FN mais forte – a FNBC (Forma
Normal de Boyce-Codd)
Essas formas se baseiam na análise das dependências funcionais
Duas outras formas – a 4FN e 5FN – foram propostas, baseadas na análise de
dependências multivaloradas e dependências de junção
5
6. Normalização
Objetivo
Gerar um conjunto de esquemas de relações que permita:
Armazenar informações sem redundância desnecessária, e
Recuperar informações eficientemente.
6
7. Normalização
Em resumo…
Evita anomalias de atualização e redundâncias no projeto do BD
Permite representar eficientemente os dados do mundo real, tornando o
modelo mais estável e de fácil manutenção
7
8. Aplicar normalização até qual forma
normal?
Na prática o processo de normalização encerra-se na 3FN ou FNBC
8
9. 1ª Forma Normal (1FN)
Uma tabela está na 1FN quando:
Os domínios de todas as suas colunas são atômicos, ou seja, a tabela não
pode ter atributo composto ou multivalorado.
9
11. Atributo Composto:
Decompor o atributo composto em atributos simples e o colocá-lo:
Na mesma tabela (indicando quando o atributo composto é monovalorado).
Ex:
Paciente (CPF, Nome, Endereco(Logradouro, CEP)) (não está na 1FN)
Paciente (CPF, Nome, Logradouro, CEP) (está na 1FN)
11
Como transformar uma tabela para a 1FN
12. Atributo Composto:
Em uma tabela relacionada (indicado quando o atributo composto é
multivalorado). EX:
Paciente (CPF, Nome, {Telefone(DDD, Prefixo, Sufixo)}) (não está na 1FN)
Paciente (CPF, Nome) (está na 1FN)
PacienteTelefone (CPF, DDD, Prefixo, Sufixo) (está na 1FN)
CPF referencia Paciente
12
Como transformar uma tabela para a 1FN
13. Atributo Multivalorado:
Na mesma tabela (indicado quando a quantidade de valores é pequena
e conhecia a priori).
EX:
Paciente (CPF, Nome, {GrausDeLente}) (não está na 1FN)
Paciente (CPF, Nome, GrauLenteE, GrauLenteD) (está na 1FN)
13
Como transformar uma tabela para a 1FN
14. Atributo Multivalorado:
Em uma tabela relacionada (indicado quando a multivaloração é
desconhecida ou grande). EX:
Paciente (CPF, Nome, {ImagemRX}) (não está na 1FN)
Paciente (CPF, Nome) (está na 1FN)
PacienteRX (CPF, ImagemRX) (está na 1FN)
CPF referencia Paciente
14
Como transformar uma tabela para a 1FN
18. Segunda Forma Normal (2FN)
Uma tabela está na 2FN quando:
1. Está na 1FN,
2. A chave primária é composta e
3. Todas as colunas que não participam da chave primária são dependentes
de todas as colunas que compõem a chave primária.
Isto é, não existe Dependência Funcional Parcial.
18
20. 20
Como transformar para a 2FN?
1. Retira-se a(s) coluna(s) com DFP da tabela original
2. A partir dessa(s) coluna(s) retirada(s), cria-se uma ou mais tabelas
compostas pela parte da chave primária e suas colunas dependentes
3. A parte da chave primária que gerou a dependência será a nova chave
primária da tabela criada.
21. 21
Como transformar para a 2FN?
EX:
Consulta(CPF, CRM, NomeP, NomeM, Especialidade, Tipo, Valor) (não 2FN)
Paciente (CPF, NomeP) (está na 2FN)
Medico (CRM, NomeM, Especialidade) (está na 2FN)
Consulta (CPF, CRM, Tipo, Valor) (está na 2FN)
CPF referencia Paciente
CRM referencia Medico
25. 25
Exemplo
Aluno (NumAluno, NomeAluno, EnderecoAluno)
Disciplina(CodDisciplina, NomeDisciplina)
Boletim(NumAluno, CodDisciplina, NumeroProva, Nota, DataProva)
Agora está na 2FN!
26. 26
3ª Forma Normal (3FN)
Uma tabela está na 3FN quando:
1. Está na 2FN
2. Não contém Dependência Funcional Transitiva, sendo que todas as
colunas que não participam da chave primária devem ser exclusivamente
dependentes desta
28. 28
Como transformar para a 3FN?
1. Retira-se a(s) coluna(s) com DF Transitiva da tabela original
2. A partir dessa(s) coluna(s) retirada(s), cria-se uma ou mais tabelas
compostas pela coluna determinante (como chave primária) + suas
colunas dependentes
29. 29
Como transformar para a 3FN?
Verifica-se a 2FN para cada nova tabela.
Ex:
Consulta (CPF, CRM, Tipo, Valor) (não está na 3FN)
Consulta (CPF, CRM, Tipo) (está na 3FN)
Tipo referencia ConsultaTipo
ConsultaTipo (Tipo, Valor) (está na 3FN)
OBS: Além de não conter DFT, as tabelas na 3FN não devem possuir colunas
com valores calculados (derivados). Ex: coluna subtotal.
32. 32
Forma Normal Boyce-Codd (FNBC)
É um refinamento da 3FN (usada em casos particulares)
Uma relação em FNBC é uma forma mais rigorosa do que a 3FN
Uma relação em FNBC está de acordo com a 3FN, mas o contrário não é
verdade
33. 33
Forma Normal Boyce-Codd (FNBC)
Uma tabela está na FNBC quando:
1. Está na 3FN e
2. Todos os determinantes da tabela são chaves candidatas
35. 35
Como transformar para a FNBC
Como transformar uma tabela para a FNBC
1. Decompor a tabela (em duas ou mais), separando da tabela original as
colunas que são determinantes e não são chaves candidatas, e as colunas
dependentes destes determinantes
2. O determinante que não é chave candidata na tabela original deve fazer
parte das chaves primárias das novas tabelas
3. Verifica-se a 3FN para cada nova tabela.
36. 36
Como transformar para a FNBC
Exemplo: Avaliação (Aluno, Disciplina, Professor, Media) (está 3FN, não FNBC)
Supondo que cada aluno tem um único professor por disciplina,
Cada professor só ensina uma única disciplina e
Uma disciplina pode ser ministrada por vários professores
37. 37
Como transformar para a FNBC
Dependências Funcionais:
Aluno, Disciplina → Professor, Media
Aluno, Professor → Disciplina, Media
Professor → Disciplina (Professor é determinante e não é chave candidata)
Então:
ProfDisciplina (Professor, Disciplina) (está na FNBC)
ProfAluno (Professor, Aluno, Media) (está na FNBC)
41. Exemplo 1
vendedor (nro_vend, nome_vend, sexo_vend,{ cliente (nro_cli, nome_cli, end_cli ) } )
As seguintes dependências funcionais devem ser garantidas na normalização:
• nro_vend → nome_vend, sexo_vend
• nro_cli → nome_cli, end_cli
Observação adicional:
• um vendedor pode atender diversos clientes, e um cliente pode ser atendido
por diversos vendedores
41
42. Exemplo 1 - Resposta
Vendedor (nro_vend, nome_vend, sexo_vend,{ cliente (nro_cli, nome_cli, end_cli ) } )
1FN
Cliente(nro_cli, nome_cli, end_cli)
Vendedor(nro_vend, nome_vend, sexo_vend)
2FN OK (não há dependência parcial)
3FN OK (não há dependencia transitiva)
Relação N:N => Clliente_Vendedor(nro_cli, nro_vend)
42
44. Exemplo 2 - Resposta
Pedidos(nr_pedido, data_pedido, id_cliente, nome_cliente, {produto(cod_prod,
nome_prod, quant, vl_unit)})
1FN
Produto(cod_prod, nome_prod, quant, vl_unit)
Pedidos(nr_pedido, data_pedido, id_cliente, nome_cliente)
2FN - OK (não há dependência parcial pois a chave primária não é composta)
44
45. Exemplo 2 - Resposta
1FN
Produto(cod_prod, nome_prod, quant, vl_unit)
Pedidos(nr_pedido, data_pedido, id_cliente, nome_cliente)
2FN - OK (não há dependência parcial pois a chave primária não é composta)
3FN - há dependência transitiva de nome_cliente para id_cliente
Produto(cod_prod, nome_prod, quant, vl_unit)
Pedidos(nr_pedido, data_pedido, id_cliente)
id_cliente referencia Cliente
Cliente(id_cliente, nome_cliente) 45
46. Exemplo 3
VENDA_CARRO (Num_carro, Data_venda, Num_vendedor, Comissao_porc,
Desconto_tempo)
Suponha que um carro possa ser vendido por vários vendedores e, portanto,
(Num_carro, Num_vendedor) é a chave primária. Dependências adicionais são
Data_venda → Desconto_tempo e Num_vendedor → Comissao_porc
Com base na chave primária dada, essa relação está na 1FN, 2FN ou 3FN?
Normalize-a até a 3FN.
46
47. Exemplo 3 - Resposta
VENDA_CARRO (Num_carro, Data_venda, Num_vendedor, Comissao_porc,
Desconto_tempo)
1FN OK (os atributos são atômicos)
2FN há dependência parcial de Comissão_porc para NumVendedor
Vendedor(NumVendedor, Comissao_porc)
VendaCarro(NumCarro, Data_Venda, Desconto_tempo)
47
48. Exemplo 3 - Resposta
1FN OK (os atributos são atômicos)
2FN há dependência parcial de Comissão_porc para NumVendedor
Vendedor(NumVendedor, Comissao_porc)
VendaCarro(NumCarro, Data_Venda, Desconto_tempo)
48
49. Exemplo 3 - Resposta
3FN há dependência transitiva de Desconto_tempo para Data_Venda
Vendedor(NumVendedor, Comissao_porc)
VendaCarro(NumCarro, Data_Venda)
Data_Venda referencia Desconto
Desconto(Data_Venda, Desconto_tempo)
49
50. Bibliografia
Elmasri, R. Navathe, S. B., Sistemas de Banco de Dados, 6ª Ed. Pearson
Addison-Wesley, 2011.
C. J. Date. Introdução a sistemas de banco de dados. tradução de Daniel
Vieira. 8ª Ed. Rio de Janeiro: Elsevier, 2003.
50