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?
quelle
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.
quelle
Es ist in 2NF.
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-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.
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.
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.
quelle
Sie haben Recht, Fächer benötigen eine eigene Tabelle. Wenn Sie eine Ihrer Schlüsselkandidaten wählen, entweder
subject_code
odersubject_name
wird 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_code
undsubject_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.
quelle
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.
quelle
{StudentName, SubjectName, #Exam}
". AlsoStudentName
ist es ein Primatattribut.