287 votes

Que sont les formes normales des bases de données et pouvez-vous donner des exemples ?

Dans la conception des bases de données relationnelles, il existe un concept de normalisation de la base de données ou simplement de normalisation, qui est un processus d'organisation des colonnes (attributs) et des tables (relations) pour réduire la redondance des données et améliorer leur intégrité. (comme écrit sur Wikipedia ).

Comme la plupart des articles sont quelque peu techniques et donc plus difficiles à comprendre, je demande à quelqu'un d'écrire une explication plus facile à comprendre, basée sur des exemples, de ce que signifie 1NF, 2NF, 3NF, voire 3,5NF (Boyce-Codd).

446voto

Smashery Points 13208

1NF est la forme normale la plus élémentaire : chaque cellule d'un tableau ne doit contenir qu'un seul élément d'information et il ne peut y avoir de lignes en double.

2NF et 3NF ont pour but de dépendre de la clé primaire. Rappelons qu'une clé primaire peut être constituée de plusieurs colonnes. Comme Chris l'a dit dans sa réponse :

Les données dépendent de la clé [1NF], de toute la clé [2NF] et de rien d'autre que la clé [3NF] (alors aidez-moi Codd ).

2NF

Supposons que vous disposiez d'une table contenant les cours suivis au cours d'un semestre donné et que vous ayez les données suivantes :

|-----Primary Key----|               uh oh |
                                           V
CourseID | SemesterID | #Places  | Course Name  |
------------------------------------------------|
IT101    |   2009-1   | 100      | Programming  |
IT101    |   2009-2   | 100      | Programming  |
IT102    |   2009-1   | 200      | Databases    |
IT102    |   2010-1   | 150      | Databases    |
IT103    |   2009-2   | 120      | Web Design   |

C'est pas dans 2NF parce que la quatrième colonne ne s'appuie pas sur l'indice de confiance. tout le site mais seulement une partie de celle-ci. Le nom du cours dépend de l'ID du cours, mais n'a rien à voir avec le semestre au cours duquel il a été suivi. Ainsi, comme vous pouvez le constater, nous avons des informations en double - plusieurs lignes nous indiquant que IT101 est un cours de programmation, et IT102 un cours de bases de données. Nous corrigeons donc ce problème en déplaçant le nom du cours dans une autre table, où CourseID est la clé ENTIÈRE.

Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |

Pas de redondance !

3NF

Bon, disons que nous ajoutons également le nom de l'enseignant du cours, ainsi que certains détails le concernant, dans le SGBDR :

|-----Primary Key----|                           uh oh |
                                                       V
Course  |  Semester  |  #Places   |  TeacherID  | TeacherName  |
---------------------------------------------------------------|
IT101   |   2009-1   |  100       |  332        |  Mr Jones    |
IT101   |   2009-2   |  100       |  332        |  Mr Jones    |
IT102   |   2009-1   |  200       |  495        |  Mr Bentley  |
IT102   |   2010-1   |  150       |  332        |  Mr Jones    |
IT103   |   2009-2   |  120       |  242        |  Mrs Smith   |

Maintenant, nous espérons qu'il est évident que TeacherName dépend de TeacherID - donc ceci est pas dans 3NF . Pour résoudre ce problème, nous faisons à peu près la même chose que dans 2NF : nous retirons le champ TeacherName de cette table et nous le plaçons dans sa propre table, dont la clé est TeacherID.

 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |

Pas de redondance !

Une chose importante à retenir est que si quelque chose n'est pas en 1NF, il n'est pas non plus en 2NF ou 3NF. Ainsi, chaque forme normale supplémentaire nécessite tout que les formes normales inférieures avaient, plus quelques conditions supplémentaires, qui doivent todo se réaliser.

1 votes

Merci pour cet article - c'est exactement ce que je cherchais. Dans l'exemple 2NF, comment le nom du cours dépend-il de l'ID du cours ? Comment le nom du professeur dépend-il de l'identifiant ?

9 votes

Pensez-y en termes de relation entre les choses. Si je vous demande "quel est le nom du cours dont l'identifiant est IT101 ?", vous pouvez me donner une réponse, non ? De même, si je vous demande "quel professeur a l'ID 332 ?", vous pouvez me dire de quel professeur il s'agit. Ainsi, le nom du cours dépend de son ID.

9 votes

Cependant, vous ne pouvez pas faire l'inverse. Si je vous demandais "Quel est l'identifiant de M. Dupont ?", vous ne seriez pas en mesure de donner une réponse unique, car il peut y avoir deux M. Dupont. L'identifiant ne dépend donc pas du nom, c'est le nom qui dépend de l'identifiant.

125voto

Chris Shaffer Points 18066

Je n'ai jamais eu une bonne mémoire pour les formulations exactes, mais dans mon cours sur les bases de données, je pense que le professeur disait toujours quelque chose comme :

Les données dépendent de la clé [1NF], de la clé entière [2NF] et de rien d'autre que la clé [3NF].

75 votes

...alors aidez-moi Codd. fr.wikipedia.org/wiki/Ted_Codd

7 votes

Alors quelle est la différence entre The data depends on the key [1NF], nothing but the key [3NF] ? Ne nous embrouillez pas, car une réponse en une phrase ne clarifie pas la réponse mais embrouille les visiteurs !

2 votes

"chaque cellule d'un tableau ne doit contenir qu'un seul élément d'information, et il ne peut y avoir de doublons dans les lignes". - Je ne vois pas comment "Les données dépendent de la clé" correspond à tout cela.

51voto

Dave Markle Points 44637

Voici un rapide, certes massacré réponse, mais dans une phrase :

1NF : Votre tableau est organisé comme un tableau non ordonné. set de données, et il n'y a pas de colonnes répétitives.

2NF : Vous ne répétez pas les données d'une colonne de votre tableau à cause d'une autre colonne.

3NF : Chaque colonne de votre table ne concerne que la clé de votre table - vous n'auriez pas une colonne dans une table qui décrit une autre colonne dans votre table qui n'est pas la clé.

Pour plus de détails, voir wikipedia...

2 votes

Pour autant que je puisse dire, l'évitement par 1NF de la notion de répétition de groupes ne fait pas référence à des colonnes répétitives, mais plutôt à des colonnes uniques colonnes qui représentent un nombre arbitraire de valeurs répétées pour le même attribut, c'est-à-dire qu'elles ne sont pas atomiques. Je me base pour cela sur, par exemple, (1) stackoverflow.com/questions/23194292/ / (2) stackoverflow.com/questions/26357276/

38voto

Arcturus Points 417

1NF : Une seule valeur par colonne

2NF : Toutes les colonnes non primaires de la table doivent dépendre de la clé primaire entière.

3NF : Toutes les colonnes non primaires de la table doivent dépendre DIRECTEMENT de la clé primaire entière.

J'ai écrit un article plus détaillé sur aquí

0 votes

Parce que vous n'avez pas fourni d'attribution. J'ai édité la réponse pour fournir l'attribution.

0 votes

Dans la mesure du possible, incluez l'exemple dans la réponse elle-même. Un utilisateur occasionnel doit pouvoir lire votre réponse et en retirer quelque chose sans avoir à cliquer sur le lien du blog. En d'autres termes, la réponse doit être autonome.

0 votes

Je vais garder cela à l'esprit. Merci :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X