Différence entre 3NF et BCNF en termes simples (doit être capable de l'expliquer à un enfant de 8 ans)

157

J'ai lu la citation: les données dépendent de la clé [1NF], de la clé entière [2NF] et rien d'autre que de la clé [3NF] .

Cependant, j'ai du mal à comprendre 3.5NF ou BCNF comme on l'appelle. Voici ce que je comprends:

  • BCNF est plus strict que 3NF
  • le côté gauche de tout FD dans la table doit être une super-clé (ou au moins une clé candidate)

Alors pourquoi se fait-il que certaines tables 3NF ne soient pas en BCNF? Je veux dire, la citation 3NF dit explicitement "rien d'autre que la clé", ce qui signifie que tous les attributs dépendent uniquement de la clé primaire. La clé primaire est, après tout, une clé candidate jusqu'à ce qu'elle soit choisie comme clé primaire.

Si quelque chose ne va pas dans ma compréhension jusqu'à présent, veuillez me corriger et merci pour toute aide que vous pouvez fournir.

Arnab Datta
la source
C'est un sentiment si étrange que seul un manuel publié peut fournir une description concise et précise d'un concept. Si vous regardez les réponses à cette question (vraiment ancienne), vous verrez qu'aucune des questions les mieux notées n'est vague ou imprécise. Avoir une définition algébrique n'était pas le problème, comprendre le concept à travers des exemples du monde réel. Quant à la citation dans ma question initiale, google "alors aidez-moi Codd" pour trouver l'origine des citations. Il n'y a rien de vague à ce sujet.
Arnab Datta
1
D'où pensez-vous que les sources autres que les manuels tirent leurs informations? Il y a aussi beaucoup de manuels médiocres, mais les manuels sont examinés par plusieurs personnes ayant un apprentissage académique et sont beaucoup plus susceptibles de ne pas être absurdes que les interprétations des manuels par d'autres. Des notes élevées par des personnes non informées et mal informées ne corrigent pas quelque chose. J'ai fait ce commentaire là pour les gens qui sont arrivés à votre question. Cette phrase «rien que la clé» est moins qu'inutile. Le problème est certainement d'avoir une définition correcte, car «comprendre le concept» est impossible sans une.
philipxy

Réponses:

162

Votre pizza peut avoir exactement trois types de garniture:

  • un type de fromage
  • un type de viande
  • un type de légume

Nous commandons donc deux pizzas et choisissons les garnitures suivantes:

Pizza    Topping     Topping Type
-------- ----------  -------------
1        mozzarella  cheese
1        pepperoni   meat
1        olives      vegetable
2        mozzarella  meat
2        sausage     cheese
2        peppers     vegetable

Attendez une seconde, la mozzarella ne peut pas être à la fois un fromage et une viande! Et la saucisse n'est pas un fromage!

Nous devons éviter ce genre d'erreurs, faire de la mozzarella toujours du fromage. Nous devrions utiliser un tableau séparé pour cela, donc nous écrivons ce fait à un seul endroit.

Pizza    Topping
-------- ----------
1        mozzarella
1        pepperoni
1        olives
2        mozzarella 
2        sausage
2        peppers

Topping     Topping Type
----------  -------------
mozzarella  cheese
pepperoni   meat
olives      vegetable
sausage     meat
peppers     vegetable

C'était l'explication qu'un enfant de 8 ans pourrait comprendre. Voici la version la plus technique.

BCNF agit différemment de 3NF uniquement lorsqu'il y a plusieurs clés candidates qui se chevauchent.

La raison en est que la dépendance fonctionnelle X -> Y est bien sûr vraie si Yest un sous-ensemble de X. Ainsi, dans toute table qui n'a qu'une seule clé candidate et est dans 3NF, elle est déjà dans BCNF car il n'y a pas de colonne (clé ou non clé) qui dépend fonctionnellement de quoi que ce soit d'autre que cette clé.

Étant donné que chaque pizza doit avoir exactement un de chaque type de garniture, nous savons que (Pizza, Type de garniture) est une clé candidate. Nous savons aussi intuitivement qu'une garniture donnée ne peut pas appartenir à différents types simultanément. Donc (Pizza, Topping) doit être unique et est donc également une clé candidate. Nous avons donc deux clés candidates qui se chevauchent.

J'ai montré une anomalie où nous avons marqué mozarella comme le mauvais type de garniture. Nous savons que c'est faux, mais la règle qui le rend faux est une dépendanceTopping -> Topping Type qui n'est pas une dépendance valide pour BCNF pour cette table. C'est une dépendance sur autre chose qu'une clé candidate entière.

Donc, pour résoudre cela, nous retirons le type de garniture de la table Pizzas et en faisons un attribut non clé dans une table de garnitures.

Bill Karwin
la source
3
"C'est une dépendance sur autre chose qu'une clé de candidat entière." - Merci
gnsb
12
"Donc, dans n'importe quelle table qui n'a qu'une seule clé candidate et qui est dans 3NF" - Pas tout à fait. L'exemple que vous donnez remplit cette condition. Cependant, ce n'est pas un exemple 3NF car ce n'est pas 2NF. La clé (1NF), toute la clé (2NF) et rien d'autre que la clé (3NF). La clé est (Pizza, Topping), et la colonne ToppingType dépend de la clé et rien d'autre que de la clé, mais elle ne dépend pas de la clé entière. Ce n'est donc pas 2NF, et donc pas 3NF ou BCNF. C'est 1NF. Faire 2NF contournerait le problème que vous essayez d'illustrer.
Daniel Barbalace
4
@DanielBarbalace, L'intérêt de cette table est qu'elle a une clé candidate alternative pour cette table: (Pizza, ToppingType). Puisque ToppingType est un sous-ensemble de cette clé candidate, il satisfait 2NF.
Bill Karwin
6
Désolé, j'ai dû voter contre. L'exemple que vous avez montré n'est pas dans 3NF. Pour comprendre le but de BCNF, je dois voir un exemple où il est dans 3NF mais pas dans BCNF. À l'heure actuelle, je ne vois pas le but du BCNF.
Spero
5
Pourquoi cela n'est-il PAS déjà géré dans 2NF? De mon point de vue, la clé primaire de la table d'origine est Pizza + Topping, et le type de garniture dépend de Topping, donc n'est-ce pas une dépendance partielle qui devrait être prise en charge dans l'étape 2NF?
GreenPenguin
91

La différence subtile est que 3NF fait une distinction entre les attributs clés et non clés (également appelés non-premiers attributs ), contrairement à BCNF.

Ceci est mieux expliqué en utilisant la définition de Zaniolo de 3NF, qui est équivalente à celle de Codd:

Une relation, R, est dans 3NF ssi pour chaque FD non triviale (X-> A) satisfaite par R, au moins UNE des conditions suivantes est vraie:

(a) X est une super-clé pour R, ou

(b) A est un attribut clé pour R

BCNF requiert (a) mais ne traite pas (b) comme un cas particulier en soi. En d'autres termes, BCNF exige que chaque déterminant non trivial soit une super-clé, même ses attributs dépendants font partie d'une clé.

Une relation, R, est en BCNF ssi pour chaque FD non triviale (X-> A) satisfaite par R, la condition suivante est vraie:

(a) X est une super-clé pour R

BCNF est donc plus strict.

La différence est si subtile que ce que beaucoup de gens décrivent de manière informelle comme 3NF est en fait BCNF. Par exemple, vous avez déclaré ici que 3NF signifie "les données dépendent de la [des] clé [...] et rien que de la [des] clé [s]", mais c'est vraiment une description informelle de BCNF et non de 3NF. 3NF pourrait être décrit plus précisément comme des " données non clés dépendent des clés ... et rien que des clés".

Vous avez également déclaré:

la citation 3NF dit explicitement "rien d'autre que la clé", ce qui signifie que tous les attributs dépendent uniquement de la clé primaire.

C'est une simplification excessive. 3NF et BCNF et toutes les formes normales concernent toutes les clés candidates et / ou super-clés, et pas seulement une clé «primaire».

nvogel
la source
7
Sensationnel. Le professeur Zaniolo enseigne en fait ma classe (CS 143, UCLA), et je suis tombé sur cette réponse en me préparant à l'examen final. Génial de voir le nom de mon prof, et merci pour la réponse détaillée!
DV.
pouvez-vous donner un exemple de relation qui est dans 3NF mais pas dans BCNF? c'est difficile pour moi d'imaginer ...
Leo
10
R {A, B, C} où {A, B} est une clé. Etant donné la dépendance C-> B, R satisfait aux exigences de 3NF mais pas de BCNF.
nvogel
2
Clé signifie clé candidate. L' attribut clé signifie un attribut qui fait partie d'une clé candidate, AKA un attribut principal .
nvogel
3
Un attribut est premier s'il fait partie d'une clé candidate; non-prime si elle ne fait partie d'aucune clé candidate.
nvogel
26

La différence entre BCNF et 3NF

Utilisation de la définition BCNF

Si et seulement si pour chacune de ses dépendances X → Y, au moins une des conditions suivantes est vérifiée :

  • X → Y est une dépendance fonctionnelle triviale (Y ⊆ X), ou
  • X est une super clé pour le schéma R

et la définition 3NF

Si et seulement si, pour chacune de ses dépendances fonctionnelles X → A, au moins une des conditions suivantes est vérifiée:

  • X contient A (c'est-à-dire que X → A est une dépendance fonctionnelle triviale), ou
  • X est une super-clé, ou
  • Chaque élément de AX, la différence d'ensemble entre A et X, est un attribut principal (c'est-à-dire que chaque attribut de AX est contenu dans une clé candidate)

Nous voyons la différence suivante, en termes simples:

  • En BCNF : chaque clé partielle (attribut principal) ne peut dépendre que d'une super-clé,

tandis que

  • Dans 3NF : Une clé partielle (attribut premier) peut également dépendre d'un attribut qui n'est pas une super-clé (c'est-à-dire une autre clé partielle / attribut principal ou même un attribut non premier).

  1. Un attribut primordial est un attribut trouvé dans une clé candidate, et
  2. Une clé candidate est une super- minimale pour cette relation, et
  3. Une super - clé est un ensemble d'attributs d'une variable de relation pour laquelle il considère que dans toutes les relations affectées à cette variable, il n'y a pas deux tuples (lignes) distincts qui ont les mêmes valeurs pour les attributs de cet ensemble. être défini comme un ensemble d'attributs d'un schéma de relation dont tous les attributs du schéma dépendent fonctionnellement. (Une super-clé contient toujours une clé candidate / une clé candidate est toujours un sous-ensemble d'une super-clé. Vous pouvez ajouter n'importe quel attribut dans une relation pour obtenir l'une des super-clés.)

Autrement dit, aucun sous-ensemble partiel (tout sous-ensemble non trivial à l'exception de l'ensemble complet) d'une clé candidate ne peut être fonctionnellement dépendant de quoi que ce soit d'autre qu'une super-clé.

Une table / relation hors BCNF est sujette à des anomalies telles que les anomalies de mise à jour mentionnées dans l'exemple de pizza par un autre utilisateur. Malheureusement,

  • BNCF ne peut pas toujours être obtenu , alors que
  • 3NF peut toujours être obtenu .

Exemple 3NF contre BCNF

Un exemple de la différence peut actuellement être trouvé à " Table 3NF ne respectant pas BCNF (Boyce – Codd normal form) " sur Wikipedia, où le tableau suivant rencontre 3NF mais pas BCNF car "Tennis Court" (un attribut clé / prime partiel) dépend sur "Rate Type" (un attribut clé / prime partiel qui n'est pas une super-clé), qui est une dépendance que nous pourrions déterminer en demandant aux clients de la base de données, le club de tennis:

Réservations de courts de tennis d'aujourd'hui ( 3NF, pas BCNF )

Court   Start Time  End Time    Rate Type
------- ----------  --------    ---------
1       09:30       10:30       SAVER
1       11:00       12:00       SAVER
1       14:00       15:30       STANDARD
2       10:00       11:30       PREMIUM-B
2       11:30       13:30       PREMIUM-B
2       15:00       16:30       PREMIUM-A

Les super-touches de la table sont:

S1 = {Court, Start Time}
S2 = {Court, End Time}
S3 = {Rate Type, Start Time}
S4 = {Rate Type, End Time}
S5 = {Court, Start Time, End Time}
S6 = {Rate Type, Start Time, End Time}
S7 = {Court, Rate Type, Start Time}
S8 = {Court, Rate Type, End Time}
ST = {Court, Rate Type, Start Time, End Time}, the trivial superkey

Le problème 3NF : l'attribut clé / prime partielle "Court" dépend de quelque chose d'autre qu'une super-clé. Au lieu de cela, il dépend de l'attribut clé / prime partiel "Type de taux". Cela signifie que l'utilisateur doit modifier manuellement le type de taux si nous améliorons un terrain, ou changer manuellement le terrain s'il souhaite appliquer un changement de taux.

  • Mais que se passe-t-il si l'utilisateur met à niveau le court mais ne se souvient pas d'augmenter le taux? Ou que faire si le mauvais type de taux est appliqué à un tribunal?

(En termes techniques, nous ne pouvons pas garantir que la dépendance fonctionnelle "Type de tarif" -> "Cour" ne sera pas violée.)

La solution BCNF : Si nous voulons placer le tableau ci-dessus dans BCNF, nous pouvons décomposer la relation / table donnée en les deux relations / tables suivantes (en supposant que nous savons que le type de taux dépend uniquement du tribunal et du statut de membre, ce que nous pourrions découvrir en demandant aux clients de notre base de données, les propriétaires du club de tennis):

Types de taux ( BCNF et le 3NF plus faible, ce qui est impliqué par BCNF)

Rate Type   Court   Member Flag
---------   -----   -----------
SAVER       1       Yes
STANDARD    1       No
PREMIUM-A   2       Yes
PREMIUM-B   2       No

Réservations de courts de tennis d'aujourd'hui ( BCNF et le 3NF plus faible, ce qui est impliqué par BCNF)

Member Flag     Court     Start Time   End Time
-----------     -----     ----------   --------
Yes             1         09:30        10:30
Yes             1         11:00        12:00
No              1         14:00        15:30
No              2         10:00        11:30
No              2         11:30        13:30
Yes             2         15:00        16:30

Problème résolu : maintenant, si nous améliorons le terrain, nous pouvons garantir que le type de taux reflétera ce changement, et nous ne pouvons pas facturer le mauvais prix pour un terrain.

(En termes techniques, nous pouvons garantir que la dépendance fonctionnelle "Type de tarif" -> "Cour" ne sera pas violée.)

AGéoCoder
la source
6

Toutes les bonnes réponses. Pour le mettre en langage simple [BCNF] Aucune clé partielle ne peut dépendre d'une clé.

c'est-à-dire qu'aucun sous-ensemble partiel (c'est-à-dire tout sous-ensemble non trivial à l'exception de l'ensemble complet) d'une clé candidate ne peut être fonctionnellement dépendant d'une clé candidate.

smartnut007
la source
2
Pourquoi pas? Disons qu'il existe une relation R (A, B, C, D, E) et (A, B) et (C, D) sont des clés candidates. Puis AB-> D. Puisque AB est une super-clé de R, donc R devrait être dans BCNF, non? (Juste une question, essayant de comprendre cela.)
peteykun
3

Les réponses de « smartnut007 », « Bill Karwin » et « sqlvogel » sont excellentes. Pourtant, permettez-moi de lui donner une perspective intéressante.

Eh bien, nous avons des clés principales et non principales.

Lorsque nous nous concentrons sur la façon dont les non-nombres premiers dépendent des nombres premiers, nous voyons deux cas:

Les non-nombres premiers peuvent être dépendants ou non .

  • Lorsqu'elles sont dépendantes: nous voyons qu'elles doivent dépendre d'une clé candidate complète. C'est 2NF .
  • Lorsqu'il n'est pas dépendant: il peut y avoir aucune dépendance ou dépendance transitive

    • Pas même de dépendance transitive: je ne sais pas quelle théorie de normalisation aborde cela.
    • En cas de dépendance transitoire: il est jugé indésirable. C'est 3NF .

Qu'en est-il des dépendances entre les nombres premiers?

Maintenant, vous voyez, nous ne traitons pas la relation de dépendance entre les nombres premiers par le 2e ou le 3e NF. De plus, une telle dépendance, le cas échéant, n'est pas souhaitable et nous avons donc une règle unique pour y remédier. C'est BCNF .

En vous référant à l'exemple du message de Bill Karwin ici, vous remarquerez que les deux « Topping » et « Topping Type » sont des clés principales et ont une dépendance. S'ils avaient été non-nombres premiers avec dépendance, alors 3NF se serait déclenché.

Remarque:

La définition de BCNF est très générique et sans attribut de différenciation entre prime et non-premier. Pourtant, la façon de penser ci-dessus aide à comprendre comment une anomalie est percolée même après la 2e et 3e NF.

Sujet avancé: mappage du BCNF générique vers 2NF et 3NF

Maintenant que nous savons que BCNF fournit une définition générique sans référence à aucun attribut principal / non principal, voyons comment BCNF et 2/3 NF sont liés.

Premièrement, BCNF exige (autre que le cas trivial) que pour chaque dépendance fonctionnelle X -> Y(FD), X soit super-clé. Si vous considérez simplement n'importe quel FD, alors nous avons trois cas - (1) les deux X et Y non-premier, (2) les deux premiers et (3) X premier et Y non-premier, rejetant le cas (absurde) X non -prime et Y prime.

Pour le cas (1), 3NF prend en charge.

Pour le cas (3), 2NF s'occupe de.

Pour le cas (2), on retrouve l'utilisation de BCNF

KGhatak
la source
3

C'est une vieille question avec des réponses précieuses, mais j'étais encore un peu confus jusqu'à ce que je trouve un exemple réel qui montre le problème avec 3NF. Peut-être ne convient pas à un enfant de 8 ans, mais j'espère que cela aidera.

Demain, je rencontrerai les enseignants de ma fille aînée lors d'une de ces réunions trimestrielles parents / enseignants. Voici à quoi ressemble mon journal (les noms et les pièces ont été modifiés):

Teacher   | Date             | Room
----------|------------------|-----
Mr Smith  | 2018-12-18 18:15 | A12 
Mr Jones  | 2018-12-18 18:30 | B10 
Ms Doe    | 2018-12-18 18:45 | C21 
Ms Rogers | 2018-12-18 19:00 | A08 

Il n'y a qu'un seul enseignant par salle et ils ne bougent jamais. Si vous avez un coup d' oeil, vous verrez que: (1) pour chaque attribut Teacher, Date, Room, nous avons une seule valeur par ligne. (2) super-clés sont: (Teacher, Date, Room), (Teacher, Date)et (Date, Room)les touches candidats sont évidemment (Teacher, Date)et (Date, Room).

(Teacher, Room) n'est pas une super-clé car je compléterai le tableau le trimestre prochain et j'aurai peut-être une ligne comme celle-ci (Mr Smith n'a pas bougé!):

Teacher  | Date             | Room
---------|------------------| ----
Mr Smith | 2019-03-19 18:15 | A12

Que pouvons-nous conclure? (1) est une formulation informelle mais correcte de 1NF. D'après (2), nous voyons qu'il n'y a pas "d'attribut non premier": 2NF et 3NF sont donnés gratuitement.

Mon journal est 3NF. Bien! Non, pas vraiment car aucun modélisateur de données n'accepterait cela dans un schéma de base de données. L' Roomattribut dépend de l' Teacherattribut (encore une fois: les enseignants ne bougent pas!) Mais le schéma ne reflète pas ce fait. Que ferait un modélisateur de données sensé? Divisez la table en deux:

Teacher   | Date
----------|-----------------
Mr Smith  | 2018-12-18 18:15
Mr Jones  | 2018-12-18 18:30
Ms Doe    | 2018-12-18 18:45
Ms Rogers | 2018-12-18 19:00

Et

Teacher   | Room
----------|-----
Mr Smith  | A12
Mr Jones  | B10
Ms Doe    | C21
Ms Rogers | A08

Mais 3NF ne traite pas les dépendances d'attributs principaux. C'est le problème: la conformité 3NF n'est pas suffisante pour garantir une conception de schéma de table sonore dans certaines circonstances.

Avec BCNF, vous ne vous souciez pas de savoir si l'attribut est un attribut principal ou non dans les règles 2NF et 3NF. Pour chaque dépendance non triviale (les sous-ensembles sont évidemment déterminés par leurs sur-ensembles), le déterminant est une super clé complète. En d'autres termes, rien n'est déterminé par autre chose qu'une super clé complète (à l'exclusion des FD triviales). (Voir les autres réponses pour la définition formelle).

Dès que cela Roomdépend Teacher, Roomdoit être un sous-ensemble de Teacher(ce n'est pas le cas) ou Teacherdoit être une super clé (ce n'est pas le cas dans mon agenda, mais c'est le cas lorsque vous divisez la table).

Pour résumer: BNCF est plus strict, mais à mon avis plus facile à appréhender, que 3NF:

  • dans la plupart des cas, le BCNF est identique au 3NF;
  • dans d'autres cas, BCNF est ce que vous pensez / espérez que 3NF est.
jferard
la source