Was ist Normalisierung (oder Normalisierung)?

Antworten:

171

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 .

JacquesB
quelle
4
Das Beispiel, das Sie für das erste Normal gegeben haben, ist nicht genau richtig. Ich erinnere mich immer an die ersten drei Normalformen mit den Begriffen Wiederholen, Redundant, Nichtabhängig. Das Wiederholen von Daten bezieht sich darauf, wenn unerfahrene Datenbankentwickler Tabellendefinitionen schreiben, die Spalten wie DogName1, DogName2, DogName3 usw. enthalten.
Bill
2
@ Bill: Warum ist das von mir bereitgestellte Beispiel Ihrer Meinung nach nicht korrekt? Kennen Sie eine Definition von 1NF, bei der das Beispiel in Ordnung wäre?
JacquesB
Wie kommt es, dass bei der objektorientierten Programmierung keine Normalisierung erforderlich ist - sondern nur bei Datenbanken? Ich denke, es ist bereits ein Normalisierungsprozess eingebaut, der den Kern der objektorientierten Programmierung enthält - nicht wahr?
Lealo
@Lealo Nein, überhaupt nicht. Sie können den Status eines OO-Entwurfs immer trivial einer "relationalen" Datenbank / einem relationalen Entwurf mit Tabellen zuordnen - das ist ORM -, aber die Datenbank / der Entwurf, die Sie erhalten, ist eine relationale Darstellung des OO-Entwurfs, keine relationale Darstellung von Das Geschäft und nicht nur die relationale Darstellung des OO-Entwurfs unterliegt eindeutig Aktualisierungsanomalien und Redundanzen, die von der Normalisierung verwaltet werden, sondern die OO-Methoden müssen die entsprechenden (undokumentierten) (komplexen) Einschränkungen ("Darstellung invariant") von Hand durchsetzen.
Philipxy
@Lealo: Das Prinzip gilt für OOP insofern, als Sie niemals dieselben Informationen (in veränderlicher Form) in zwei verschiedenen Objekten haben sollten, da diese dann möglicherweise nicht mehr synchron sind.
JacquesB
45

Die Regeln der Normalisierung (Quelle: unbekannt)

  • Der Schlüssel ( 1NF )
  • Der ganze Schlüssel ( 2NF )
  • und nichts als der Schlüssel ( 3NF )

... Also hilf mir Codd.

ConcernedOfTunbridgeWells
quelle
12
Ich denke, das ist ein bisschen vage ohne einen richtigen Kontext, nicht wahr?
Rik
3
Es mag ein wenig vage sein, aber es ist eine großartige Erinnerung für diejenigen mit dem Kontext. Ich weiß, was Normalisierung ist und wie ich vorgehen soll, aber ich kann mich nie daran erinnern, was jede der Formen ist.
Benjamin Autin
1
Wikipedia erklärt dies hier: "Das Erfordernis des Vorhandenseins von" dem Schlüssel "stellt sicher, dass sich die Tabelle in 1NF befindet. Das Erfordernis, dass Nichtschlüsselattribute von" dem gesamten Schlüssel "abhängig sind, stellt 2NF sicher. Außerdem erfordert das Erfordernis, dass Nichtschlüsselattribute von" nichts "abhängig sind aber der Schlüssel "sorgt für 3NF."
Kcats Wolfrevo
Laut Wikipedia ist die Quelle Bill Kent: "[Jeder] Nicht-Schlüssel [Attribut] muss eine Tatsache über den Schlüssel, den gesamten Schlüssel und nichts als den Schlüssel liefern."
Apteryx
19

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

Ilya Kochetov
quelle
Sie wären auch ziemlich überrascht, wie wenig Denormalisierung in Transaktions-Apps wirklich erforderlich ist. In einer Monsteranwendung, für die ich das Datenmodell erstellt habe, enthielt ein Schema mit 560 Tabellen nur 4 denormalisierte Datenelemente.
ConcernedOfTunbridgeWells
Es verhindert "Update-Anomalien". Dies geschieht durch Eliminieren bestimmter Arten von Duplikaten.
S.Lott
"Mein Rat ist, mit einem guten Grad an Normalisierung zu beginnen und die De-Normalisierung nur dann durchzuführen, wenn sie wirklich benötigt wird." Dieser eine Rat ist sehr schlecht! Ich habe immer noch keine richtige Illustration dieser "Pseudo-Theorie" gesehen. Minus 1.
Philippe Grondier
7

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.

Rik
quelle
5

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.

Chris Cudmore
quelle
1
BCNF ist nicht "perfekt". Es gibt höhere Normalformen bis zu 6NF, bei denen alle Ihre Tabellen nur ein Schlüssel und ein Datenwert sind. Es wird jedoch selten verwendet
Rik
Ich bin nicht der Meinung, dass BCNF selten verwendet und typischerweise denormalisiert wird. Tatsächlich befindet sich Ihr normalisiertes Beispiel bereits in BCNF, und wenn Sie es denormalisieren, sind Sie wieder auf dem ersten Platz.
JacquesB
3

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.

Walter Mitty
quelle
2

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).

Nenad Dobrilovic
quelle
2

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
Geben Sie hier die Bildbeschreibung ein

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:

  • Beseitigen Sie wiederholte Gruppen in einzelnen Tabellen.
  • Erstellen Sie eine separate Tabelle für jeden Satz verwandter Daten.
  • Identifizieren Sie jeden Satz verwandter Daten mit einem Primärschlüssel

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

Premraj
quelle
0

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.

Arun
quelle
-10

Es hilft, doppelte (und schlimmer noch widersprüchliche) Daten zu vermeiden.

Kann sich jedoch negativ auf die Leistung auswirken.

Brian Knoblauch
quelle
Nachdem ich sowohl mit normalisierten als auch mit nicht normalisierten Daten gearbeitet habe, bevorzuge ich einen Geschwindigkeitsabfall mit Normalisierung, anstatt zu verlieren oder Schwierigkeiten zu haben, die Anwendung oder Datenbank zu warten.
Schalk Versteeg
1
Moderne Datenbank-Engines verwenden Caching, wodurch normalisierte Datenbanken häufig effizienter sind als nicht normalisierte. im Zweifelsfall messen.
Steven A. Lowe
1
Ein denormalisiertes Design kann für eine bestimmte Abfrage schneller sein, aber ein normalisiertes Design bietet einen Kompromiss, indem es eine angemessene Leistung für eine viel größere Vielfalt von Abfragen bietet.
Bill Karwin
@ Bill, ich müsste etwas nicht zustimmen. Die einzige Möglichkeit, die Leistung durch eine vollständig normalisierte Datenbank zu verbessern, besteht darin, zu verhindern, dass das System mit redundanten Daten umgehen muss. Davon abgesehen ist es vom Standpunkt der Leistung aus ein Worst-Case-Fall.
Brian Knoblauch
Diese Antwort bietet keinen Mehrwert gegenüber den vorhandenen Antworten.
Cimmanon