41 votes

Je voudrais comprendre 6NF à l'aide d'un exemple.

Je viens de lire les arguments de @PerformanceDBA concernant : 6NF et E-A-V. Je suis intrigué. J'étais auparavant sceptique à l'égard de 6NF car il était présenté comme un "simple" collage de quelques colonnes d'horodatage sur les tables.

J'ai toujours travaillé avec un dictionnaire de données et je n'ai pas besoin d'être convaincu d'en utiliser un, ou de générer du code SQL. J'attends donc une réponse qui nécessiterait un dictionnaire (ou un catalogue) utilisé pour générer du code.

J'aimerais donc savoir comment la 6NF traiterait une extrêmement simple exemple. Un tableau d'articles, de descriptions et de prix. Les prix changent au fil du temps.

Bref, à quoi ressemble le tableau des éléments une fois converti en 6NF ? Quelle est l'"explosion de tableaux" qui se produit ici ?

Si l'exemple ne fonctionne pas avec un tableau aussi simple, n'hésitez pas à ajouter ce qui est nécessaire pour faire passer le message.

42voto

PerformanceDBA Points 9613

J'ai en fait commencé à élaborer une réponse, mais je me suis heurté à des complications, car vous voulez (et c'est bien compréhensible) un exemple simple. Le problème est multiple.

Tout d'abord, je n'ai pas une bonne idée de votre niveau d'expertise réel en matière de bases de données relationnelles et de 5NF ; je n'ai pas de point de départ pour reprendre et discuter ensuite des spécificités de 6NF,

Deuxièmement, comme toutes les autres FN, elle est bigarrée. Vous pouvez à peine vous y aventurer ; vous pouvez mettre en œuvre la 6NF pour certaines tables ; vous pouvez vous lancer à fond dans toutes les tables, etc. Bien sûr, il y a une explosion de tables, mais ensuite vous les normalisez, et tuez l'explosion ; c'est une implémentation avancée ou mature de la 6NF. Il est inutile de fournir les niveaux complets ou partiels de la 6NF, alors que vous demandez l'exemple le plus simple et le plus direct.

J'espère que vous comprenez que certaines tables peuvent être "en 5NF" alors que d'autres sont "en 6NF".

Alors j'en ai fait un pour toi. Mais même cela nécessite une explication.

Maintenant, SQL supporte à peine 5NF, il ne supporte pas du tout 6NF (je pense que dportas dit la même chose avec des mots différents). J'implémente maintenant 6NF à un niveau profond, pour des raisons de performance, de pivotement simplifié (de tables entières ; toutes les colonnes et n'importe lesquelles, pas la stupide fonction PIVOT de MS), d'accès en colonnes, etc. Pour cela, vous avez besoin d'un catalogue complet, qui est une extension du catalogue SQL, pour prendre en charge la 6NF que SQL ne prend pas en charge, et maintenir l'intégrité des données et les règles commerciales. Donc, vous ne voulez vraiment pas mettre en œuvre 6NF pour le plaisir, vous ne le faites que si vous en avez besoin, parce que vous devez mettre en œuvre un catalogue. (C'est ce que la foule EAV ne fait pas, et c'est pourquoi la plupart des systèmes EAV ont des problèmes d'intégrité des données. La plupart d'entre eux n'utilisent pas le déclaratif Référentiel et intégrité des données que SQL possède).

Mais la plupart des personnes qui mettent en œuvre le 6NF ne mettent pas en œuvre le niveau le plus profond, avec un catalogue complet. Ils ont des besoins plus simples, et mettent donc en œuvre un niveau moins profond de 6NF. Prenons donc ce cas de figure, pour vous donner un exemple simple. Commençons par une table de produits ordinaire qui est déclarée être en 5NF (et ne discutons pas de ce qu'est la 5NF). L'entreprise vend différents types de produits, la moitié des colonnes sont obligatoires, et l'autre moitié est facultative, ce qui signifie que, selon le type de produit, certaines colonnes peuvent être nulles. Bien qu'ils aient fait un bon travail avec la base de données, les Nuls sont maintenant un gros problème : les colonnes qui ne devraient pas être Nuls pour certains ProductTypes sont Nuls, parce que la déclaration indique NULL, et leur code d'application est aussi bon que celui du voisin.

Ils décident donc d'opter pour 6NF pour résoudre ce problème, car le sous-titre de 6NF indique qu'elle élimine le problème de la nullité . La sixième forme normale est la forme normale irréductible, il n'y aura pas d'autres formes normales après celle-ci, car les données ne peuvent pas être normalisées davantage. Les lignes ont été normalisées au plus haut degré. La définition de 6NF est :

une table est en 6NF lorsque la ligne contient la clé primaire et au maximum un attribut.

Notez que par cette définition, des millions de tables à travers la planète sont déjà en 6NF, sans avoir eu cette intention. Par exemple, les tables de référence ou de consultation typiques, avec juste un PK et une description.

Bien. Eh bien, nos amis regardent leur table Produit, qui a huit attributs non clés, donc s'ils font la table Produit 6NF, ils auront huit tables sous-Produit. Ensuite, il y a le problème que certaines colonnes sont des clés étrangères pour d'autres tables, ce qui entraîne d'autres complications. Enfin, ils constatent que SQL ne prend pas en charge ce qu'ils font, et ils doivent construire un petit catalogue. Huit tables, c'est correct, mais ce n'est pas raisonnable. Leur but était de se débarrasser des Nulls, pas d'écrire un petit sous-système autour de chaque table.

Exemple simple de 6NF

Les lecteurs qui ne sont pas familiers avec la norme de modélisation des bases de données relationnelles peuvent trouver que Notation IDEF1X utile afin d'interpréter les symboles de l'exemple.

Donc, typiquement, la table des produits conserve toutes les colonnes obligatoires, en particulier les FK, et chaque colonne optionnelle, chaque colonne annulable, est placée dans une table de sous-produits distincte. C'est la forme la plus simple que j'ai vue. Cinq tables au lieu de huit. Dans le modèle, les quatre tables de sous-produits sont "en 6NF" ; la table principale du produit est "en 5NF".

Maintenant, nous n'avons vraiment pas besoin que chaque segment de code qui SELECT à partir de Product doive comprendre quelles colonnes il doit construire, sur la base du ProductType, etc., donc nous fournissons une vue, qui fournit essentiellement la "vue" 5NF du cluster de table Product.

Nous avons ensuite besoin des rudiments d'une extension du catalogue SQL, afin de garantir que les règles (intégrité des données) pour les différents types de produits sont maintenues en un seul endroit, dans la base de données, et ne dépendent pas du code de l'application. Le catalogue le plus simple possible. Il est piloté par ProductType, et ProductType fait maintenant partie de ces métadonnées. Vous pouvez consulter le site peut mettre en œuvre cette structure simple sans catalogue, mais je ne le recommanderais pas.

Mise à jour

Il est important de noter que je mets en œuvre todo Règles commerciales dans la base de données. Sinon, ce n'est pas une base de données (la notion d'implémentation des règles "dans le code de l'application" est hilarante à l'extrême, surtout de nos jours, où des fleuristes travaillent comme "développeurs"). Par conséquent, toutes les règles, etc. sont d'abord et avant tout mises en œuvre en tant que déclarations SQL, contraintes CHECK, fonctions, etc. Cela préserve toute l'intégrité référentielle déclarative, et l'intégrité déclarative des données. L'extension au catalogue SQL couvre le domaine que SQL n'a pas déclarations et ils sont ensuite implémentés en tant que SQL. Etant un bon dictionnaire de données, il fait beaucoup plus. Par exemple, je n'écris pas de vues à chaque fois que je modifie les tables ou que j'ajoute ou modifie des colonnes ou leurs caractéristiques, elles sont créées directement à partir du catalogue+extension en utilisant un simple générateur de code.

Une autre note très importante. Vous ne pouvez pas mettre en œuvre 6NF (ou EAV correctement, d'ailleurs), sans effectuer un exercice de normalisation complet et fidèle à 5NF. Le problème que je vois sur tous les sites est qu'ils n'ont pas un véritable état 5NF, ils ont un mélange de normalisation partielle ou pas de normalisation du tout, mais ils sont très attachés à cela. Créer 6NF ou EAV à partir de ça est un désastre. Créer EAV ou 6NF à partir de cela sans toutes les règles de gestion implémentées en SQL déclaratif est une catastrophe nucléaire, qui brûle depuis des années. Vous obtenez ce pour quoi vous payez.

Mise à jour de la fin.

Enfin, oui, il existe au moins quatre autres niveaux de normalisation (la normalisation est un principe, et non une simple référence à une forme normale), qui peuvent être appliqués à ce simple groupe de produits 6NF, fournissant plus de contrôle, moins de tableaux, etc. Plus nous allons en profondeur, plus le catalogue est étendu. Et des niveaux de performance plus élevés. Lorsque vous êtes prêt, il suffit de demander, j'ai déjà érigé les modèles et posté les détails dans d'autres réponses.

30voto

sqlvogel Points 12567

En bref, la 6NF signifie que chaque relation est constituée d'une clé candidate et d'un seul autre attribut (clé ou non). Pour reprendre votre exemple, si un "article" est identifié par un ProductCode et que les autres attributs sont la description et le prix, un schéma 6NF consisterait en deux relations (* désigne la clé de chacune) :

ItemDesc {ProductCode*, Description}
ItemPrice {ProductCode*, Price}

Il s'agit d'une approche potentiellement très flexible car elle minimise les dépendances. Mais c'est aussi son principal inconvénient, surtout dans une base de données SQL. SQL rend difficile, voire impossible, l'application de nombreuses contraintes multi-tables. En utilisant le schéma ci-dessus, dans la plupart des cas, il ne sera pas possible d'appliquer une règle de gestion selon laquelle chaque produit doit toujours avoir une description ET un prix. De même, il se peut que vous ne puissiez pas faire respecter certaines clés composées qui devraient s'appliquer (parce que leurs attributs pourraient être répartis sur plusieurs tables).

En considérant 6NF, vous devez donc évaluer quelles dépendances et règles d'intégrité sont importantes pour vous. Dans de nombreux cas, vous pouvez trouver plus pratique et plus utile de vous en tenir à 5NF et de ne pas normaliser plus loin que cela.

6voto

onedaywhen Points 24594

J'étais auparavant sceptique quant à 6NF. car il était présenté comme étant "simplement" coller quelques colonnes d'horodatage sur tables.

Je ne sais pas vraiment d'où vient cette idée fausse apparente. Peut-être le fait que 6NF a été introduit dans le livre "Temporal Data and The Relational Mode" de Date, Darwen et Lorentzos ? Quoi qu'il en soit, j'espère que les autres réponses ont clarifié le fait que 6NF n'est pas limité aux bases de données temporelles.

Ce que je voulais dire, c'est que, bien que la 6NF soit "académiquement respectable" et toujours réalisable, elle ne conduit pas nécessairement à la conception optimale dans tous les cas (et pas seulement lors de la mise en œuvre en utilisant SQL). Même les découvreurs et les partisans de la 6NF mentionnés plus haut semblent être d'accord avec cette affirmation.

Chris Date : "Pour des raisons pratiques, restez-en à 5NF (et 6NF)."

Hugh Darwen : " la décomposition 6NF autour de Date [pas la personne !] serait excessive... une conception optimale pour le club de foot est.... 5-et-un-bit-NF !"

Hugh Darwen : "nous sommes en 5NF mais pas en 6NF, et encore une fois 5NF est suffisant" (plusieurs exemples similaires).

Mais je peux aussi trouver des preuves du contraire :

Chris Date : "Darwen et moi pensons tous deux depuis un certain temps que toutes les relvars de base devraient être en 6NF".

D'un point de vue pratique, j'ai récemment étendu le schéma SQL de l'un de nos produits pour ajouter une fonctionnalité mineure. J'ai adopté une 6NF pour éviter les colonnes nullables et je me suis retrouvé avec six nouvelles tables alors que la plupart (tous ?) de mes collègues auraient utilisé une seule table (ou peut-être étendu une table existante) avec des colonnes nullables. Bien que j'aie prouvé l'existence de plusieurs procs stockées " d'aide " et d'un processus " dénormalisé ", je n'ai pas réussi à obtenir un résultat satisfaisant. VIEW avec un INSTEAD OF les déclencheurs, tous les codeurs qui ont dû travailler avec cette fonctionnalité au niveau SQL ont fait tout leur possible pour me maudire :)

3voto

Brian Points 66

Ces gars-là ont tout compris : Modélisation de l'ancrage . D'excellents documents universitaires sur le sujet, accompagnés d'exemples pratiques. Leurs écrits m'ont finalement poussé à envisager la construction d'un site Web. DW dans 6nf sur un projet à venir. Le site POC Le travail que j'ai effectué a validé (pour moi, du moins) que les énormes avantages de 6nf ne compensent pas les coûts.

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