Antworten:
Bei der Normalisierung wird im Wesentlichen ein Datenbankschema so entworfen, dass doppelte und redundante Daten vermieden werden. Wenn einige Daten an mehreren Stellen in der Datenbank dupliziert werden, besteht das Risiko, dass sie an einer Stelle aktualisiert werden, nicht jedoch an der anderen, was zu einer Beschädigung der Daten führt.
Es gibt eine Reihe von Normalisierungsstufen von 1. Normalform bis 5. Normalform. Jede normale Form beschreibt, wie ein bestimmtes Problem beseitigt werden kann, das normalerweise mit Redundanz zusammenhängt.
Einige typische Normalisierungsfehler:
(1) Mehr als einen Wert in einer Zelle haben. Beispiel:
UserId | Car
---------------------
1 | Toyota
2 | Ford,Cadillac
Hier hat die Spalte "Auto" (die eine Zeichenfolge ist) mehrere Werte. Das verstößt gegen die erste Normalform, die besagt, dass jede Zelle nur einen Wert haben sollte. Wir können dieses Problem beseitigen, indem wir eine separate Reihe pro Auto haben:
UserId | Car
---------------------
1 | Toyota
2 | Ford
2 | Cadillac
Das Problem mit mehreren Werten in einer Zelle besteht darin, dass das Aktualisieren und Abfragen schwierig ist und Sie keine Indizes, Einschränkungen usw. anwenden können.
(2) Redundante Nichtschlüsseldaten (dh Daten, die unnötig in mehreren Zeilen wiederholt werden). Beispiel:
UserId | UserName | Car
-----------------------
1 | John | Toyota
2 | Sue | Ford
2 | Sue | Cadillac
Dieses Design ist ein Problem, da der Name für jede Spalte wiederholt wird, obwohl der Name immer von der Benutzer-ID bestimmt wird. Dies macht es theoretisch möglich, den Namen von Sue in einer Zeile und nicht in der anderen zu ändern, was eine Datenbeschädigung darstellt. Das Problem wird gelöst, indem die Tabelle in zwei Teile geteilt und eine Primärschlüssel / Fremdschlüssel-Beziehung erstellt wird:
UserId(FK) | Car UserId(PK) | UserName
--------------------- -----------------
1 | Toyota 1 | John
2 | Ford 2 | Sue
2 | Cadillac
Jetzt scheint es, als hätten wir immer noch redundante Daten, da die Benutzer-IDs wiederholt werden. Die PK / FK-Einschränkung stellt jedoch sicher, dass die Werte nicht unabhängig voneinander aktualisiert werden können, sodass die Integrität sicher ist.
Ist es wichtig? Ja, das ist sehr wichtig. Wenn Sie eine Datenbank mit Normalisierungsfehlern haben, besteht das Risiko, dass ungültige oder beschädigte Daten in die Datenbank gelangen. Da Daten "für immer leben", ist es sehr schwierig, beschädigte Daten zu entfernen, wenn sie zum ersten Mal in die Datenbank eingegeben wurden.
Hab keine Angst vor Normalisierung . Die offiziellen technischen Definitionen der Normalisierungsstufen sind ziemlich stumpf. Es klingt so, als wäre Normalisierung ein komplizierter mathematischer Prozess. Normalisierung ist jedoch im Grunde nur der gesunde Menschenverstand, und Sie werden feststellen, dass ein Datenbankschema, das mit gesundem Menschenverstand entworfen wird, normalerweise vollständig normalisiert wird.
Es gibt eine Reihe von Missverständnissen in Bezug auf die Normalisierung:
Einige glauben, dass normalisierte Datenbanken langsamer sind und die Denormalisierung die Leistung verbessert. Dies gilt jedoch nur in ganz besonderen Fällen. Normalerweise ist eine normalisierte Datenbank auch die schnellste.
Manchmal wird Normalisierung als schrittweiser Entwurfsprozess beschrieben, und Sie müssen entscheiden, wann Sie aufhören möchten. Tatsächlich beschreiben die Normalisierungsstufen jedoch nur verschiedene spezifische Probleme. Das Problem, das durch normale Formulare über dem 3. NF gelöst wird, ist in erster Linie ziemlich selten. Daher besteht die Möglichkeit, dass sich Ihr Schema bereits in 5NF befindet.
Gilt das für etwas außerhalb von Datenbanken? Nicht direkt, nein. Die Prinzipien der Normalisierung sind für relationale Datenbanken sehr spezifisch. Das allgemeine zugrunde liegende Thema, dass Sie keine doppelten Daten haben sollten, wenn die verschiedenen Instanzen nicht mehr synchron sind, kann jedoch allgemein angewendet werden. Dies ist im Grunde das DRY-Prinzip .
Die Regeln der Normalisierung (Quelle: unbekannt)
... Also hilf mir Codd.
Am wichtigsten ist, dass Duplikate aus den Datenbankeinträgen entfernt werden. Wenn Sie beispielsweise mehr als eine Stelle (Tabellen) haben, an der der Name einer Person auftauchen könnte, verschieben Sie den Namen in eine separate Tabelle und verweisen überall darauf. Auf diese Weise müssen Sie den Personennamen, wenn Sie ihn später ändern müssen, nur an einer Stelle ändern.
Dies ist für ein ordnungsgemäßes Datenbankdesign von entscheidender Bedeutung. Theoretisch sollten Sie es so oft wie möglich verwenden, um die Integrität Ihrer Daten zu gewährleisten. Wenn Sie jedoch Informationen aus vielen Tabellen abrufen, verlieren Sie an Leistung. Aus diesem Grund können manchmal denormalisierte Datenbanktabellen (auch als abgeflacht bezeichnet) in leistungskritischen Anwendungen verwendet werden.
Mein Rat ist, mit einem guten Normalisierungsgrad zu beginnen und die De-Normalisierung nur dann durchzuführen, wenn dies wirklich erforderlich ist
PS Lesen Sie auch diesen Artikel: http://en.wikipedia.org/wiki/Database_normalization , um mehr über das Thema und über sogenannte Normalformen zu erfahren
Normalisierung Eine Prozedur, mit der Redundanz und funktionale Abhängigkeiten zwischen Spalten in einer Tabelle beseitigt werden.
Es gibt mehrere Normalformen, die im Allgemeinen durch eine Zahl gekennzeichnet sind. Eine höhere Anzahl bedeutet weniger Redundanzen und Abhängigkeiten. Jede SQL-Tabelle liegt in 1NF vor (erste Normalform, so ziemlich per Definition). Normalisieren bedeutet, das Schema reversibel zu ändern (häufig die Tabellen zu partitionieren) und ein Modell zu erhalten, das funktional identisch ist, außer mit weniger Redundanz und Abhängigkeiten.
Redundanz und Abhängigkeit von Daten sind unerwünscht, da dies zu Inkonsistenzen beim Ändern der Daten führen kann.
Es soll die Redundanz von Daten reduzieren.
Eine formellere Diskussion finden Sie in der Wikipedia unter http://en.wikipedia.org/wiki/Database_normalization
Ich werde ein etwas vereinfachtes Beispiel geben.
Angenommen, die Datenbank einer Organisation enthält normalerweise Familienmitglieder
id, name, address
214 Mr. Chris 123 Main St.
317 Mrs. Chris 123 Main St.
könnte normalisiert werden als
id name familyID
214 Mr. Chris 27
317 Mrs. Chris 27
und ein Familientisch
ID, address
27 123 Main St.
Die nahezu vollständige Normalisierung (BCNF) wird normalerweise nicht in der Produktion verwendet, ist jedoch ein Zwischenschritt. Sobald Sie die Datenbank in BCNF abgelegt haben, besteht der nächste Schritt normalerweise in der De-Normalisierung sie auf logische Weise zu , um Abfragen zu beschleunigen und die Komplexität bestimmter gängiger Einfügungen zu verringern. Sie können dies jedoch nicht gut machen, ohne es zuerst richtig zu normalisieren.
Die Idee ist, dass die redundanten Informationen auf einen einzigen Eintrag reduziert werden. Dies ist besonders nützlich in Feldern wie Adressen, in denen Herr Chris seine Adresse als Unit-7 123 Main St. angibt und Frau Chris Suite-7 123 Main Street auflistet, die in der Originaltabelle als zwei unterschiedliche Adressen angezeigt werden.
In der Regel besteht die verwendete Technik darin, wiederholte Elemente zu finden und diese Felder in einer anderen Tabelle mit eindeutigen IDs zu isolieren und die wiederholten Elemente durch einen Primärschlüssel zu ersetzen, der auf die neue Tabelle verweist.
Zitat von CJ Datum: Theorie ist praktisch.
Abweichungen von der Normalisierung führen zu bestimmten Anomalien in Ihrer Datenbank.
Abweichungen von der ersten Normalform führen zu Zugriffsanomalien. Dies bedeutet, dass Sie einzelne Werte zerlegen und scannen müssen, um das Gesuchte zu finden. Wenn beispielsweise einer der Werte die Zeichenfolge "Ford, Cadillac" ist, wie in einer früheren Antwort angegeben, und Sie nach allen Vorkommen von "Ford" suchen, müssen Sie die Zeichenfolge aufbrechen und die Teilzeichenfolgen. Dies macht den Zweck des Speicherns der Daten in einer relationalen Datenbank bis zu einem gewissen Grad zunichte.
Die Definition der ersten Normalform hat sich seit 1970 geändert, aber diese Unterschiede müssen Sie vorerst nicht betreffen. Wenn Sie Ihre SQL-Tabellen mithilfe des relationalen Datenmodells entwerfen, werden Ihre Tabellen automatisch in 1NF angezeigt.
Abweichungen von der zweiten Normalform und darüber hinaus führen zu Aktualisierungsanomalien, da dieselbe Tatsache an mehr als einem Ort gespeichert wird. Diese Probleme machen es unmöglich, einige Fakten zu speichern, ohne andere Fakten zu speichern, die möglicherweise nicht existieren und daher erfunden werden müssen. Wenn sich die Fakten ändern, müssen Sie möglicherweise alle Stellen suchen, an denen eine Tatsache gespeichert ist, und alle diese Stellen aktualisieren, damit Sie nicht zu einer Datenbank gelangen, die sich selbst widerspricht. Wenn Sie eine Zeile aus der Datenbank löschen, werden Sie möglicherweise feststellen, dass Sie in diesem Fall den einzigen Ort löschen, an dem eine noch benötigte Tatsache gespeichert ist.
Dies sind logische Probleme, keine Leistungsprobleme oder Platzprobleme. Manchmal können Sie diese Update-Anomalien durch sorgfältige Programmierung umgehen. Manchmal (oft) ist es besser, die Probleme überhaupt zu vermeiden, indem man sich an normale Formen hält.
Ungeachtet des Wertes in dem, was bereits gesagt wurde, sollte erwähnt werden, dass Normalisierung ein Bottom-Up-Ansatz ist, kein Top-Down-Ansatz. Wenn Sie bei Ihrer Analyse der Daten und bei Ihrem ersten Entwurf bestimmte Methoden befolgen, können Sie sicher sein, dass der Entwurf mindestens 3NF entspricht. In vielen Fällen wird das Design vollständig normalisiert.
Wenn Sie die im Rahmen der Normalisierung gelehrten Konzepte wirklich anwenden möchten, erhalten Sie möglicherweise Legacy-Daten aus einer Legacy-Datenbank oder aus Dateien, die aus Datensätzen bestehen, und die Daten wurden in völliger Unkenntnis der normalen Formen und der Folgen von Abweichungen erstellt von ihnen. In diesen Fällen müssen Sie möglicherweise die Abweichungen von der Normalisierung ermitteln und das Design korrigieren.
Warnung: Normalisierung wird oft mit religiösen Untertönen gelehrt, als wäre jede Abweichung von der vollständigen Normalisierung eine Sünde, eine Straftat gegen Codd. (kleines Wortspiel dort). Kaufen Sie das nicht. Wenn Sie das Datenbankdesign wirklich, wirklich lernen, wissen Sie nicht nur, wie Sie die Regeln befolgen, sondern auch, wann es sicher ist, sie zu brechen.
Normalisierung ist eines der Grundkonzepte. Dies bedeutet, dass sich zwei Dinge nicht gegenseitig beeinflussen.
In Datenbanken bedeutet dies konkret, dass zwei (oder mehr) Tabellen nicht dieselben Daten enthalten, dh keine Redundanz aufweisen.
Auf den ersten Blick ist das wirklich gut, da Ihre Chancen auf Synchronisationsprobleme nahe Null liegen, Sie immer wissen, wo sich Ihre Daten befinden usw. Aber wahrscheinlich wird Ihre Anzahl von Tabellen zunehmen und Sie werden Probleme haben, die Daten zu überqueren und um einige zusammenfassende Ergebnisse zu erhalten.
Am Ende werden Sie also mit einem Datenbankdesign fertig sein, das nicht rein normalisiert ist, mit einer gewissen Redundanz (es wird in einigen der möglichen Normalisierungsstufen sein).
Was ist Normalisierung?
Die Normalisierung ist ein schrittweiser formaler Prozess, der es uns ermöglicht, Datenbanktabellen so zu zerlegen, dass sowohl Datenredundanz als auch Aktualisierungsanomalien minimiert werden.
Normalisierungsprozess mit freundlicher Genehmigung
Erste Normalform genau dann, wenn die Domäne jedes Attributs nur Atomwerte enthält (ein Atomwert ist ein Wert, der nicht geteilt werden kann) und der Wert jedes Attributs nur einen einzigen Wert aus dieser Domäne enthält (Beispiel: - Domäne für die Geschlechtsspalte ist: "M", "F".).
Die erste Normalform erzwingt diese Kriterien:
Zweite Normalform = 1NF + keine partiellen Abhängigkeiten dh alle Nichtschlüsselattribute sind abhängig vom Primärschlüssel voll funktionsfähig.
Dritte Normalform = 2NF + keine transitiven Abhängigkeiten, dh alle Nichtschlüsselattribute sind DIREKT nur vom Primärschlüssel abhängig.
Die Boyce-Codd-Normalform (oder BCNF oder 3.5NF) ist eine etwas stärkere Version der dritten Normalform (3NF).
Hinweis: - Die Normalformen Second, Third und Boyce-Codd befassen sich mit funktionalen Abhängigkeiten. Beispiele
Vierte Normalform = 3NF + Mehrwertige Abhängigkeiten entfernen
Fünfte Normalform = 4NF + Join-Abhängigkeiten entfernen
Wie Martin Kleppman in seinem Buch Designing Data Intensive Applications sagt:
Die Literatur zum relationalen Modell unterscheidet verschiedene Normalformen, aber die Unterscheidungen sind von geringem praktischem Interesse. Als Faustregel gilt: Wenn Sie Werte duplizieren, die nur an einer Stelle gespeichert werden könnten, wird das Schema nicht normalisiert.
Es hilft, doppelte (und schlimmer noch widersprüchliche) Daten zu vermeiden.
Kann sich jedoch negativ auf die Leistung auswirken.