1. Projeto de Banco de Dados Relacional
Dependências Funcionais
Normalização
2. Projeto de Banco de Dados Relacional
Uma vez que sabemos com quais dados nossa aplicação precisa lidar, como saber quais relações, atributos e relacionamentos devemos criar para obter um banco de dados com o menor número possível de redundâncias, e cujo uso também seja o mais eficiente possível.
Em geral, o objetivo do projeto de banco de dados relacional é gerar um conjunto de esquemas relacionais que nos permitam armazenar informações sem redundância desnecessária e ainda obtendo informações facilmente.
3. Normalização
São validações matemáticas dos atributos de uma tabela com base nos seus relacionamentos
Conceito de Dependência Funcional entre os atributos
Tem por objetivo principal resolver problemas de atualização de bases de dados, minimizando redundâncias.
Toda redundância leva a uma inconsistência
As principais características de uma base de dados normalizada são:
Geração de aplicações mais estáveis (e por isso também mais alteráveis);
Aumento do número de tabelas utilizadas;
Diminuição dos tamanhos médios das tabelas.
4. Normalização
O processo de normalização ocorre em etapas sucessivas (1FN, 2FN, 3FN, ...).
Cada etapa corresponde a uma forma normal que representa um progressivo refinamento na estrutura das tabelas
Atualmente, os teóricos da modelagem de dados consideram a existência de inúmeras formas normais, mas geralmente basta que uma tabela atenda às três primeiras etapas que possa ser considerada como normalizada.
Cada Forma Normal sempre introduz restrições adicionais a serem aplicadas a relações que já estão em uma determinada Forma Normal
Primeira Forma Normal
Segunda Forma Normal
Terceira Forma Normal
5. Dependência Funcional
Conceito de Dependência Funcional
Seja x e y dois atributos de uma relação R. y é dependente funcionalmente de x (x y, lê-se “x determina y”) se, e somente se, cada valor x em R for associado a um valor y em R.
Isto é, dadas duas tuplas quaisquer da tabela t1 e t2, onde t1[x] = t2[x], então t1[y] = t2[y]
Se existe algum atributo na tabela que nunca repete seu valor, então este atributo determina todos os outros
Exemplos
cpf nome, data_nascimento
DDD UF
UF, cidade DDD
Fornece a base das 3 primeiras formas normais
6. Fecho de Dependências Funcionais
Representa o conjunto de todas as dependências funcionais válidas para uma determinada tabela
Exemplo, dada a tabela T
Fecho de T = {A C, D B, AD BC, AB CD}
Regras para facilitar a determinação do fecho
Reflexividade: Se é um conjunto de atributos e , então vale . Também chamada de Dependência Funcional Trivial
Aumentação: Se vale e é um conjunto de atributos, então também vale.
Transitividade: Se valem , e , então também vale.
União: Se valem e , então também vale.
Decomposição: Se vale , então valem e .
Pseudotransitividade: Se valem , e , então vale
A
B
C
D
a1
b1
c1
d1
a1
b2
c1
d2
a2
b2
c2
d2
a2
b3
c2
d3
a3
b3
c2
d4
7. Dependência Funcional Total
Se o atributo y depende funcionalmente do conjunto x de atributos, mas não depende funcionalmente de qualquer subconjunto x’ de x (isto é, x’ x), então y é totalmente dependente de x.
O conjunto x é chamado também de determinante funcional de y.
Exemplo
estado, cidade DDD
DDD é totalmente dependente de estado e cidade, pois estado sozinho não determina DDD, assim como cidade
8. Primeira Forma Normal
Uma relação está na Primeira Forma Normal se, e apenas se, todos os domínios contiverem apenas valores atômicos.
Exemplo
Tabela inicial não normalizada:
Solicitações (numsolicitacao, data, codfunc, nomefunc, matsol = (codprod, descr, qtd))
Material solicitado (matsol) é um atributo multivalorado
Outros exemplos de atributos multivalorados
Endereços, telefones, etc.
Armazém X
Solicitação de Material Número: 2199
Código do Funcionário: 357
Data: 27/10/2000
Nome do Funcionário: João da Silva
Cód. Produto
Descrição
Quantidade
1023
Joelho Tigre
2
1056
Luva Tigre
4
1011
Torneira Tigre
1
9. Colocando a tabela na primeira forma normal
Para tornar uma relação não-normalizada em uma relação normalizada deve-se decompor a tabela não normalizada.
Ou seja para cada tabela aninhada criar uma nova tabela.
Esta nova tabela irá conter os atributos da tabela aninhada e o(s) atributo(s) que compõe a chave primária da(s) tabela(s) na(s) qual(is) a tabela está aninhada
Nosso exemplo, 1FN:
Solicitações (numsolicitacao, data, codfunc, nomefunc)
SolicitaçõesItens (numsolicitacao, codprod, descr, qtd)
10. Segunda Forma Normal
Uma relação está na Segunda Forma Normal se, e apenas se, estiver na 1FN, e cada atributo não-chave for totalmente dependente da chave primária
Para chegar a 2FN deve-se:
1) Verificar se existem colunas não-chave parcialmente dependentes de algum dos atributos da chave. Esta verificação é feita apenas em tabelas que tem a sua chave primária composta por mais de um atributo.
2) Se existir um atributo b que dependa apenas parcialmente da chave primária x, isto é x’ b, onde x’ x:
2.1) Criar tabela (se não existe ainda) cuja chave primária será x’;
2.2) Mover da tabela original para a tabela criada o atributo b.
11. Colocando as tabelas na segunda forma normal
Para o nosso exemplo de solicitação de materiais, tínhamos:
codprod descrição (isto é, a descrição de um produto só depende de seu código), mas
{numsolicitacao, codprod } qtd (a quantidade depende da solicitação E do produto)
1FN:
Solicitações (numsolicitacao, data, codfunc, nomefunc)
SolicitaçõesItens (numsolicitacao, codprod, descricao, qtd)
2FN:
Solicitações (numsolicitacao, data, codfunc, nomefunc)
SolicitaçõesItens (numsolicitacao, codprod, qtd)
Produtos (codprod, descricao)
12. Terceira Forma Normal
Exige a eliminação de dependências transitivas, nome dado à situação em que um atributo y, que depende totalmente da chave primaria, é por sua vez determinante de outro atributo z da relação. Isto é, x y z.
Uma relação está na Terceira Forma Normal se, e apenas se, estiver na 2FN, e não tiver dependências transitivas.
Para chegar na 3FN deve-se:
1) Verificar se existem colunas não-chave dependentes de algum(ns) outro(s) atributo(s) não-chave. Esta verificação é feita apenas em tabelas que possuírem pelo menos 2 atributos não-chave.
2) Se existir um atributo Z que dependa de outro(s) atributo(s) não-chave Y:
2.1) Criar tabela (se não existe ainda) cuja chave primária será Y;
2.2) Mover da tabela original para a tabela criada o atributo Z
13. Colocando as tabelas na terceira forma normal
Para o nosso exemplo de solicitações de materiais, tínhamos na relação Solicitações uma dependência transitiva:
numsolicitacao codfunc nomefunc
1FN:
Solicitações (numsolicitacao, data, codfunc, nomefunc)
SolicitaçõesItens (numsolicitacao, codprod, descricao, qtd)
2FN:
Solicitações (numsolicitacao, data, codfunc, nomefunc)
SolicitaçõesItens (numsolicitacao, codprod, qtd)
Produtos (codprod, descricao)
3FN:
Solicitações (numsolicitacao, data, codfunc)
Funcionários (codfunc, nomefunc)
SolicitaçõesItens (numsolicitacao, codprod, qtd)
Produtos (codprod, descricao)