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.
database
relational-database
database-normalization
3nf
Arnab Datta
la source
la source
Réponses:
Votre pizza peut avoir exactement trois types de garniture:
Nous commandons donc deux pizzas et choisissons les garnitures suivantes:
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.
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 siY
est un sous-ensemble deX
. 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épendance
Topping -> 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.
la source
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:
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é.
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é:
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».
la source
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 :
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:
Nous voyons la différence suivante, en termes simples:
tandis que
Où
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,
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 )
Les super-touches de la table sont:
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.
(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)
Réservations de courts de tennis d'aujourd'hui ( BCNF et le 3NF plus faible, ce qui est impliqué par BCNF)
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.)
la source
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.
la source
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'il n'est pas dépendant: il peut y avoir aucune dépendance ou dépendance transitive
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
la source
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):
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é!):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'
Room
attribut dépend de l'Teacher
attribut (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:Et
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
Room
dépendTeacher
,Room
doit être un sous-ensemble deTeacher
(ce n'est pas le cas) ouTeacher
doit ê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:
la source