Dotstore
Canais iMasters

Banco de Dados + SQL Server + PostgreSQL + MySQL + Oracle + UML

Modelagem de Dados - Final (Normalização)

Caros leitores. Estou de volta com a última parte desta série, onde falarei sobre Normalização.

Normalização é um processo baseado nas chamadas formais normais. Uma forma normal é uma regra de deve ser aplicada na construção das tabelas do banco de dados para que estas fiquem bem projetadas. Segundo autores, existem 4 formas normais. Neste artigo vou falar sobre as 3 primeiras, sendo as principais.

Com o banco de dados construído, devem-se aplicar as 3 formas normais em cada tabela, ou grupo de tabelas relacionadas. As formas têm uma ordem e são dependentes, isto é, para se aplicar a segunda norma, deve-se obrigatoriamente ter aplicado a primeira e assim por diante.

Então, vamos às normas:

1 Forma Normal: Verificação de Tabelas Aninhadas.

Para uma tabela estar na primeira forma normal ela não deve conter tabelas aninhadas. Um jeito fácil de verificar esta norma é fazer uma leitura dos campos das tabelas fazendo a pergunta: Este campo depende de qual?.

Vamos exemplificar, com a tabela Venda. Este é o esquema relacional da tabela:

Venda(Codvenda, Cliente, Endereco, Cep, Cidade, Estado, Telefone, Produto, Quantidade, Valorunitario, Valorfinal).

O raciocínio é o seguinte: A tabela Venda, deve armazenar informações da venda. Pois bem, verificando o campo Cliente, sabemos que ele depende de CodVenda, afinal para cada Venda há um cliente. Vendo o campo Endereço, podemos concluir que ele não depende de Codvenda, e sim de Cliente, pois é uma informação referente particularmente ao cliente. Não existe um endereço de venda, existe sim um endereço do cliente para qual se fez a venda. Nisso podemos ver uma tabela aninhada. Os campos entre colchetes, são referentes ao cliente e não á venda.

Venda (Codvenda, [Cliente, Endereço, Cep, Cidade, Estado, Telefone, Produto, Quantidade, Valorunitario, Valorfinal).

A solução é extrair estes campos para uma nova tabela, adicionar uma chave-primária à nova tabela e relaciona-la com a tabela Venda criando uma chave-estrangeira.

Ficaria desta forma:

Cliente (Codcliente, Nome, Endereço, Cep, Cidade, Estado, Telefone).

Venda (Codvenda, Codcliente, Produto, Quantidade, Valorunitario, Valorfinal).

Agora aplicamos novamente á primeira forma normal as 2 tabelas geradas. Uma situação comum em tabelas de cadastro é o caso Cidade-Estado. Analisando friamente pela forma normal, o Estado na tabela Cliente, depende de Cidade. No entanto Cidade, também depende de Estado, pois no caso de a cidade ser Curitiba o estado sempre deverá ser Paraná, porém se o Estado for Paraná, a cidade também poderá ser Londrina. Isso é o que chamamos de Dependência funcional: é onde aparentemente, uma informação depende da outra. No caso Cidade-Estado a solução é simples:

Extraímos Cidade e Estado, de Cliente e geramos uma nova tabela. Em seguida, o mesmo processo feito anteriormente: adicionar uma chave-primária à nova tabela e relaciona-la criando uma chave-estrangeira na antiga tabela.

Cidade (Codcidade, Nome, Estado).

Cliente (Codcliente, Codcidade, Nome, Endereço, Cep, Telefone).

Venda (Codvenda, Codcliente, Codcidade, Produto, Quantidade, Valorunitario, Valorfinal).

Seguindo com o exemplo, a tabela Cliente encontra-se na 1 forma normal, pois não há mais tabelas aninhadas. Verificando Venda, podemos enxergar mais uma tabela aninhada. Os campos entre colchetes são referente á mesma coisa: Produto de Venda

Venda (Codvenda, Codcliente, Codcidade, [Produto Quantidade, [Valorunitario, Valorfinal).

Na maioria das situações, produtos têm um valor previamente especificado. O Valorunitário depende de Produto. Já a Quantidade (campo entre Produto e Valorunitario) não depende do produto e sim da Venda.

Cidade (Codcidade, Nome, Estado).

Cliente (Codcliente, Codcidade, Nome, Endereço, Cep, Telefone).

Produto (Codproduto, Nome, Valorunitario).

Venda (Codvenda, Codcliente, Codcidade, Codproduto, Quantidade, Valorfinal).

Passando a tabela Venda pela primeira forma normal, obtivemos 3 tabelas. Vamos á próxima forma

2 Forma Normal: Verificação de Dependências Parciais

Para uma tabela estar na segunda formal, além de estar na primeira forma ela não deve conter dependências parciais. Um jeito de verificar esta norma é refazer a leitura dos campos fazendo a pergunta: Este campo depende de toda a chave? Se não, temos uma dependência parcial..

Vimos antes o caso Cidade-Estado que gerava uma dependência funcional. É preciso entender este conceito para que você entenda o que é Dependência Parcial.

Após a normalização da tabela Venda, acabamos com uma chave composta de 4 campos:

Venda (Codvenda, Codcliente, Codcidade, Codproduto, Quantidade, Valorfinal).

A questão agora é verificar se cada campo não-chave depende destas 4 chaves. O raciocínio seria assim:

  1. O primeiro campo não-chave é Quantidade.
  2. Quantidade depende de Codvenda, pois para cada venda há uma quantidade específica de itens.
  3. Quantidade depende de Codvenda e Codcliente, pois para um cliente podem ser feitas várias vendas, com quantidades diferentes.
  4. Quantidade não depende de Cidade. Quem depende de Cidade é Cliente. Aqui está uma dependência parcial.
  5. Quantidade depende de Codproduto, pois para cada produto da Venda á uma quantidade certa.

Quantidade depende de 3 campos, dos 4 que compõe a chave de Venda. Quem sobrou nessa história foi Codcidade. A tabela Cidade já está ligada com Cliente, que já está ligado com Venda. A chave Codcidade em Venda é redundante, portanto podemos eliminá-la.

Venda (Codvenda, Codcliente, Codproduto, Quantidade, Valorfinal).

O próximo campo não-chave é Valorfinal. Verificando Valorfinal, da mesma forma que Quantidade, ele depende de toda a chave de Venda. Portanto vamos á próxima norma.

3 Forma Normal: Verificação de Dependências Transitivas

Para uma tabela estar na segunda formal, além de estar na segunda forma ela não deve conter dependências transitivas. Um jeito de verificar esta norma é refazer a leitura dos campos fazendo a pergunta: Este campo depende de outro que não seja a chave? Se Sim, temos uma dependência transitiva..

No exemplo de Venda, temos um caso de dependência transitiva:

Na tabela Venda, temos Valorfinal. Este campo é o resultado do valor unitário do produto multiplicado pela quantidade, isto é, para um valor final existir ele DEPENDE de valor unitário e quantidade. O Valorunitário está na tabela Produto, relacionada à Venda e Quantidade está na própria Venda. Valorfinal depende destes 2 campos e eles não são campos-chave, o que nos leva a pensar: Se temos valor unitário e quantidade, porque teremos valor final? O valor final nada mais é que o resultado de um cálculo de dados que já está estão no banco, o que o torna um campo redundante.

Quando for necessário ao sistema obter o valor final, basta selecionar o valor unitário e multiplicar pela quantidade. Não há porque guardar o valor final em outro campo. Aqui a solução é eliminar o campo Valorfinal.

Cidade (Codcidade, Nome, Estado).

Cliente (Codcliente, Codcidade, Nome, Endereco, Cep, Telefone).

Produto (Codproduto, Nome, Valorunitario).

Venda (Codvenda, Codcliente, Codproduto, Quantidade).

Em tese, agora temos todas as tabelas normalizadas. Ainda restou o caso do campo Estado na tabela Cidade, mas eu deixarei para uma outra ocasião, pois o objetivo aqui é mostrar conceitualmente o processo de normalização do banco de dados.

É muito comum, no processo de normalização enxergamos todas as formas normais ao mesmo tempo. Enquanto separamos as tabelas aninhadas, já conseguimos ver as dependências transitivas e logo mais encontramos uma dependência parcial, tudo assim, ao mesmo tempo. Isso é normal. Só tome cuidado, para não deixar nada passar batido.

Reforçando o recado do artigo anterior: tem muito mais a ser visto sobre as etapas que eu mostrei nessa série. Aqui foi só uma demonstração do que se deve levar em conta ao modelar e construir um banco de dados íntegro, correto e que aproveita os dados da forma mais eficiente possível.

Um abraço à todos e até o próximo artigo!


Comente também

39 Comentários

sidneida de sá
sidneida de sá

Texto simples, claro e objetivo. É disso que precisamos. Que continue assim.

Luiz Otavio Campos Pereira
Luiz Otavio Campos Pereira

Material bem didático. Excelente para quem está começando e, até mesmo, para aqueles que conhecem um pouco mais do assunto.

edilson
edilson

estou fazendo o curso de banco de dados como iniciante no software postgree, gostaria de obter este material de modelagem de dados e tambem se tiver sobre formas normais

Fernanda Rigamont
Fernanda Rigamont

Não concordei com a primeira Forma Normal: verificação de tabelas aninhadas.
A tabela venda não precisa da chave estrangeira Codcidade, uma vez que a tabela cliente sabe qual é a sua cidade e consequentemente a venda sabe qual a cidade

Augusto César Makiyama
Augusto César Makiyama

Concordo com você.

Thiago Bettanzos
Thiago Bettanzos

Verdade

joseph
joseph

Discordo dos dois!

Adriano
Adriano

leiam o artigo inteiro antes de postar...

Hilder Nunes
Hilder Nunes

Muito bom seu material, bem claro.Eu sem saber dessas formalidades uso-as constantemente, acho, por isso ficou tudo tão fácil de entender na sua matéria. Porém não utilizo chaves estrangueiras... Mas, desde já,espero anciosamente pelo caso "Cidade / Estado". valew!

wilson
wilson

Impossivel usar essas formalidades sem ter chaves estrangeiras! Voce está confundindo as coisas.

Cleidson Dias do Nascimento
Cleidson Dias do Nascimento

Bem...
So discordo quando o quesito do Valor final que voce dispensou em seu banco de dados, por experiencia propia sei que nao pode desperezar o valor final, uma vez que o usuario pode mudar o valor unitario, e se ficar a criterio do computador executar a multiplicação ("Quantidade * ValorInicial"), Toda vez que for fazer uma pesquisa a Venda retornara o Valor atualizado, o que não e o caso, sendo que cada venda tambem acumula o valor historico da mesma

wilson
wilson

cara tu é burro, hein? Como pode ser programador pensando assim? Toda tabela ao ser visualizada deve gerar calculos em temp real.

Evandro Ribeiro
Evandro Ribeiro

Então se a venda foi feita com um produto há 10 dias atrás com valor unitário de R$ 1,00 e qtde=10 o valor total era de R$ 10,00.
Hoje o produto custa R$ 2, 00.
Se quero saber quanto foi o valor desta venda há dez dias atrás?
Na sua lógica ela seria de R$ 20,00 e não R$ 10,00.
Precisamos armazenar o histórico de vez em quando.......

Ieda
Ieda

Concordo em não dispensar o campo valor final, mas para tal é preciso criar uma tabela ítens da venda, onde seriam armazenadas as informações sobre os produtos vendidos. Assim, qualquer alteração no valor unitário da tabela produto não afetaria o registro da venda.

Alexandre Ferres Fernandes
Alexandre Ferres Fernandes

Olha gostei muito do artigo, voce esta de parabéns cofesso que agora entendi bem este conceito de normalização pois na facu peguei um professor que era muito ruim para ensunar dava para perceber que
ele sabia mas não conseguia passar o conhecimenteo infelismente existem muitos professores assim em nosso meio valeu pela esplicação Alexandre Ferres Fernandes.

Alexandre Ferres Fernandes
Alexandre Ferres Fernandes

Olha gostei muito do artigo, você esta de parabéns confesso que agora entendi bem o conceito de normalização, pois na faculdade tive um professor que era muito ruim para ensinar, dava para perceber que ele sabia, mas não conseguia passar o conhecimento infelismente existem muitos professores assim em nosso meio, valeu pela explicação Alexandre Ferres Fernandes.

Luw Vbw
Luw Vbw

Muito bom seu tutorial...

simples e claro.

Era o que eu procurava!

Danilo
Danilo

Quero te agrader muito cara, muito obrigrigado mesmo.

Eu estava procurando um tutorial sobre normalização, e este foi o melhor que encontrei para me introduzir à normalização.

vlw

Diego
Diego

Para deveria existir 5 tabelas, ficando assim:

Cidade (Codcidade, Nome, Estado).
Endereco(codEndereco, endereco, Cep)
Cliente (Codcliente, Nome, Telefone, Codcidade, codEndereco).
Produto (Codproduto, Nome, Valorunitario).
Venda (Codvenda, Codcliente, Codproduto, Quantidade).

Alguem comenta?

Ieda
Ieda

Ter uma tabela endereço depende da sua análise. É interessante para o negócio armazenar mais de um endereço do cliente? ex. comercial e residencial. Além disso, você precisa de uma tabela estado, para armazenar as siglas com respectivas descrições.

Diogenes de Souza Filho
Diogenes de Souza Filho

A princípio tudo que a professora Kamilla do curso Técnico em Informática da Faetec Santo Antônio de Pádua esta no contexto daí valeu. Se possível fosse me envie um resumo(conclusão)das tres Formas Normais e um bibliografia, para o término do meu trabalho.
Respeitosamente,
Diogenes de Souza Filho
diogenesdesouzafilho@yahoo.com.br

NOTA: Tudo o que eu preciso para o trabalho esta página so site vai me proporcionar se não quase 100%

Thiago Oliveira Ferreira
Thiago Oliveira Ferreira

Precisei fazer um trabalho de faculdade e após várias pesquisas esse artigo foi o que realmente explicou as 3 primeiras formas normais de uma maneira simples de entender.

Parabéns e obrigado!

aluno coitado do cefet-rj
aluno coitado do cefet-rj

Estudo no CEFET-MARACANÃ, superior em WEB, lá tem um prof de BD, Jorge Soares Abreu, web: jsoares.net. Cara não consegue explicar isso, ele é muito fraco e tira maior onda só porque é Dr. Com didática nota ZERO, Nenhum aluno passa direto nele, é só olhar no site dele, acima, AS NOTAS. Esse seu artigo é show... Vc conseguiu explica de forma simples, mas conscistente. Obrigado mesmo!!!
PS: Faz prova pra dar aulas no CEFET-RJ, a maioria dos prof de lá são fracos...

ana
ana

Muito bom seu artigo, Mauri.
Explicar estes conceitos de forma clara é bem difícil e você foi muito bem sucedido nisto.
Muito obrigada, Ana.

Sildo
Sildo

ótimo artigo. é incrível pois num livro teórico de banco de dados, eu teria de ler 100 páginas de pura teoria enjoada, chata e que não explica nada. realmente, devemos aprender pela prática e não pela teoria absurda. Este artigo ajudou a resolver a crise que encontrei de copia e cola da internet.. (pelo menos em relação a formas nominais)

Marly de Campos Manaszczuk
Marly de Campos Manaszczuk

Caro Mauri !

Muito obrigada pelas explicações, o material divulgado está ótimo, claro, objetivo, me ajudou muito.
Sou iniciante do curso Técnico em Programação e mesmo assim consegui entender.

Um grande abraço
Marly

Havana Alves
Havana Alves

É disso que precisamos pra entender essas normas: um texto descomplicado, sem blablablá. Parabéns!!!

Luiz Eduardo
Luiz Eduardo

Parabéns admiro mto imasters em geral

continuem assim. ta mto bom

o melhor q conheço

Vinicius
Vinicius

Cara não concordo com o Atributo Estado dentro de uma tabela Cidade, achei errado pq deveremos inserir no banco desta maneira várias vezes o mesmo nome de estado, acharia interessante que fosse criado uma tabela estado e uma Fk para a tabela Cidade com o idEstado.

marcelo
marcelo

puts!! excelente texto, vlw ajudou muito pra mim que estou começando.

Alcimar
Alcimar

Parabéns, sou professor e ensino Modelagem e realmente seu texto está muito simples. Com sua permissão vou indicá-lo aos meus alunos!! Novamente Parabéns!

Frank F
Frank F

Muito bom o artigo!

Parabéns...

Estefanio Luiz Almeida
Estefanio Luiz Almeida

Bom artigo, esse assunto de normalização e grande parte é tratado de maneira complicado por alguns, mas aqui fico bem didatico.

João Paulo Ribeiro
João Paulo Ribeiro

Muito obrigado.

Foi de grande valia.

Parabéns.

Karine
Karine

Boa noite,
Texto bem explicativo e intuitivo.

Parabéns :-)

joseph
joseph

Tá.. e quando o cliente compra mais de um produto? Vejo uma linha no BD para cada compra, com apenas 1 campo para 'produto'. f*deu(?)

Carlos Xavier
Carlos Xavier

Bem pensado!!! E agora???

Marcos Vinicius
Marcos Vinicius

Achei seu texto sobre a 1 FN muito parecido com o da 3 FN, pois o que você fez na sua explicação da 1 FN foi praticamente encontrar dependências funcionais transitivas. Na 1 FN o que deve ser identificado é se existem atributos compostos e multivalorados (por exemplo, uma coluna para o endereço completo, para mais de um telefone), e aí estes atributos devem ser subdivididos e movidos para outra tabela.

Cristiana
Cristiana

Achei, muito show, parabéns e simplesmente isso que precisamos, muita clareza, obrigado.

Qual a sua opinião?

Comentários considerados ofensivos serão moderados.

Parceiros

IBM
PagSeguro
Internet Innovation
Dialhost
HostNet
Tecla
KingHost
DotStore
Dinamize