Normalização em SQL: 1NF, 2NF, 3NF e BCNF
Publicados: 2021-03-12A normalização é um processo sistemático para garantir que um modelo de banco de dados relacional seja eficiente, adequado para consultas de propósito geral e livre de características indesejáveis, como anomalias de inserção, atualização e exclusão, levando à perda da integridade dos dados. Esse processo de normalização também ajuda a eliminar a redundância de dados e reduz as chances de inconsistência após qualquer operação de inserção, atualização ou exclusão.
Para uma melhor compreensão, considere o seguinte esquema: Aluno (Nome, Endereço, Assunto, Nota)
Existem alguns problemas ou ineficiências neste esquema.
1) Redundância : O endereço do aluno é repetido para cada disciplina em que está matriculado.
2) Anomalia de atualização : Podemos ter atualizado o endereço em uma tupla (linha) deixando-o inalterado nas outras linhas. Assim, não teríamos um endereço consistentemente único para cada aluno.
3) Anomalia de Inserção : Não registraremos o endereço de um aluno sem se registrar em pelo menos uma disciplina. Da mesma forma, quando um aluno deseja se matricular em uma nova Disciplina, é possível que seja inserido um Endereço diferente.
4) Anomalia de exclusão: Se um aluno decidir descontinuar todas as disciplinas matriculadas, o endereço do aluno também será perdido no processo de exclusão.
Assim, é importante representar os dados do usuário por relações que não criem anomalias após operações de adição, exclusão ou atualização de tuplas. Isso só pode ser alcançado por uma análise cuidadosa das restrições de integridade, especialmente as dependências de dados do banco de dados.
As relações devem ser projetadas de forma que apenas os atributos que existem naturalmente juntos sejam agrupados. Isso pode ser feito principalmente por uma compreensão básica do significado de todos os atributos de dados. No entanto, ainda precisamos de alguma medida formal para garantir nosso objetivo de design.
A normalização é essa medida formal. Ele responde à pergunta de por que um determinado agrupamento de atributos será melhor do que qualquer outro.
Sete formas normais existem a partir de hoje:
- Primeira Forma Normal (1FN)
- Segunda Forma Normal (2FN)
- Terceira Forma Normal (3FN)
- Forma Normal de Boyce-Codd (BCNF)
- Quarta Forma Normal (4FN)
- Quinta Forma Normal (5FN)
- Sexta forma normal ou chave de domínio (6NF)
Ler: Tipos de Views em SQL
Índice
Primeira Forma Normal (1NF ou Forma Mínima)
- Não há ordenação de cima para baixo nas linhas e da esquerda para a direita nas colunas.
- Não há linhas duplicadas.
- Cada interseção de linha e coluna contém exatamente um valor do domínio aplicável ou valor nulo. Essa condição indica que todos os valores de coluna devem ser atômicos, escalares ou conter apenas um único valor. Nenhuma repetição de informações ou valores em várias colunas é permitida aqui.
- Todas as colunas são regulares (ou seja, as linhas não têm componentes ocultos, como IDs de linha, IDs de objeto ou carimbos de data/hora ocultos).
Vamos dar um exemplo de um esquema que não é normalizado. Suponha que um designer deseja registrar os nomes e números de telefone dos clientes. Eles definem uma tabela de clientes como mostrado:
ID do cliente | Nome _ | Sobrenome | Números de telefone |
123 | Bimal | Saha | 555-861-2025 |
456 | Kapil | Khanna | 555-403-1659, 555-776-4100 |
789 | Cabita | Roy | 555-808-9633 |
Aqui, não está em 1 NF. A coluna Telefones não é atômica ou não possui valor escalar, ou seja, já teve mais de um valor, o que não pode ser permitido em 1 NF.
Para Fazer 1 NF
- Primeiro vamos quebrar (decompor) nossa única tabela em duas.
- Cada tabela deve ter informações sobre apenas uma entidade.
ID do cliente | Nome _ | Sobrenome |
123 | Bimal | Saha |
456 | Kapil | Khanna |
789 | Cabita | Roy |
ID do cliente | Números de telefone |
123 | 555-861-2025 |
456 | 555-403-1659 |
456 | 555-776-4100 |
789 | 555-808-9633 |
A repetição de grupos de números de telefone não ocorre neste design. Em vez disso, cada link de número de telefone para cliente aparece em seu próprio registro.
Checkout: Perguntas e respostas mais comuns em entrevistas SQL
Segunda Forma Normal
Cada forma normal tem mais critérios restritivos do que sua antecessora. Portanto, qualquer tabela que esteja na segunda forma normal (2NF) ou superior está, por definição, também na 1NF. Por outro lado, uma tabela que está na 1FN pode ou não estar na 2FN; se estiver na 2FN, pode ou não estar na 3FN, e assim por diante.
Diz-se que uma tabela 1NF está na 2FN se e somente se nenhum de seus atributos não primos for funcionalmente dependente de uma parte (subconjunto próprio) de uma chave candidata. (Um atributo não principal não pertence a nenhuma chave candidata.)
Observe que quando uma tabela 1NF não possui chaves candidatas compostas (chaves candidatas consistindo em mais de um atributo), a tabela está automaticamente na 2NF.
Verifique se uma Relação R (A, B, C, D, E) com FD Definir como { BC ? D, AC? SER, B? E } está na 2FN?
- Como podemos ver, o fechamento de AC é (AC)+ = {A, C, B, E, D} aplicando o algoritmo de pertinência. Mas nenhum de seus subconjuntos pode determinar todos os atributos da relação por si só, então AC é a chave candidata para essa relação. Além disso, nem A nem C podem ser derivados de qualquer outro atributo da relação, então haverá apenas 1 chave candidata que é {AC}.
- Aqui {A, C} são os atributos primos e {B, D, E} são os atributos não primos.
- A relação R já está na 1ª forma normal, pois um SGBD relacional em 1NF não permite atributo multivalorado ou composto.
BC? D está na 2ª forma normal porque BC não é um subconjunto adequado da chave candidata AC,
CA? BE está na 2ª forma normal, pois o próprio AC é a chave candidata, e
B? E está na 2ª forma normal B não é um subconjunto adequado da chave candidata AC.
Assim, a relação dada R está na 2ª Forma Normal.
Terceira forma normal
Diz-se que uma tabela está na 3FN se e somente se para cada uma de suas dependências funcionais.
X → A , pelo menos uma das seguintes condições é válida:
- X contém A (isto é, X → A é uma dependência funcional trivial), ou
- X é uma superchave, ou
- A é um atributo principal (ou seja, A está presente em uma chave candidata)
Outra definição de 3NF afirma que todo atributo não-chave de R é dependente não-transitivamente (ou seja, diretamente dependente) da chave primária de R. Isso significa que nenhum atributo não-primo (que não faz parte da chave candidata) é funcionalmente dependente de outros atributos não-primos. Se houver duas dependências tais que A ? B e BC, então desses FDs, podemos derivar A ? C. Esta dependência AC é transitiva.
Exemplo de 3NF:
Considere a seguinte relação Order (Order#, Part, Supplier, UnitPrice, QtyOrdered) com o conjunto de FDs fornecido:
Ordem# ? Parte, Fornecedor, QtyOrdered e Fornecedor, Parte ? Preço unitário)
Aqui Order# é a chave para a relação.
Usando os axiomas de Amstrong, obtemos
Ordem# ? Parte, Ordem? Fornecedor e Pedido ? Qtd.Ordenado.
Ordem# ? Parte, Fornecedor e Fornecedor, Parte ? Preço unitário, ambos dão Order# ? Preço unitário.
Assim, vemos que todos os atributos não primos dependem da chave (Order#). No entanto, existe uma dependência transitiva entre Order# e UnitPrice. Portanto, essa relação não está na 3FN. Como fazemos isso no 3NF?
Não podemos armazenar o Preço Unitário de qualquer Peça fornecida por qualquer Fornecedor, a menos que alguém faça um pedido para essa Peça. Portanto, teremos que decompor a tabela para fazê-la seguir a 3FN da seguinte forma.
Pedido (Order#, Part, Supplier, QtyOrdered) e Price Master (Part, Supplier, UnitPrice).
Agora não há dependências transitivas presentes. A relação está na 3FN.
Leia também: SQL para Ciência de Dados
Aprenda cursos de software online das melhores universidades do mundo. Ganhe Programas PG Executivos, Programas de Certificado Avançado ou Programas de Mestrado para acelerar sua carreira.
Conclusão
Há mais na normalização, como BCNF, 4NF, 5NF e 6NF. Resumindo, BCNF nada mais é do que uma extensão da 3NF, pois a última regra da 3NF não se aplica aqui. Todas as dependências funcionais precisam ter os atributos-chave à esquerda e nenhum à direita. (BCNF também é chamado de 3.5NF). No entanto, formas normais de 4NF e além são raramente implementadas na prática regular.
Se você estiver interessado em aprender mais sobre desenvolvimento full-stack, confira o Programa PG Executivo do upGrad & IIIT-B em Desenvolvimento de Software Full-stack, que é projetado para profissionais que trabalham e oferece mais de 500 horas de treinamento rigoroso, mais de 9 projetos, e atribuições, status de ex-alunos do IIIT-B, projetos práticos práticos e assistência de trabalho com as principais empresas.
O que é normalização de banco de dados?
Quais são os diferentes tipos de formas normais?
As formas normais foram desenvolvidas por Edgar F. Codd, o pai dos bancos de dados relacionais. Cada forma normal é um nível de correção lógica geral do modelo relacional e serve a um propósito no projeto real de bancos de dados. A primeira forma normal, 1NF, trata do design da tabela e envolve a remoção de duplicatas e a garantia de que cada parte dos dados seja representada apenas uma vez na tabela. A segunda forma normal é sobre colunas duplicáveis - dividindo-as em várias tabelas. A terceira forma normal é sobre repetir grupos - dividindo-os em várias tabelas. A quarta forma normal é sobre 1NF, 2NF e 3NF - garantindo que as tabelas estejam livres de qualquer lógica ou desnormalização.
Como normalizar um banco de dados?
A normalização de um banco de dados é o processo de dividi-lo no menor número de tabelas. Ao final, o banco de dados não terá campos repetidos e nem linhas com informações parciais. O objetivo é garantir que todos os dados estejam vinculados a todos os outros dados relevantes e, quando ocorre uma alteração em um registro, todos os outros registros que possam estar relacionados a ele também são alterados.