A terceira forma normal (3NF) é um princípio de banco de dados que suporta a integridade dos dados, baseando-se nos princípios de normalização do banco de dados fornecidos pela Primeira Forma Normal (1NF) e pela Segunda Forma Normal (2NF).
Terceiros requisitos de formulário normal
Existem dois requisitos básicos para um banco de dados estar na terceira forma normal:
- O banco de dados já deve atender aos requisitos de 1NF e 2NF.
- Todas as colunas do banco de dados devem depender da chave primária, o que significa que o valor de qualquer coluna pode ser derivado apenas da chave primária.
Sobre a dependência da chave primária
Vamos explorar mais o que queremos dizer com o fato de que todas as colunas devem depender da chave primária.
Se o valor de uma coluna puder ser derivado da chave primária e de outra coluna na tabela, ela violará 3NF. Considere uma tabela Funcionários com estas colunas:
- ID do Empregado
- Primeiro nome
- Último nome
Ambos LastName e FirstName dependem apenas do valor de EmployeeID? Bem, o LastName poderia depender do FirstName? Não, porque nada inerente no LastName sugeriria o valor de FirstName. O FirstName poderia depender do LastName? Não novamente, porque o mesmo é verdadeiro: qualquer que seja um LastName, ele não poderia fornecer uma dica quanto ao valor de FirstName. Portanto, esta tabela é compatível com 3NF.
Mas considere esta tabela de veículos:
- VehicleID
- Fabricante
- Modelo
O fabricante e o modelo podem derivar do VehicleID - mas o modelo também pode derivar do fabricante porque um modelo de veículo é fabricado apenas por um determinado fabricante. Esse design de tabela não é compatível com 3NF e pode, portanto, resultar em anomalias de dados. Por exemplo, você pode atualizar o fabricante sem atualizar o modelo, apresentando imprecisões.
Para torná-lo compatível, precisaríamos mover a coluna dependente adicional para outra tabela e fazer referência a ela usando uma chave estrangeira. Isso resultaria em duas tabelas:
Tabela de Veículos
Na tabela abaixo, o ModelID é uma chave estrangeira para o Modelos mesa:
- VehicleID
- Fabricante
- ModelID
Tabela de modelos
Esta nova tabela mapeia modelos para fabricantes. Se você quiser atualizar qualquer informação de veículo específica para um modelo, você faria isso nesta tabela, em vez de na tabela Veículos.
- ModelID
- Fabricante
- Modelo
Campos Derivados no Modelo 3NF
Uma tabela pode conter um campo derivado - um que é calculado com base em outras colunas na tabela. Por exemplo, considere esta tabela de pedidos de widgets:
- Número do pedido
- Número do cliente
- Preço unitário
- Quantidade
- Total
O total quebra a conformidade de 3NF porque pode ser derivado pela multiplicação do preço unitário pela quantidade, em vez de depender totalmente da chave primária. Devemos removê-lo da tabela para cumprir o terceiro formulário normal.
Na verdade, como é derivado, é melhor não armazená-lo no banco de dados.
Podemos simplesmente calculá-lo "on the fly" ao executar consultas de banco de dados. Por exemplo, podemos ter usado essa consulta anteriormente para recuperar números e totais de pedidos:
SELECT OrderNumber, Total FROM WidgetOrders
Agora podemos usar a seguinte consulta:
SELECT OrderNumber, UnitPrice * Quantidade AS Total FROM WidgetOrders
para obter os mesmos resultados sem violar as regras de normalização.