1
Das Wikibook „Einführung in SQL“ enthält die so ziemlich verständlichste Erklärung zu den Normalformen. Davon gibt es mindestens fünf. Die ersten drei davon sollen für jede Datenbank sinnvoll sein, weitere nichts mehr bringen und nur mehr Rechenzeit verbrauchen. Das heißt, daß man sich an folgende fünf Regeln halten sollte.
1. Jede Spalte enthält nur atomische (also nicht weiter teilbare) Werte.
2. Spalten, die gleiche oder gleichartige Informationen enthalten, sind in eigene Tabellen (Relationen) auszulagern.
3. Jede Tabelle enthält einen Primärschlüssel.
4. Alle Informationen in den Spalten, die nicht Teil des Primärschlüssels sind, müssen sich auf den gesamten Primärschlüssel beziehen.
5. Informationen in den Spalten, die nicht Teil des Primärschlüssels sind, dürfen funktional nicht voneinander abhängen.
Davon gehören die ersten drei Regeln zur ersten Normalform, während die zweite und die dritte Normalform jeweils nur eine zusätzliche Regel haben und sich auf Daten beziehen, die in mehreren zusammengehörenden Tabellen gespeichert sind. Es gibt einige Erklärungen zur Normalisierung. Manche mit Beispielen dazu. In den Beispielen werden zumeist Datensätze verwendet, die eins zu eins zusammengehören. Das muß bei richtigen Datenbanktabellen jedoch nicht der Fall sein. Hauptsächlich daraus ergeben sich einige Verständnisprobleme.
Zu 1.: Das verstehe ich, obwohl ich es noch nicht ganz umgesetzt habe. Solange man aus einem Eintrag noch zusätzliche Informationen extrahieren kann, soll man das auch tun und die extrahierten Informationen in einer zusätzlichen Tabellenspalte unterbringen. In meinen Wörterlisten ist so manche Information nicht eindeutig abgegrenzt, darum werde ich einige Tabellen noch mehrmals von Skripten abgrasen lassen müssen, bis alle Informationen in eigenen Tabellenspalten untergebracht sein werden.
Zu 2.: Verstehe ich nicht. Hätte ich gleiche Informationen in mehreren Spalten in einer Tabelle, dann kämen manche Spalten doppelt oder mehrfach vor. Wieso sollte ich die in eine weitere Tabelle auslagern, also zusätzlich zu einer Spalte, die die Information enthält nochmal speichern?
Allerdings hätte ich auch Informationen, konkret die Angabe von Fachgebieten (normalerweise in den Wörterlisten als [math.] [med.] [geo.] und so weiter), die keinmal, einmal oder auch zu mehreren (zum Beispiel zusätzliche Angabe [US] oder [GB] in der Liste für Englisch) in einem Datensatz vorkommen können. Vielleicht ist das gemeint, denn da weiß ich tatsächlich nicht, ob ich in solchen Fällen sämtliche Inhalte von eckigen Klammern zusammen in eine Tabellenspalte quetschen soll oder vielleicht drei getrennte mache, die dann in den meisten Fällen leer bleiben würden. Eine eigene Tabelle dafür würde aber kaum etwas daran ändern, daß die meisten Datensätze dann trotzdem nur eine oder keine Spalte füllen würden.
Zu 3.: Die meisten meiner Tabellen haben einen Primärschlüssel bekommen, der aus einer Kombination von Spalten besteht. Meine drei Tabellen, auf die ich Informationen aus der Liste für Japanisch verteilt habe, besitzen keinen Schlüssel oder Index. Nirgendwo in den drei Tabellen gibt es eine Spalte, deren Einträge sich nicht wiederholen dürften. Wegen der Wiederholungen pro Spalte (aber nicht pro ganzem Datensatz), wüßte ich nicht, welche Spalte sich als Index eignen würde. Bei einer Kombination aus Spalten wären sie in allen drei Tabellen unterschiedlich. Bei einer zusätzlichen Spalte, die einfach durchzählt, wäre der Index wiederum bei allen drei Tabellen unterschiedlich. Aber für eine Ausgabe müßte ein Skript auf alle drei Tabellen zugreifen.
In dem Wikibook steht auch noch, daß ein Primärschlüssel keine weiteren Informationen enthalten, sondern nur Index (falls Index und Schlüssel keine Synonyme sind, dann gibt es da noch etwas, das ich nicht verstehe) sein sollte. Vor dem Eintragen konnte ich das nicht machen, weil dann doppelte Datensätze nicht als doppelt erkannt und verworfen hätten werden können. Natürlich sind in den Tabellen mit Schlüsseln aus kombinierten Spalten nur nichtdoppelte Datensätze enthalten. Dadurch sollte sich ein anderer Schlüssel nachträglich einbauen lassen. Datensätze sollen auch nicht von einer bestimmten Reihenfolge abhängig sein. Bei einer Tabelle (Japanisch Schreibweisen und Aussprachen) habe ich das nicht richtig hinbekommen. Ich dachte mein Skript macht das, aber es ist ziemlich schwierig hinzubekommen. Jedenfalls ohne die Datensätze unnötig zu vervielfachen.
4. Keine Ahnung, was das bedeuten soll. Das Wikibook sagt die Lösung sei, weitere Tabellen anzulegen.
5. Ich bin mir nicht sicher, was das bedeuten soll. Das Wikibook sagt wieder die Lösung sei, weitere Tabellen anzulegen. Ich glaube vorerst, daß diese Regel erfüllt ist, falls man die Informationen in einer Spalte auch in einer anderen Tabelle unterbringen könnte und sie trotzdem wiederfinden würde. Vielleicht aber auch genau andersherum.
Manche Datensätze enthalten nicht nur einzelne Wörter, sondern ganze Sätze. Darunter können Sätze mit zusätzlichen Informationen zu einzelnen Wörtern sein oder Beispielsätze für die Verwendung eines Wortes. Ich werde wahrscheinlich noch einige Beispieldatensätze bringen, wo ich nicht weiterkomme. Aber erstmal muß ich noch eine Wörterliste einlesen, einige noch weiter atomisieren und dann habe ich noch die Englisch-Wörterlisten vom FreeDict-Projekt, bei denen ich aufgegeben habe. Aber sie enthalten noch zusätzliche Informationen, vor allem die Aussprache in Lautschrift. Persönlich brauche ich die zwar nicht unbedingt, aber es wäre doch schade, wenn ich die schon vorhandenen Informationen verschwenden würde. Diese möchte ich darum auch noch irgendwie meiner Tabelle für Englisch (die mit der Wörterliste der TU Chemnitz befüllt wurde, noch nicht atomisiert) zukommen lassen.
Ranma
1. Jede Spalte enthält nur atomische (also nicht weiter teilbare) Werte.
2. Spalten, die gleiche oder gleichartige Informationen enthalten, sind in eigene Tabellen (Relationen) auszulagern.
3. Jede Tabelle enthält einen Primärschlüssel.
4. Alle Informationen in den Spalten, die nicht Teil des Primärschlüssels sind, müssen sich auf den gesamten Primärschlüssel beziehen.
5. Informationen in den Spalten, die nicht Teil des Primärschlüssels sind, dürfen funktional nicht voneinander abhängen.
Davon gehören die ersten drei Regeln zur ersten Normalform, während die zweite und die dritte Normalform jeweils nur eine zusätzliche Regel haben und sich auf Daten beziehen, die in mehreren zusammengehörenden Tabellen gespeichert sind. Es gibt einige Erklärungen zur Normalisierung. Manche mit Beispielen dazu. In den Beispielen werden zumeist Datensätze verwendet, die eins zu eins zusammengehören. Das muß bei richtigen Datenbanktabellen jedoch nicht der Fall sein. Hauptsächlich daraus ergeben sich einige Verständnisprobleme.
Zu 1.: Das verstehe ich, obwohl ich es noch nicht ganz umgesetzt habe. Solange man aus einem Eintrag noch zusätzliche Informationen extrahieren kann, soll man das auch tun und die extrahierten Informationen in einer zusätzlichen Tabellenspalte unterbringen. In meinen Wörterlisten ist so manche Information nicht eindeutig abgegrenzt, darum werde ich einige Tabellen noch mehrmals von Skripten abgrasen lassen müssen, bis alle Informationen in eigenen Tabellenspalten untergebracht sein werden.
Zu 2.: Verstehe ich nicht. Hätte ich gleiche Informationen in mehreren Spalten in einer Tabelle, dann kämen manche Spalten doppelt oder mehrfach vor. Wieso sollte ich die in eine weitere Tabelle auslagern, also zusätzlich zu einer Spalte, die die Information enthält nochmal speichern?
Allerdings hätte ich auch Informationen, konkret die Angabe von Fachgebieten (normalerweise in den Wörterlisten als [math.] [med.] [geo.] und so weiter), die keinmal, einmal oder auch zu mehreren (zum Beispiel zusätzliche Angabe [US] oder [GB] in der Liste für Englisch) in einem Datensatz vorkommen können. Vielleicht ist das gemeint, denn da weiß ich tatsächlich nicht, ob ich in solchen Fällen sämtliche Inhalte von eckigen Klammern zusammen in eine Tabellenspalte quetschen soll oder vielleicht drei getrennte mache, die dann in den meisten Fällen leer bleiben würden. Eine eigene Tabelle dafür würde aber kaum etwas daran ändern, daß die meisten Datensätze dann trotzdem nur eine oder keine Spalte füllen würden.
Zu 3.: Die meisten meiner Tabellen haben einen Primärschlüssel bekommen, der aus einer Kombination von Spalten besteht. Meine drei Tabellen, auf die ich Informationen aus der Liste für Japanisch verteilt habe, besitzen keinen Schlüssel oder Index. Nirgendwo in den drei Tabellen gibt es eine Spalte, deren Einträge sich nicht wiederholen dürften. Wegen der Wiederholungen pro Spalte (aber nicht pro ganzem Datensatz), wüßte ich nicht, welche Spalte sich als Index eignen würde. Bei einer Kombination aus Spalten wären sie in allen drei Tabellen unterschiedlich. Bei einer zusätzlichen Spalte, die einfach durchzählt, wäre der Index wiederum bei allen drei Tabellen unterschiedlich. Aber für eine Ausgabe müßte ein Skript auf alle drei Tabellen zugreifen.
In dem Wikibook steht auch noch, daß ein Primärschlüssel keine weiteren Informationen enthalten, sondern nur Index (falls Index und Schlüssel keine Synonyme sind, dann gibt es da noch etwas, das ich nicht verstehe) sein sollte. Vor dem Eintragen konnte ich das nicht machen, weil dann doppelte Datensätze nicht als doppelt erkannt und verworfen hätten werden können. Natürlich sind in den Tabellen mit Schlüsseln aus kombinierten Spalten nur nichtdoppelte Datensätze enthalten. Dadurch sollte sich ein anderer Schlüssel nachträglich einbauen lassen. Datensätze sollen auch nicht von einer bestimmten Reihenfolge abhängig sein. Bei einer Tabelle (Japanisch Schreibweisen und Aussprachen) habe ich das nicht richtig hinbekommen. Ich dachte mein Skript macht das, aber es ist ziemlich schwierig hinzubekommen. Jedenfalls ohne die Datensätze unnötig zu vervielfachen.
4. Keine Ahnung, was das bedeuten soll. Das Wikibook sagt die Lösung sei, weitere Tabellen anzulegen.
5. Ich bin mir nicht sicher, was das bedeuten soll. Das Wikibook sagt wieder die Lösung sei, weitere Tabellen anzulegen. Ich glaube vorerst, daß diese Regel erfüllt ist, falls man die Informationen in einer Spalte auch in einer anderen Tabelle unterbringen könnte und sie trotzdem wiederfinden würde. Vielleicht aber auch genau andersherum.
Manche Datensätze enthalten nicht nur einzelne Wörter, sondern ganze Sätze. Darunter können Sätze mit zusätzlichen Informationen zu einzelnen Wörtern sein oder Beispielsätze für die Verwendung eines Wortes. Ich werde wahrscheinlich noch einige Beispieldatensätze bringen, wo ich nicht weiterkomme. Aber erstmal muß ich noch eine Wörterliste einlesen, einige noch weiter atomisieren und dann habe ich noch die Englisch-Wörterlisten vom FreeDict-Projekt, bei denen ich aufgegeben habe. Aber sie enthalten noch zusätzliche Informationen, vor allem die Aussprache in Lautschrift. Persönlich brauche ich die zwar nicht unbedingt, aber es wäre doch schade, wenn ich die schon vorhandenen Informationen verschwenden würde. Diese möchte ich darum auch noch irgendwie meiner Tabelle für Englisch (die mit der Wörterliste der TU Chemnitz befüllt wurde, noch nicht atomisiert) zukommen lassen.
Ranma