Mettre une base de données en troisième forme normale (3NF)

La troisième forme normale (3NF) est un principe de base de données qui prend en charge l'intégrité des données en s'appuyant sur les principes de normalisation de base de données fournis par la première forme normale (1NF) et la deuxième forme normale (2NF).

Troisième exigence de forme normale

Il y a deux conditions de base pour qu'une base de données soit en troisième forme normale:

À propos de la dépendance de la clé primaire

Examinons plus loin ce que nous entendons par le fait que toutes les colonnes doivent dépendre de la clé primaire.

Si la valeur d'une colonne peut être dérivée à la fois de la clé primaire et d'une autre colonne de la table, elle enfreint 3NF. Considérez une table Employés avec ces colonnes:

Est-ce que LastName et FirstName dépendent uniquement de la valeur de EmployeeID? Eh bien, LastName peut-il dépendre de FirstName? Non, car rien de ce qui est inhérent à LastName ne suggère la valeur de FirstName. FirstName peut-il dépendre de LastName? Pas encore, parce que la même chose est vraie: quel que soit un LastName, il ne pourrait pas fournir un indice quant à la valeur de FirstName. Par conséquent, cette table est conforme 3NF.

Mais considérez cette table de véhicules:

Le fabricant et le modèle pourraient provenir du VehicleID - mais le modèle pourrait également provenir du fabricant parce qu'un modèle de véhicule est fabriqué uniquement par un fabricant particulier. Cette conception de table n'est pas conforme à la norme 3NF et pourrait donc entraîner des anomalies de données. Par exemple, vous pouvez mettre à jour le fabricant sans mettre à jour le modèle, en introduisant des inexactitudes.

Pour le rendre conforme, nous devons déplacer la colonne dépendante supplémentaire vers une autre table et la référencer en utilisant une clé étrangère. Cela entraînerait deux tables:

Table des véhicules

Dans le tableau ci-dessous, ModelID est une clé étrangère de la table Models :

Table des modèles

Ce nouveau tableau mappe les modèles aux fabricants. Si vous souhaitez mettre à jour les informations spécifiques à un modèle, vous le feriez dans cette table plutôt que dans la table Véhicules.

Champs dérivés dans le modèle 3NF

Une table peut contenir un champ dérivé - celui qui est calculé en fonction d'autres colonnes de la table. Par exemple, considérez cette table des commandes de widget:

Le total rompt la conformité 3NF parce qu'il peut être obtenu en multipliant le prix unitaire par la quantité, plutôt que d'être entièrement dépendant de la clé primaire. Nous devons l'enlever de la table pour se conformer à la troisième forme normale.

En fait, comme il est dérivé, il est préférable de ne pas le stocker dans la base de données.

Nous pouvons simplement le calculer "à la volée" lors de l'exécution de requêtes de base de données. Par exemple, nous avons déjà utilisé cette requête pour récupérer des numéros de commande et des totaux:

SELECT OrderNumber, Total FROM WidgetOrders

Nous pouvons maintenant utiliser la requête suivante:

SELECT OrderNumber, UnitPrice * Quantité AS Total FROM WidgetOrders

pour atteindre les mêmes résultats sans violer les règles de normalisation.