Compreender a normalização

Concluído

Normalização é um termo usado por profissionais de banco de dados para um processo de design de esquema que minimiza a duplicação de dados e impõe a integridade dos dados.

Embora existam muitas regras complexas que definem o processo de refatoração de dados em vários níveis (ou formas) de normalização, uma definição simples para fins práticos é:

  1. Separe cada entidade em sua própria tabela.
  2. Separe cada atributo discreto em sua própria coluna.
  3. Identifique exclusivamente cada instância de entidade (linha) usando uma chave primária.
  4. Utilize colunas de chave estrangeira para ligar entidades relacionadas.

Para entender os princípios fundamentais da normalização, suponha que a tabela a seguir represente uma planilha que uma empresa usa para acompanhar suas vendas.

N.º de encomenda Nome do Cliente CustomerAddress Nome do Produto Preço unitário Qty
1 Jane Smith 42 Oak St.Seattle Widget A 9.99 2
1 Jane Smith 42 Oak St.Seattle Widget B 4.49 1
2 Bob Jones 18 Pine Ave Portland Widget A 9.99 5
2 Bob Jones 18 Pine Ave Portland Gadget X 24,99 1
3 Jane Smith 42 Oak St.Seattle Gadget X 24,99 3
3 Jane Smith 42 Oak St.Seattle Widget B 4.49 2

Observe que os detalhes do cliente e do produto são duplicados para cada item individual vendido; e que o nome do cliente e o endereço postal, bem como o nome e o preço do produto, sejam combinados nas mesmas células da planilha.

Agora vamos ver como a normalização muda a maneira como os dados são armazenados.

Diagrama mostrando dados de um pedido em um esquema tabular normalizado.

Cada entidade representada nos dados (cliente, produto, ordem de venda e item de linha) é armazenada em sua própria tabela e cada atributo discreto dessas entidades está em sua própria coluna.

Registrar cada instância de uma entidade como uma linha em uma tabela específica da entidade remove a duplicação de dados. Por exemplo, para alterar o endereço de um cliente, você só precisa modificar o valor em uma única linha.

A decomposição dos atributos em colunas individuais garante que cada valor está limitado a um tipo de dado apropriado – por exemplo, preços de produtos muSt.be valores decimais, enquanto quantidades de itens de linha muSt.be números inteiros. Além disso, a criação de colunas individuais fornece um nível útil de granularidade nos dados para consulta - por exemplo, você pode facilmente filtrar clientes para aqueles que moram em uma cidade específica.

As instâncias de cada entidade são identificadas exclusivamente por um ID ou outro valor de chave, conhecido como chave primária; e quando uma entidade faz referência a outra (por exemplo, uma ordem tem um cliente associado), a chave primária da entidade relacionada é armazenada como uma chave estrangeira. Você pode procurar o endereço do cliente (que é armazenado apenas uma vez) para cada registro na tabela Pedido , fazendo referência ao registro correspondente na tabela Cliente . Normalmente, um sistema de gestão de bases de dados relacional (SGBDR) pode impor a integridade referencial para garantir que um valor inserido num campo de chave estrangeira tem uma chave primária correspondente existente na tabela relacionada – por exemplo, impedindo encomendas para clientes inexistentes.

Em alguns casos, uma chave (primária ou estrangeira) pode ser definida como uma chave composta com base em uma combinação única de várias colunas. Por exemplo, a tabela LineItem no exemplo acima usa uma combinação exclusiva de OrderNo e ItemNo para identificar um item de linha de uma ordem individual.