Erklären Sie 2NF vs 3NF mit einem Beispiel


13

Ich habe ein Problem mit der zweiten normalen Form (2NF) und ich konnte es nicht mit Google lösen. Es macht mich verrückt, weil ich Lehrer bin und meinen Schülern nichts Falsches beibringen möchte.

Lassen Sie uns eine Tabelle mit 5 Feldern haben.

Benotungen = {StudentName, SubjectCode, SubjectName, #Exam, Note}

Abhängigkeiten sind wie folgt:

StudentName, SubjectCode, #Exam -> Note

SubjectCode -> SubjectName

SubjectName -> SubjectCode

Daher lautet der Kandidatenschlüssel 1 {StudentName, SubjectCode, #Exam} und der Kandidatenschlüssel 2 {StudentName, SubjectName, #Exam} .

Hauptattribute sind {StudentName, SubjectCode, SubjectName, #Exam} und Nicht-Hauptattribute sind Grade

Gemäß der Definition der zweiten Normalform kann ein Nicht-Prim-Attribut nicht von einem Teil eines Kandidatenschlüssels abhängen. Das einzige Nicht-Prim-Attribut (Note) hängt nicht von einem Teil eines Kandidatenschlüssels ab, daher erscheint diese Tabelle in 2NF.

Das Problem ist, dass ich denke, dass etwas nicht stimmt (und ich könnte falsch liegen). Ich denke, die Probanden sollten einen eigenen Tisch haben.

Benotungen = {StudentName, Fachcode, #Exam, Note}

Subjects = {Subject Code, SubjectName}

Aber 2NF produziert das nicht. Bei 3NF geht es um Abhängigkeiten zwischen Nicht-Prim-Attributen, daher wird dies auch nicht erzeugt. Aber es scheint mir, dass dies das richtige Ergebnis ist, weil es keine Redundanz gibt.

Ich vermute, wenn ein Nicht-Prim-Attribut als "Attribut, das kein Kandidatenschlüssel ist" definiert wurde, würde 2NF das gewünschte Ergebnis liefern. Aber ich habe dies immer wieder überprüft und Nicht-Prim-Attribut ist definiert als "Attribut, das nicht zu einem Kandidatenschlüssel gehört".

Was mache ich falsch?

Antworten:


9

Ihre Beziehung ist in 3NF (und nicht nur in 2NF), da, wie Sie sagen, das einzige Nicht-Prim-Attribut Grade ist , das nur auf der rechten Seite Ihrer FDs angezeigt wird.

Die Relation ist nicht in BCNF, da die linke Seite der beiden kleinen FDs kein Superkey ist.

Sie können jedoch die Beziehung zu ( SubjectCode , SubjectName ) und entweder ( StudentName, SubjectCode, #Exam, Grade ) oder ( StudentName, SubjectName, #Exam, Grade ) verlustfrei auflösen.

Diese Zerlegung gibt Ihnen zwei BCNF-Beziehungen und bewahrt alle funktionalen Abhängigkeiten. Dies ist nicht immer möglich (Sie können immer eine Beziehung zu 3NF zerlegen, aber nicht unbedingt zu BCNF).

2NF

Wenn Sie ein Beispiel für 2NF (und nicht 3NF) wünschen, muss Ihre Beziehung transitiven Abhängigkeiten enthalten.

Angenommen, Sie haben eine Score-Spalte. Intuitiv Bewertung-> Bewertung, da alle Prüfungen mit der gleichen Bewertung die gleiche Bewertung erhalten sollten (andernfalls wäre dies eher unfair). Beachten Sie jedoch, dass wir nicht Bewertung-> Bewertung sagen können, da mehrere Bewertungen die gleiche Bewertung haben können (11% und 12%). wäre wahrscheinlich "Fail", zum Beispiel).

Nun ist Ihre Beziehung:

Benotungen ( StudentName, SubjectCode, SubjectName, #Exam, Score, Note )

und Sie haben eine neue Form der Redundanz, da Sie jedes Mal, wenn Sie ein Ergebnis mit derselben Punktzahl wie ein anderer Notensatz eingeben, die entsprechende Note wiederholen müssen. Um auf 3NF zu kommen, könnte man sich also auf zersetzen

ScoreGrades ( Punktzahl, Note )

mit Score als Schlüssel und

Scores ( Studentenname, SubjectCode, SubjectName, #Exam, Score )


4

Sie haben in allem, was Sie sagen, Recht. Subject Code, SubjectName müssen in eine eigene Tabelle gehen, um die gewünschten Abhängigkeiten durchzusetzen. Dies ist ein gutes Beispiel dafür, warum 2NF und 3NF nicht ausreichen, um gute Datenbankentwürfe zu erstellen. Stattdessen benötigen Sie Boyce Codd Normal Form (BCNF).

2NF und 3NF werden von BCNF abgelöst, was praktisch dazu führt, dass diese geringeren NFs überholt sind *. BCNF ist wichtiger und wohl einfacher zu erklären und anzuwenden. Als Lehrer schlage ich vor, Sie verbringen mehr Zeit mit BCNF und weniger mit 2NF und 3NF. Wenn eine Tabelle die Anforderungen von BCNF erfüllt, erfüllt sie auch 2NF und 3NF.


* 3NF ist nicht die Normalform mit der höchsten Abhängigkeitserhaltung. Elementarschlüssel Normalform (EKNF) ist. Genau genommen ist es EKNF, nicht BCNF, was 3NF obsolet macht, aber EKNF wird zu Unrecht vernachlässigt und die meisten Lehrbücher und Kurse erwähnen es nicht einmal. Das Gleiche ist, BCNF zu entwerfen und dann zu überprüfen, ob alle gewünschten Abhängigkeiten und alle anderen Integritätsregeln ordnungsgemäß erzwungen werden können. Wenn nicht, ändern Sie das Design. Keines der NFs ist eine vollständige Lösung für die Datenintegrität, aber BCNF kommt im Allgemeinen am nächsten und ist am einfachsten zu erklären und zu verwenden.


Haben Sie gute Referenzen für EKNF, besonders für Anfänger? Ich versuche, es nachzulesen, und es hat sich als schwierig erwiesen, eine gute Dokumentation dafür zu finden. Außerhalb der einzeiligen Zusammenfassung aus dem Wiki, eine funktionierende Erklärung der Feinheiten von EKNF vs BCNF / 3NF, die ich bisher noch nicht kennengelernt habe.
Saijin_Naib

2

Ich werde nicht sagen, wie lange es her ist, seit ich das alles zum ersten Mal gelernt habe. Aber ich erinnere mich, dass ich einen Professor hatte, der uns, nachdem er uns pflichtgemäß die richtige Bedeutung von "funktionaler Abhängigkeit" und "Nicht-Primat-Attribut" und all den anderen Schlagworten beigebracht hatte, eine Reihe einfacher Fragen stellte, um herauszufinden, ob ein bestimmter Normalzustand vorliegt Form wurde erreicht. Mal sehen, ob ich mich so weit zurückerinnern kann ...

Wir haben die Kandidatenschlüssel identifiziert und stellen diese Frage nach den verbleibenden Nicht-Prim-Attributen. In diesem Fall gibt es nur eine: Note.

Was ist das absolute Minimum an Informationen, um die Note eindeutig zu identifizieren? Wir müssen den Studenten, das Fach und die Prüfung kennen, die abgelegt werden. Gut, das ist einer der Kandidatenschlüssel.

EDIT: VVV

Die Antwort hätte aber genauso gut der Name des Schülers, das Fach und die Prüfung sein können. Dies würde mit dem zweiten Kandidatenschlüssel übereinstimmen.

Angenommen, SubjectCode und SubjectName sind beide Kandidatenschlüssel für die Entität Subject, dann gibt es keinen Grund, beide Felder hier anzugeben. Ein eindeutiger Verweis auf eine Zeile in der Subjects-Tabelle reicht völlig aus. So können wir das SubjectName-Feld sicher entfernen, ohne die Integrität des Modells zu beeinträchtigen.

In meiner ursprünglichen Antwort habe ich jedoch ignoriert, dass SubjectName in einem Kandidatenschlüssel verwendet wurde, um eine andere Normalisierungsebene anzuzeigen, und habe es als ein weiteres Nicht-Prim-Attribut betrachtet. Ich denke, es war für mich so offensichtlich, dass dies ein nutzloses Feld war. Ich dachte, es wäre für alle genauso offensichtlich, und da wir das Feld in beiden Fällen losgeworden sind, was bedeutete es dann?

Aber anstatt diesen Teil der Antwort zu entfernen, behalte ich ihn zum Vergleich bei.

ENDE BEARBEITEN: ^^^

Was ist das absolute Minimum an Informationen, um den Betreffnamen eindeutig zu identifizieren?

SubjectName ist nur von SubjectCode abhängig - einer Teilmenge des Kandidatenschlüssels. Also ist dieses Tupel nicht in 2nf. SubjectCode sollte der Primärschlüssel einer Subjects-Tabelle sein, damit der richtige Speicherort für SubjectName angegeben wird. Entfernen Sie es von diesem Tupel und es ist jetzt in 2nf.

Wenn wir die Frage nach einem Attribut stellen und die Antwort nicht der gesamte oder ein Teil des Kandidatenschlüssels ist, befindet sich das Tupel nicht in 3nf. Aber dieses Tupel ist auch in 3nf und darüber hinaus trivial, da wir keine Felder mehr haben, um Fragen an zu stellen. ;)

Hinweis: Wenn wir "normalisieren" sagen, beziehen wir uns auf einen Prozess, der auf eine logische Entität angewendet wird. Da das gelieferte Tupel die Definition einer Entität namens "grade" zu sein scheint, können wir es normalisieren. An einem Punkt sagte ich jedoch "dieses Tupel ist nicht in 2nf", was eigentlich hätte sein sollen, "diese Entität ist nicht in 2nf". Ich entschuldige mich, wenn dies zu Verwirrung geführt hat.


2

Das einzige Nicht-Prim-Attribut (Note) hängt nicht von einem Teil eines Kandidatenschlüssels ab, daher erscheint diese Tabelle in 2NF.

Es ist in 2NF.

Das Problem ist, dass ich denke, dass etwas nicht stimmt (und ich könnte falsch liegen). Ich denke, die Probanden sollten einen eigenen Tisch haben.

Es besteht kein Grund zu der Annahme, dass die Probanden eine eigene Tabelle für die Zerlegung der Originaltabelle in 2NF haben sollten . Sie verwechseln eine vage Vorstellung von "sollte" mit dem, was eine bestimmte normale Form Ihnen tatsächlich gibt.

Bei 3NF geht es um Abhängigkeiten zwischen Nicht-Prim-Attributen, daher wird dies auch nicht erzeugt.

"Bei 3NF geht es um Abhängigkeiten zwischen Nicht-Primat-Attributen" ist keine korrekte Definition von 3NF, daher ist "auch dies nicht möglich" keine fundierte Schlussfolgerung. Obwohl das Anwenden einer tatsächlichen Definition zeigt, dass sich die Tabelle in 3NF befindet, wird keine Schülertabelle benötigt. Aber auch hier gibt es keinen Grund zu der Annahme, dass dies der Fall sein würde.

Aber es scheint mir, dass dies das richtige Ergebnis ist, weil es keine Redundanz gibt.

Auch hier ist "Redundanz" unklar, sodass Ihre "weil" - und Schülertabellenerwartung nicht stimmen. Verschiedene Normalformen sind frei von und unterliegen bestimmten Arten von Anomalien und der damit verbundenen "Redundanz". Es kann jedoch auch eine andere "Redundanz" verbleiben, die von der Normalisierung nicht berücksichtigt wird.

Diese Tabelle befindet sich nicht in BCNF, da es FDs gibt, die nicht außerhalb der CKs liegen. Das Zerlegen nach BCNF führt dazu, dass die Schülertabelle vorhanden ist. BCNF ist die höchste normale Form für den Umgang mit JDs (Join-Abhängigkeiten), die mit FDs einhergehen. Andere JDs können jedoch problematisch sein (dh nicht "impliziert durch die CKs") und sollten durch Normalisierung auf 5NF entfernt werden.

PS Die Originaltabelle erfüllt auch die FD {StudentName, SubjectName, #Exam} -> Note.

Abhängigkeiten sind wie folgt:

Was soll das heißen? Es ist nicht klar.

Meinen Sie "Dies sind alle nicht-trivialen FDs, die gelten"? Nein, weil sie den vierten implizieren. "Hier sind einige FDs, die halten"? Nein, das bedeutet, dass die FDs im transitiven Verschluss gültig sind, aber es heißt nicht, dass andere nicht gültig sind, aber Sie konnten die CKs bestimmen. "Die FDs, die gelten, sind genau die, die im transitiven Abschluss dieser"? Wenn Sie das gemeint hätten , würden Sie es nur wissen , wenn Sie es gezeigt hätten , dh Sie müssten diesen Verschluss gefunden haben (normalerweise über eine minimale / kanonische Abdeckung) und dann gezeigt haben, dass es keine anderen FDs gibt; hast du? Unabhängig davon, was Sie gerade geschrieben haben, bedeutet das nicht. Ich gehe also davon aus, dass Sie die FD & CK-Situation nicht richtig beurteilen.


0

Sie haben Recht, Fächer benötigen eine eigene Tabelle. Wenn Sie eine Ihrer Schlüsselkandidaten wählen, entweder subject_codeoder subject_namewird zu einem nicht-primären Kandidatenschlüssel. Anschließend entfernen Sie das Feld Nicht-Hauptfächer aus der Bewertungstabelle.

Sie haben eine funktionale Abhängigkeit vom Thema, für das Sie zwei eindeutige Bezeichner haben. Dies zeigt sich in der transitiven Abhängigkeit zwischen subject_codeund subject_name. Dies weist darauf hin, dass eine Tabelle erstellt werden muss, die diese beiden Felder enthält, und eines dieser Felder aus allen anderen Tabellen entfernt werden muss. Diese Tabelle könnte durchaus zusätzliche abhängige Spalten enthalten, obwohl ich in diesem Beispiel keine sehe. In der 3. Normalform haben Sie gewählt.

Die Note hängt von den anderen drei Feldern (Kandidatenschlüssel) in der neuen Bewertungstabelle ab. Wie oben erwähnt, müssen Sie eines der Kandidatenfelder für die Subjekttabelle auswählen. Normalerweise wäre dies ein Codewert, falls verfügbar, da diese tendenziell stabiler sind. Das resultierende Modell ist in 3nf, da alle Nicht-Schlüsselfelder vollständig von den Feldern im Primärschlüssel abhängig sind.

Eine weitere Analyse des Problems (der Anforderungen) ergibt wahrscheinlich eine Sitzungstabelle, auf die die Noten angewendet werden. Es ist unwahrscheinlich, dass das aktuelle Modell einen Studenten abdeckt, der einen Kurs wiederholt. Dies wird in einer späteren Lektion behandelt.

Die Schüler werden wahrscheinlich auch zu einer separaten Tabelle, da es möglich ist, mehrere Schüler mit demselben Namen zu haben. Dies würde wahrscheinlich durch Hinzufügen eines synthetischen Primärschlüssels (Schülernummer?) Behoben.

subjects --->  sessions ---+--> grades
students  -----------------+

3
"Wenn Sie einen Ihrer Kandidatenschlüssel auswählen, wird entweder der Betreffcode oder der Betreffname zu einem nicht-primären Kandidatenschlüssel ." Das ist eindeutig falsch. Der Rest der Analyse hat einige wertvolle Punkte, aber wenn man von einem falschen Punkt ausgeht, kann man sich nicht auf die Schlussfolgerungen verlassen.
ypercubeᵀᴹ

-7

Ich bereite vor, dies zu löschen, da es als falsch angesehen wird

Der Betreffname ist ebenfalls ein Nicht-Prim-Attribut und hängt von einem Teil des Betreffcodes des Primärschlüssels ab (Regeln für Brüche - es darf keine partielle Abhängigkeit einer Spalte vom Primärschlüssel geben).

Dies ist in der 2. Normalform verboten und sollte daher, wie Sie vermutet haben, in einer eigenen Tabelle abgelegt werden.

Ich denke, Sie sind beim Identifizieren von zwei Gruppen von Kandidatenschlüsseln hängen geblieben. Wenn Sie die Tabelle erstellen, müssen Sie eine Gruppe von Kandidatenschlüsseln auswählen, um den Primärschlüssel zu erstellen. Die verbleibenden Spalten werden zu Nicht-Prim-Attributen. Wenn Sie also Ihren zweiten Kandidatenschlüssel auswählen, wird der Betreff-Code zu einem Nicht-Prim-Attribut, das von einem Teil des Primärschlüssels (Betreffname) abhängt und in einer eigenen Tabelle platziert werden sollte.

Es ist wichtig, die 1., 2. und 3. Normalform zu unterrichten, damit sie aufeinander aufbauen. BCNF ist im Wesentlichen auch eine Erweiterung der 3. Normalform, daher ist ein starkes Verständnis der unteren Ebenen von wesentlicher Bedeutung.

Des Weiteren; Ein erfahrener Entwickler wird die unabhängigen Normalisierungsebenen nicht berücksichtigen, da viele Regeln intuitiv werden.

Sie wissen auch, wann sie Normalisierungsregeln brechen müssen, um bestimmte Entwurfs- und Optimierungsprobleme zu lösen. Normalisierung sollte als Leitfaden für gutes Design und nicht als strenge Regel behandelt werden. Ich glaube, das wäre auch ein guter Lehrpunkt.


1
Das OP sagt korrekterweise, dass "Kandidatenschlüssel 2 ist {StudentName, SubjectName, #Exam}". Also StudentNameist es ein Primatattribut.
ypercubeᵀᴹ

1
"Wenn Sie die Tabelle erstellen, müssen Sie einen Satz von Kandidatenschlüsseln auswählen, um den Primärschlüssel zu erstellen. Die verbleibenden Spalten werden zu Nicht-Primat-Attributen. " Dies ist eindeutig falsch.
ypercubeᵀᴹ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.