web-dev-qa-db-fra.com

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

Dans la conception de bases de données relationnelles, il existe un concept de normalisation de base de données, ou simplement de normalisation, qui consiste à organiser les colonnes (attributs) et les tables (relations) afin de réduire la redondance des données et d'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 sur la base d’exemples sur ce que signifient 1NF, 2NF, 3NF, voire 3.5NF (Boyce-Codd).

266
barfoon

1NF est la forme la plus élémentaire des formes normales - chaque cellule d’un tableau ne doit contenir qu’une information et il ne peut y avoir de lignes en double.

2NF et 3NF sont tous sur le fait de dépendre de la clé primaire. Rappelez-vous qu'une clé primaire peut être composée de plusieurs colonnes. Comme Chris l'a dit dans sa réponse:

Les données dépendent de la clé [1NF], de la clé entière [2NF] et de rien que de la clé [3NF] (aidez-moi donc Codd ).

2NF

Supposons que vous ayez un tableau contenant les cours suivis au cours d’un semestre donné et que vous disposiez des 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   |

Ceci est pas dans 2NF , car la quatrième colonne ne repose pas sur la clé entière - mais seulement une partie de celui-ci. Le nom du cours dépend de l'identifiant du cours, mais n'a aucun rapport avec le semestre auquel il est inscrit. Ainsi, comme vous pouvez le constater, nous avons des informations en double. Plusieurs lignes nous indiquent que IT101 est en cours de programmation et IT102, en tant que bases de données. Nous résolvons donc cela en déplaçant le nom du cours dans une autre table, où CourseID est la clé ENTIER.

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 et quelques détails à leur sujet 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, espérons-le, il devrait être évident que TeacherName dépend de TeacherID - ce n'est donc pas dans 3NF . Pour résoudre ce problème, nous faisons à peu près la même chose que dans 2NF: supprimons le champ TeacherName de ce tableau et le plaçons dans son propre nom, qui a pour identifiant 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 dans 1NF, ce n'est pas non plus dans 2NF ou 3NF. Ainsi, chaque forme normale supplémentaire requiert tout que les formes normales inférieures avaient, plus quelques conditions supplémentaires, qui doivent tout être remplies.

423
Smashery

Je n'ai jamais eu une bonne mémoire pour la formulation exacte, mais dans mon cours de base de données, je pense que le professeur a toujours dit quelque chose comme:

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

116
Chris Shaffer

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

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

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

3NF: Chaque colonne de votre table concerne uniquement la clé de votre table. Vous ne devriez pas avoir de colonne dans une table qui décrit une autre colonne de votre table qui n'est pas la clé.

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

44
Dave Markle

1NF: une seule valeur par colonne

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

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

J'ai écrit un article plus en détail sur ici

31
Arcturus