Ich habe das Zitat gelesen: Daten hängen vom Schlüssel [1NF], dem gesamten Schlüssel [2NF] und nichts als dem Schlüssel [3NF] ab .
Ich habe jedoch Probleme, 3.5NF oder BCNF, wie es heißt, zu verstehen. Folgendes verstehe ich:
- BCNF ist strenger als 3NF
- Die linke Seite eines FD in der Tabelle muss ein Superkey (oder zumindest ein Kandidatenschlüssel) sein.
Warum befinden sich dann einige 3NF-Tabellen nicht in BCNF? Ich meine, das 3NF-Zitat sagt explizit "nichts als den Schlüssel", was bedeutet, dass alle Attribute ausschließlich vom Primärschlüssel abhängen. Der Primärschlüssel ist schließlich ein Kandidatenschlüssel, bis er als unser Primärschlüssel ausgewählt wird.
Wenn etwas in Bezug auf mein bisheriges Verständnis nicht stimmt, korrigieren Sie mich bitte und bedanken Sie sich für jede Hilfe, die Sie leisten können.
database
relational-database
database-normalization
3nf
Arnab Datta
quelle
quelle
Antworten:
Ihre Pizza kann genau drei Belagsarten haben:
Also bestellen wir zwei Pizzen und wählen die folgenden Beläge:
Moment mal, Mozzarella kann nicht gleichzeitig Käse und Fleisch sein! Und Wurst ist kein Käse!
Wir müssen diese Art von Fehlern vermeiden, damit Mozzarella immer Käse ist. Wir sollten dafür eine separate Tabelle verwenden, also schreiben wir diese Tatsache nur an einer Stelle auf.
Das war die Erklärung, die ein 8-Jähriger verstehen könnte. Hier ist die technischere Version.
BCNF verhält sich nur dann anders als 3NF, wenn sich mehrere Kandidatenschlüssel überlappen.
Der Grund ist, dass die funktionale Abhängigkeit
X -> Y
natürlich wahr ist, wennY
es sich um eine Teilmenge von handeltX
. In jeder Tabelle, die nur einen Kandidatenschlüssel enthält und sich in 3NF befindet, befindet sie sich bereits in BCNF, da es keine Spalte (weder Schlüssel noch Nichtschlüssel) gibt, die funktional von etwas anderem als diesem Schlüssel abhängig ist.Da jede Pizza genau einen von jedem Belagstyp haben muss, wissen wir, dass (Pizza, Belagstyp) ein Kandidatenschlüssel ist. Wir wissen auch intuitiv, dass ein gegebener Belag nicht gleichzeitig zu verschiedenen Typen gehören kann. Also (Pizza, Topping) muss eindeutig sein und ist daher auch ein Kandidatenschlüssel. Wir haben also zwei überlappende Kandidatenschlüssel.
Ich zeigte eine Anomalie, bei der wir Mozarella als den falschen Belagstyp markierten. Wir wissen, dass dies falsch ist, aber die Regel, die es falsch macht, ist eine Abhängigkeit,
Topping -> Topping Type
die für diese Tabelle keine gültige Abhängigkeit für BCNF ist. Es ist eine Abhängigkeit von etwas anderem als einem ganzen Kandidatenschlüssel.Um dies zu lösen, nehmen wir Topping Type aus der Pizzas-Tabelle und machen es zu einem Nicht-Schlüsselattribut in einer Toppings-Tabelle.
quelle
Der subtile Unterschied besteht darin, dass 3NF zwischen Schlüssel- und Nicht-Schlüsselattributen (auch als Nicht-Primat- Attribute bezeichnet) unterscheidet, während BCNF dies nicht tut.
Dies lässt sich am besten mit Zaniolos Definition von 3NF erklären , die der von Codd entspricht:
BCNF erfordert (a), behandelt (b) jedoch nicht als eigenen Sonderfall. Mit anderen Worten, BCNF erfordert, dass jede nichttriviale Determinante ein Superkey ist, selbst wenn ihre abhängigen Attribute Teil eines Schlüssels sind.
BCNF ist daher strenger.
Der Unterschied ist so subtil, dass das, was viele Leute informell als 3NF beschreiben, tatsächlich BCNF ist. Zum Beispiel haben Sie hier angegeben, dass 3NF bedeutet "Daten hängen von den Schlüsseln ab ... und nichts als den Schlüsseln", aber das ist wirklich eine informelle Beschreibung von BCNF und nicht von 3NF. 3NF könnte genauer als " Nicht-Schlüsseldaten" beschrieben werden hängen von den Schlüsseln ab ... und nichts als den Schlüsseln".
Sie sagten auch:
Das ist eine Vereinfachung. 3NF und BCNF sowie alle Normalformen betreffen alle Kandidatenschlüssel und / oder Superschlüssel, nicht nur einen "Primärschlüssel".
quelle
Der Unterschied zwischen BCNF und 3NF
Verwenden der BCNF-Definition
Wenn und nur wenn für jede seiner Abhängigkeiten X → Y, gilt mindestens eine der folgenden Bedingungen :
und die 3NF-Definition
Wenn und nur wenn für jede seiner funktionalen Abhängigkeiten X → A mindestens eine der folgenden Bedingungen gilt:
Wir sehen den folgenden Unterschied in einfachen Worten:
wohingegen
Wo
Das heißt, keine Teiluntermenge (jede nicht triviale Untermenge mit Ausnahme der vollständigen Menge) eines Kandidatenschlüssels kann funktional von etwas anderem als einem Superschlüssel abhängig sein.
Eine Tabelle / Beziehung, die nicht in BCNF enthalten ist, unterliegt Anomalien wie den im Pizza-Beispiel von einem anderen Benutzer erwähnten Aktualisierungsanomalien. Unglücklicherweise,
3NF versus BCNF Beispiel
Ein Beispiel für den Unterschied finden Sie derzeit bei " 3NF-Tabelle entspricht nicht BCNF (Boyce-Codd-Normalform) " auf Wikipedia, wo die folgende Tabelle 3NF, jedoch nicht BCNF erfüllt, da "Tennisplatz" (ein Teilschlüssel- / Primattribut) davon abhängt zu "Rate Type" (ein Teilschlüssel- / Primattribut, das kein Superkey ist), eine Abhängigkeit, die wir ermitteln können, indem wir die Kunden der Datenbank, den Tennisclub, fragen:
Heutige Tennisplatzbuchungen ( 3NF, nicht BCNF )
Die Superkeys des Tisches sind:
Das 3NF-Problem : Das Teilschlüssel- / Primattribut "Court" hängt von etwas anderem als einem Superkey ab. Stattdessen ist es abhängig vom Teilschlüssel- / Primatattribut "Rate Type". Dies bedeutet, dass der Benutzer den Tariftyp manuell ändern muss, wenn wir ein Gericht aktualisieren, oder das Gericht manuell ändern muss, wenn er eine Tarifänderung anwenden möchte.
(In technischer Hinsicht können wir nicht garantieren, dass die funktionale Abhängigkeit von "Rate Type" -> "Court" nicht verletzt wird.)
Die BCNF-Lösung : Wenn wir die obige Tabelle in BCNF platzieren möchten, können wir die angegebene Beziehung / Tabelle in die folgenden zwei Beziehungen / Tabellen zerlegen (vorausgesetzt, wir wissen, dass der Tarif nur vom Gericht und dem Mitgliedschaftsstatus abhängt, was wir könnten Entdecken Sie dies, indem Sie die Kunden unserer Datenbank, die Eigentümer des Tennisclubs, fragen:
Rate Types ( BCNF und der schwächere 3NF, was durch BCNF impliziert wird)
Heutige Tennisplatzbuchungen ( BCNF und der schwächere 3NF, der von BCNF impliziert wird)
Problem gelöst : Wenn wir jetzt das Gericht aufrüsten, können wir garantieren, dass die Tarifart diese Änderung widerspiegelt, und wir können nicht den falschen Preis für ein Gericht berechnen.
(In technischer Hinsicht können wir garantieren, dass die funktionale Abhängigkeit "Rate Type" -> "Court" nicht verletzt wird.)
quelle
Alles gute Antworten. Einfach ausgedrückt [BCNF] Kein Teilschlüssel kann von einem Schlüssel abhängen.
dh Keine Teiluntermenge (dh keine nicht triviale Untermenge mit Ausnahme der vollständigen Menge) eines Kandidatenschlüssels kann funktional von einem Kandidatenschlüssel abhängig sein.
quelle
Die Antworten von ' smartnut007 ', ' Bill Karwin ' und ' sqlvogel ' sind ausgezeichnet. Lassen Sie mich dennoch eine interessante Perspektive einbringen.
Nun, wir haben Prim- und Nicht-Prim-Schlüssel.
Wenn wir uns darauf konzentrieren, wie Nicht-Primzahlen von Primzahlen abhängen, sehen wir zwei Fälle:
Nicht-Primzahlen können abhängig sein oder nicht .
Wenn nicht abhängig: Es kann keine Abhängigkeit oder transitive Abhängigkeit geben
Was ist mit Abhängigkeiten zwischen Primzahlen?
Sie sehen, wir befassen uns weder mit der 2. noch mit der 3. NF mit der Abhängigkeitsbeziehung zwischen Primzahlen . Darüber hinaus ist eine solche Abhängigkeit, falls vorhanden, nicht wünschenswert, und daher haben wir eine einzige Regel, um dies zu beheben. Das ist BCNF .
Wenn Sie sich auf das Beispiel aus Bill Karwins Beitrag hier beziehen , werden Sie feststellen, dass sowohl " Topping " als auch " Topping Type " Hauptschlüssel sind und eine Abhängigkeit haben. Wären sie keine Primzahlen mit Abhängigkeit gewesen, wäre 3NF eingetreten.
Hinweis:
Die Definition von BCNF ist sehr allgemein und ohne Unterscheidung zwischen Primzahlen und Nicht-Primzahlen. Die obige Denkweise hilft jedoch zu verstehen, wie eine Anomalie auch nach der 2. und 3. NF versickert.
Erweitertes Thema: Zuordnung von generischem BCNF zu 2NF und 3NF
Nachdem wir nun wissen, dass BCNF eine generische Definition ohne Bezugnahme auf Prim- / Nicht-Primat-Attribute bereitstellt, wollen wir sehen, wie BCNF und 2/3 NFs zusammenhängen.
Erstens erfordert BCNF (außer im trivialen Fall), dass
X -> Y
X für jede funktionale Abhängigkeit (FD) ein Superschlüssel sein muss. Wenn Sie nur eine FD betrachten, dann haben wir drei Fälle - (1) Sowohl X als auch Y nicht prim, (2) sowohl prim als auch (3) X prim und Y nicht prim, wobei der (unsinnige) Fall X non verworfen wird -prime und Y prime.Für Fall (1) kümmert sich 3NF darum.
Für Fall (3) kümmert sich 2NF darum.
Für Fall (2) finden wir die Verwendung von BCNF
quelle
Dies ist eine alte Frage mit wertvollen Antworten, aber ich war immer noch etwas verwirrt, bis ich ein Beispiel aus dem wirklichen Leben fand, das das Problem mit 3NF zeigt. Vielleicht nicht für ein 8-jähriges Kind geeignet, aber ich hoffe, es hilft.
Morgen werde ich die Lehrer meiner ältesten Tochter in einem dieser vierteljährlichen Eltern- / Lehrertreffen treffen. So sieht mein Tagebuch aus (Namen und Räume wurden geändert):
Es gibt nur einen Lehrer pro Raum und sie bewegen sich nie. Wenn Sie einen Blick haben, werden Sie feststellen , dass: (1) für jedes Attribut
Teacher
,Date
,Room
haben wir nur einen Wert pro Zeile. (2) Superschlüssel sind :(Teacher, Date, Room)
,(Teacher, Date)
und(Date, Room)
und Kandidatenschlüssel sind offensichtlich(Teacher, Date)
und(Date, Room)
.(Teacher, Room)
ist kein Superkey, weil ich die Tabelle im nächsten Quartal vervollständigen werde und möglicherweise eine Reihe wie diese habe (Herr Smith hat sich nicht bewegt!):Was können wir daraus schließen? (1) ist eine informelle, aber korrekte Formulierung von 1NF. Aus (2) sehen wir, dass es kein "Nicht-Prim-Attribut" gibt: 2NF und 3NF werden kostenlos vergeben.
Mein Tagebuch ist 3NF. Gut! Nein, nicht wirklich, weil kein Datenmodellierer dies in einem DB-Schema akzeptieren würde. Das
Room
Attribut ist vom Attribut abhängigTeacher
(wieder: Lehrer bewegen sich nicht!), Aber das Schema spiegelt diese Tatsache nicht wider. Was würde ein vernünftiger Datenmodellierer tun? Teilen Sie die Tabelle in zwei Teile:Und
3NF befasst sich jedoch nicht mit Abhängigkeiten von Hauptattributen. Dies ist das Problem: Die 3NF-Konformität reicht unter bestimmten Umständen nicht aus, um ein solides Tabellenschema zu gewährleisten .
Bei BCNF ist es Ihnen egal, ob das Attribut ein Hauptattribut ist oder nicht, in 2NF- und 3NF-Regeln. Für jede nicht triviale Abhängigkeit (Teilmengen werden offensichtlich durch ihre Obermengen bestimmt) ist die Determinante ein vollständiger Superschlüssel. Mit anderen Worten, nichts wird durch etwas anderes als einen vollständigen Superschlüssel bestimmt (ausgenommen triviale FDs). (Siehe andere Antworten für die formale Definition).
Sobald es darauf
Room
ankommtTeacher
,Room
muss es sich um eine Teilmenge vonTeacher
(das ist nicht der Fall) oderTeacher
um einen Superschlüssel handeln (das ist in meinem Tagebuch nicht der Fall, aber das ist der Fall, wenn Sie die Tabelle teilen).Zusammenfassend: BNCF ist strenger, aber meiner Meinung nach leichter zu verstehen als 3NF:
quelle