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 :
- X → Y ist eine triviale funktionale Abhängigkeit (Y ⊆ X) oder
- X ist ein Superschlüssel für Schema R.
und die 3NF-Definition
Wenn und nur wenn für jede seiner funktionalen Abhängigkeiten X → A mindestens eine der folgenden Bedingungen gilt:
- X enthält A (dh X → A ist eine triviale funktionale Abhängigkeit) oder
- X ist ein Superkey oder
- Jedes Element von AX, die festgelegte Differenz zwischen A und X, ist ein Hauptattribut (dh jedes Attribut in AX ist in einem Kandidatenschlüssel enthalten).
Wir sehen den folgenden Unterschied in einfachen Worten:
- In BCNF : Jeder Teilschlüssel ( Primattribut ) kann nur von einem Superkey abhängen,
wohingegen
- In 3NF : Ein Teilschlüssel ( Primatattribut ) kann auch von einem Attribut abhängen, das kein Superkey ist (dh ein anderes Teilschlüssel- / Primatattribut oder sogar ein Nicht-Primatattribut).
Wo
- Ein Hauptattribut ist ein Attribut, das in einem Kandidatenschlüssel gefunden wird, und
- Ein Kandidatenschlüssel ist ein minimaler Superschlüssel für diese Beziehung, und
- Ein Superkey ist eine Menge von Attributen einer Beziehungsvariablen, für die er besagt, dass es in allen dieser Variablen zugewiesenen Beziehungen keine zwei unterschiedlichen Tupel (Zeilen) gibt, die dieselben Werte für die Attribute in dieser Menge haben. Gleichermaßen kann dies auch ein Superkey als eine Reihe von Attributen eines Beziehungsschemas definiert werden, von denen alle Attribute des Schemas funktional abhängig sind. (Ein Superkey enthält immer einen Kandidatenschlüssel / ein Kandidatenschlüssel ist immer eine Teilmenge eines Superkeys. Sie können ein beliebiges Attribut in einer Beziehung hinzufügen, um einen der Superkeys zu erhalten.)
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,
- BNCF kann nicht immer erhalten werden , während
- 3NF kann immer erhalten werden .
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 )
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
Die Superkeys des Tisches sind:
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
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.
- Aber was ist, wenn der Benutzer das Gericht aktualisiert, sich aber nicht daran erinnert, die Rate zu erhöhen? Oder was ist, wenn die falsche Tarifart auf ein Gericht angewendet wird?
(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)
Rate Type Court Member Flag
--------- ----- -----------
SAVER 1 Yes
STANDARD 1 No
PREMIUM-A 2 Yes
PREMIUM-B 2 No
Heutige Tennisplatzbuchungen ( BCNF und der schwächere 3NF, der von BCNF impliziert wird)
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
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.)