web-dev-qa-db-fra.com

Première forme normale, pourquoi est-ce bon et comment réduit-il la redondance

J'ai posé une question similaire sur SO et a été conseillé de poser le type de question ici. Ceci est pour un cours sur les bases de données relationnelles. Un exemple de problème pose "Comment chaque table dans une base de données relationnelle devrait-elle être dans la première forme normale "Mon premier problème avec ceci n'est pas 3NF considéré comme mieux considéré comme si la déclaration ne serait pas fausse? Mon deuxième problème avec ceci est sur SO dit que la première forme normale est bon parce qu'il élimine la redondance. Je ne vois pas comment cela fait-il parce que 1) toutes les valeurs sont atomiques 2) Il y a une clé primaire - aucun desquels ils n'éliminent la redondance.

Je suppose qu'une autre façon de demander c'est pourquoi est-il important que des valeurs soient atomiques?

6
Celeritas

L'importance primordiale de la première forme normale n'est pas si elle élimine redondance , mais elle est plutôt qu'elle élimine groupes répétitifs.

Au lieu d'avoir plusieurs colonnes du même type de données dans un enregistrement, vous supprimez les informations répétées en une relation distincte et les représentent en tant que lignes. C'est ce qui constitue 1NF.

Tables qui ont des colonnes comme: phone_1, phone_2, phone_3 ou qui contiennent des données axées sur la liste comme: 212-555-1212, 212-555-1234, 416-967-1111 violer 1nf.

1nf est important car il est beaucoup plus flexible que 0NF tout en étant beaucoup plus facile à utiliser lors de l'insertion, de la mise à jour et de la lecture de données. En effet, chaque type d'élément de données (par exemple le numéro de téléphone du client) dispose d'une colonne exacte dans laquelle le trouver et que la colonne n'a qu'une donnée pour chaque enregistrement. Cela signifie que vous pouvez utiliser de simples instructions SQL pour lire ou écrire des éléments de données individuels sans avoir à analyser des cordes délimitées ou d'utiliser des constructions telles que: where phone_1=@Number or phone_2=@Number or phone_3=@Number et ainsi de suite.

En ce qui concerne 1NF VS 3NF, les formes normales sont cumulatives. Une table en 3NF est également en 1NF, il est donc aussi vrai de dire que "chaque table dans une base de données relationnelle devrait être en 1NF", car c'est-à-dire que "chaque table dans une base de données relationnelle devrait être en 3NF". Je dirais que ces deux sont vraies, mais j'ajouterais "Sauf si vous avez une raison vraiment bonne et bien considérée comme désinormalize" .

8
Joel Brown

"Je suppose qu'une autre façon de demander que c'est pourquoi est-il important que les valeurs soient atomiques?"

Je travaille actuellement avec des applications qui ont des valeurs séparées par des virgules dans les champs Varcharchar/Text, et c'est une douleur dans le cul. Entre autres choses, dans l'application, vous devez faire tous les enfants de la scission de chaîne idiote et de convertir pour obtenir les données sur la forme correcte, et sur le côté DB, vous ne pouvez pas utiliser d'index sur le terrain, car toutes les recherches doivent être activées. la forme où mycolumn aime "% de recherche%"

Il y a aussi d'autres raisons, mais ces deux sont à l'esprit en premier.

2
Petter Brodin

1nf élimine la redondance et contribue également à réduire ou à éliminer les problèmes de cohérence des données.

Supposons que vous avez une table de Invoices, qui contient des données de paiement ainsi que des données client.

Les données client sont des informations telles que Name, Address, PhoneNumber, etc. Si vous dupliquez ces données sur chaque rangée ...

  • Les données sont probablement redondantes (car vous avez les mêmes détails dans chaque enregistrement Invoice pour le même Customer
  • Les données pourraient potentiellement devenir incompatibles. Si j'ai deux valeurs différentes Address pour le même Customer, lequel est correct?
  • Les données sont moins logiques/intuitivement organisées. Si vous souhaitez envoyer un client une promotion, il serait plus logique de vérifier une table Address que de vérifier la table Invoice pour une adresse actuelle.
0
JNK