A terceira forma normal

A terceira forma normal

Esta é a parte três da série, cinco formas normais. Os títulos das duas primeiras partes (tutoriais) são a primeira forma normal, seguida pela segunda forma normal. Nesta parte da série, a terceira forma normal é explicada.

A explicação segue a história: um pai morreu e deixou algum dinheiro para seu filho. O filho decidiu investir o dinheiro em uma loja de conveniência. Uma loja de conveniência, também conhecida como loja de conveniência, é um pequeno negócio de varejo que recebe itens do cotidiano de fornecedores e os vende a clientes individuais no bairro.

Neste ponto, a loja já está estocada e algumas vendas já foram feitas. O filho, que é o proprietário do negócio, tem alguns funcionários, que são chamados de funcionários neste tutorial. O proprietário e qualquer funcionário podem receber suprimentos e fazer vendas depois de gravar os produtos.

No entanto, antes do início da loja, nem o proprietário nem os funcionários sabiam nada sobre formas normais. Então, eles estavam gravando tudo como transações em uma mesa e um livro de exercícios. Eles não tinham um computador.

Você, o leitor, concluiu as cinco partes desta série tutorial; você agora é um desenvolvedor de banco de dados. O proprietário da loja de conveniência é seu amigo. Você visitou a loja há dois dias e treinou o proprietário e os funcionários para produzir uma mesa em sua primeira forma normal. Você também visitou a loja ontem e os treinou sobre como criar uma tabela na segunda forma normal a partir da primeira forma normal.

Hoje, você acabou de chegar à loja para uma visita para treiná -los sobre como produzir uma mesa na terceira forma normal a partir da segunda forma normal. Todas as mesas que eles têm atualmente estão na segunda forma normal. As tabelas (pelo nome e títulos da coluna) são:

Produtos (ProductId, CategoryId, Product)
Categorias (categoryId, categoria)

Vendas (Saleid, Cliente, Funcionário, Data)
Saledetails (SaleId, ProductId, Numbersold, SellingPrice)

Ordens (OrderId, Fornecedor, Funcionário, Data)
OrderDetails (OrderId, ProductId, numberbought, CostPrice)

As teclas únicas ou compostas estão sublinhadas.

Depois de resumir o que foi ensinado nos dois dias anteriores e antes que você pudesse fazer qualquer coisa, o proprietário pergunta:

“E os números de telefone, endereços, etc., Para clientes e funcionários?

Que tal quantidade em estoque, nível de reordenação, etc., para produtos?
Eles precisam de suas próprias mesas separadas, ou devem ser montadas nas mesas atuais?”

Você, o desenvolvedor do banco de dados, responde:

“Parabéns, proprietário! Você introduziu indiretamente a questão da terceira forma normal.”

Você continua.

Outras colunas necessárias

Outras colunas necessárias são adicionadas primeiro às tabelas anteriores, que estão em 1nf e 2nf. Alguns dos nomes anteriores de colunas são modificados.

No mínimo, a tabela de categorias deve ter as seguintes colunas:

Categorias (categoryId, categoryName, descrição)

A descrição é um parágrafo curto que descreve a categoria. Esta tabela de categorias já está em 1NF, 2NF e 3NF. O 3NF é explicado abaixo:

No mínimo, a tabela de produtos deve ter as seguintes colunas:

Produtos (ProductId, CategoryId, SupplierId, Nome do ProductNe, UnitPrice, QuantityInstock, Reordenamento)

À medida que cada produto está sendo vendido, um nível baixo (número) dos produtos será alcançado quando o produto tiver que ser reordenado, para que os clientes não venham à loja e não tenham o produto. Essa ausência não é boa para os negócios. QuantityInstock é o número de um determinado produto em estoque. Isso inclui o que está na loja e o que está na prateleira.

categoryId e fornecedierId são chaves estrangeiras. É por isso que eles têm um traço sublinhado em vez de sublinhado único. A chave estrangeira é explicada abaixo. Na parte anterior da série (segunda forma normal), a categoryid fazia parte da chave primária com um único sublinhado devido à maneira como ela foi alcançada. No entanto, a partir da explicação abaixo, ficaria claro que o categoryID deve ser uma chave estrangeira (com um traço sublinhado).

Esta tabela de produtos já está em 1nf, 2nf e 3nf. Veja por que está no 3NF abaixo:

No mínimo, a tabela de saledetails deve ter as seguintes colunas:

Saledetails (SaleId, ProductId, UnitSellingPrice, Quantidade, Desconto)

O valor do desconto deve ser zero na maioria das vezes. Um desconto é o desconto que a loja dá a um cliente.

No mínimo, a tabela OrderDetails deve ter as seguintes colunas:

OrderDetails (OrderId, ProductId, UnitCostprice, Quantidade, Desconto)

O valor do desconto deve ser zero na maioria das vezes. O desconto aqui é o desconto que o fornecedor dá à loja.

Como visto abaixo, a tabela de produtos pode ser considerada em 2nf ou 3nf. As tabelas de vendas e pedidos têm a questão do 3NF. Somente a tabela de vendas será usada para explicar o problema e a solução. A tabela 3NF para pedidos e produtos segue um raciocínio semelhante e seria apenas citado.

Ao adicionar colunas, a tabela de vendas seria:

Vendas (SaleId, Datas CustomerName, telefone, endereço, cidade, região, código postal, país, funcionário)

Sete colunas substituíram a coluna do cliente na tabela original. Como os clientes são pessoas no bairro, as células da cidade, região (estado), código postal e colunas do país podem ser deixadas vazias, embora não sejam deixadas vazias neste artigo.

Esta tabela de vendas ainda está em 2NF, pois as regras 1NF e 2NF não foram violadas. No entanto, deve -se perceber que em uma linha de mesa de vendas, o cliente (nome) foi substituído por sete células da linha do cliente.

Nota: Uma célula de endereço tem o número da casa, o nome da rua ou da estrada e o nome da cidade, todos separados por vírgulas. Uma cidade pode ser considerada como composta por várias cidades. Embora vírgulas separem esses componentes de string específicos, eles formam um valor de célula e não três valores celulares.

A coluna do funcionário também deve ser substituída por sete dessas colunas. No entanto, isso não é feito neste tutorial para economizar tempo de ensino e espaço. Portanto, uma tabela de vendas com dados pode ser:

Tabela de vendas - 2NF - sem ClientID

A coluna SaleId do tipo de dados é um número inteiro ou, melhor, incremento automático. O tipo de dados da coluna da datas é uma data e não um número porque tem o personagem "/", que não é um dígito. O tipo de dados para o restante das colunas, incluindo a coluna do telefone, é string (ou texto). O valor do telefone tem o personagem "-", que não é um dígito.

Observe que para cada linha, cliente (nome), como estava na parte anterior da série, foi substituído por sete células, uma das quais ainda é nome do cliente. Isso significa que os dados do cliente são uma entidade. Atualmente, o nome do cliente identifica seus outros seis dados consecutivos. Se esta tabela estiver programada, será conveniente identificar a entidade do cliente em cada linha com um número inteiro (não incremento automático). Nesse caso, uma coluna CustomerID deve preceder o nome do personalizador. A tabela anterior se torna:

Tabela de vendas - 2NF - com CustomerID

Existem três clientes: 1, 2 e 3, com 1 ocorrendo cinco vezes para John Smith, 2 ocorrendo duas vezes para James Taylor e 3 ocorrendo uma vez para Susan Wright.

Observe que alguns clientes e seus dependentes se repetem.

Regras para a terceira forma normal

Uma tabela está na terceira forma normal se cumprir as seguintes regras:

  1. Já deveria estar na segunda forma normal.
  2. E não deve ter dependência transitiva.

Então um dos funcionários (funcionários) pergunta: “O que é uma dependência transitiva?”. E você, o desenvolvedor do banco de dados, responde: “Essa é uma boa pergunta!”

Dependência transitiva

É verdade que, em uma linha, SaleId identifica todos os valores na linha; No entanto, o CustomerID identifica seus sete valores de dados, mas não identifica o restante dos valores identificados por SaleId nessa linha. Em outras palavras, o Saleid depende de dez valores de células em cada linha. No entanto, o CustomerID depende de sete valores de células na mesma linha, mas o CustomerID não depende do SaleId e dos outros valores dos quais SaleId depende.

Essa dependência do custumerid é dependência transitiva. E o CustomerID é chamado de chave estrangeira e é sublinhada para Dash nesta série tutorial, as cinco formas normais.

Suponha que um atributo não prático (valor da célula não primário) dependa de outros atributos não primários, e o atributo não primário em questão (e.g., CustomerId e seus dependentes) não depende da chave primária e do restante dos valores celulares na linha. Então isso é dependência transitiva.

A tabela de vendas anterior com a chave estrangeira e seus dependentes causaria problemas contábeis (anomalias).

Tabela de vendas de 2NF a 3NF

Para resolver o problema representado pela chave estrangeira e seus dependentes, remova a chave estrangeira e seus dependentes, para formar uma nova tabela sem repetições. No entanto, mesmo que a chave estrangeira não dependa da chave primária, a chave primária depende da chave estrangeira. Portanto, uma cópia da chave estrangeira deve permanecer na tabela pai. A nova tabela de vendas, neste momento, é 1NF, 2NF e 3NF compatível; É uma tabela pai. A nova tabela infantil da tabela de vendas anterior também é 1NF, 2NF e 3NF compatível. O nome da tabela infantil com chave estrangeira e seus dependentes é os clientes. Se um nome adequado não puder ser encontrado, algo deu errado com a análise. A nova tabela de vendas em 3nf é:

Tabela de vendas final em 3nf

Esta tabela em 3nf tem o mesmo número de linhas que a em 2nf, mas com menos colunas.

A notação da tabela para esta tabela de vendas final em 3nf é:

Vendas (SaleId, Datesold, CustomerID, Funcionário)

O SaleId é a chave primária com um único sublinhado. CustomerID é uma chave estrangeira, com um traço sublinhado. Funcionário também é uma chave estrangeira com um traço sublinhado. Observe que a situação do funcionário na tabela de vendas em 2NF é a mesma que a situação do cliente. O Funcionário e seus próprios dependentes devem ser retirados para formar outra tabela; Uma cópia do funcionário permanece.

Nota: SaleId, CustomerID e Funcionário não formam uma chave composta. SaleId depende de CustomerID e Funcionário.

O relacionamento entre SaleId e CustomerID é muitos para um.

A tabela de clientes em 3nf

Esta tabela tem três linhas em vez de 9 linhas na tabela de vendas 2NF. Nesta tabela, o ClusterID é uma chave primária. É o mesmo que a chave estrangeira na tabela de vendas, mas sem repetições. A chave estrangeira na tabela de vendas e a chave primária na tabela de clientes vinculam as duas tabelas.

As linhas repetidas na tabela de clientes foram removidas para não violar 1nf.

Como o leitor pode ver, colocando uma tabela em 3nf também resolveria o problema das linhas repetidas (redundância).

A notação da tabela para a tabela de clientes é:

Clientes (CustomerID, Nome Customername, Telefone, Endereço, Cidade, Região, Código Post, País)

A tabela de produtos revisitada

A tabela de produtos fornecida acima no formulário de notação é:

Produtos (ProductId, CategoryId, SupplierId, Nome do ProductNe, UnitPrice, QuantityInstock, Reordenamento)

A chave primária aqui é productId. categoryId e fornecedierId são chaves estrangeiras. Semelhante à tabela do cliente, existe uma tabela de categorias, onde a categoryId é a chave primária e há uma tabela de fornecedores, onde o fornecedor é a chave primária.

Se os valores para as células para o UnitPrice, QuantityInstock e ReorderLevel permanecerão fixo, a tabela de produtos, por assim dizer, estará realmente em 3NF. Se esses valores estarão mudando, a tabela de produtos, como é, está em 2NF. Nesta parte da série tutorial, supõe -se que esses valores permaneçam fixos ao longo do tempo.

Todas as mesas

Todas as mesas estão agora em 3nf. Eles são mostrados como:

Funcionários (Funcionário, nome, telefone, endereço, cidade, região, código postal, país, data de nascimento, contratante, Dateelased)

Fornecedores (fornecedor, nome, telefone, endereço, cidade, região, código postal, país)

Produtos (ProductId, CategoryId, SupplierId, Nome do ProductNe, UnitPrice, QuantityInstock, Reordenamento)
Categorias (categoryId, categoryName, descrição)

Vendas (SaleId, Datesold, CustomerID, Funcionário)
Saledetails (SaleId, ProductId, Numbersold, SellingPrice)
Clientes (CustomerID, Nome Customername, Telefone, Endereço, Cidade, Região, Código Post, País)

Ordens (OrderId, Datesold, SupplierId, Funcionário)
OrderDetails (OrderId, ProductId, numberbought, CostPrice)

Até nove tabelas profissionais foram produzidas a partir de apenas uma tabela produzida por novatos para evitar problemas de redundância e contabilidade (anomalias da inserção, excluir e atualizar). Somente a mesa iniciante levaria a perdas financeiras.

Testando a equipe

Neste ponto, todos os funcionários, incluindo o proprietário, deveriam ter entendido 1nf, 2nf e 3nf. No entanto, eles precisam ser testados. Todos eles, incluindo o proprietário, ficarão em diferentes lugares e completarão o teste. O teste que consiste em uma pergunta levará uma hora e é o seguinte:

Pergunta: Usando regras para 1nf, 2nf e 3nf, prove que todas as nove tabelas acima já estão na primeira forma normal, segunda forma normal e terceira forma normal. Os clientes e fornecedores não precisam ser entidades reais. Os dados para tabelas devem fazer backup das notações da tabela.

Enquanto eles estão concluindo o teste, você, como desenvolvedor de banco de dados, sai para fazer um lanche e uma cerveja, para voltar após uma hora.

O futuro próximo e distante

Enquanto você, o desenvolvedor do banco de dados, está fora, você também considera que conselhos lhes dão se todos passarem no teste.

Além disso, enquanto você os treinava, e agora que eles estão fazendo o teste, os clientes estão chegando e saindo sem serem servidos. Isso não é bom para os negócios, e você, o desenvolvedor de banco de dados, sabe que. Alguns clientes podem ir às lojas dos concorrentes e nunca mais voltar.

Você, o desenvolvedor do banco de dados, tem 30 anos. O proprietário, como seu amigo, também tem 30 anos. Os funcionários (funcionários) têm entre 18 e 24 anos. Todas as qualidades necessárias para trabalhar para o proprietário eram: ser saudável, poder ler e escrever, poder adicionar, subtrair, multiplicar e dividir e poder usar o computador e a Internet.

Quando uma tabela está em 3NF, a maioria das vulnerabilidades foi removida do banco de dados. Muitos bancos de dados comerciais não vão além do 3NF, e as empresas ou empresas se sentem confortáveis.

Então, se todos eles passarem no teste, você pedirá aos funcionários que continuem trabalhando. Você também os aconselhará a salvar partes de seus salários para que eles possam possuir suas lojas de conveniência. Você continuará amanhã para treinar apenas o proprietário em 4nf e 5nf. Com o conhecimento de 4NF e 5NF, todas as vulnerabilidades conhecidas são removidas.

Avaliação

Depois de uma hora, você, o desenvolvedor do banco de dados, volte. Você marca seus scripts. Um pedaço de excelente notícia! Todos eles, incluindo o proprietário, têm 100% cada. Hurra! Isto é excelente!

Então, parabéns a todos vocês: o professor e os alunos.

Não há mais nada a fazer neste tutorial além de concluir.

Conclusão

Uma tabela está na primeira forma normal, se não violar nenhuma das seguintes regras:

  1. Todas as colunas em uma tabela devem ter nomes de cabeçalho exclusivos.
  2. Cada célula deve ter apenas um único valor.
  3. Os valores armazenados em uma coluna devem ser do mesmo tipo.
  4. As linhas devem ser distintas.
  5. A ordem das colunas ou linhas não importa.

Uma tabela está em segunda forma normal, se não violar nenhuma das seguintes regras:

  1. A tabela já deve estar na primeira forma normal.
  2. Não deve haver dependência parcial.

Uma tabela está na terceira forma normal, se não violar nenhuma das seguintes regras:

  1. Já deve estar na segunda forma normal.
  2. E não deve ter dependência transitiva.

Você, o desenvolvedor do banco de dados, diz aos funcionários que eles aprenderam o suficiente. Você fornece conselhos e pede que voltem ao trabalho e permaneçam em suas estações por padrão.

Você marcou uma consulta apenas com o proprietário, para ocorrer em seu escritório amanhã para treinar em 4nf e 5nf.