Wie weit sollten Sie mit der Normalisierung gehen?

30

Ich habe eine anständige Datenmenge in einer Datenbank. Ich habe wohlgeformte Tabellen und gute Beziehungen zwischen ihnen mit etwas Redundanz in meinen Daten. Aber wie weit soll ich mit der Normalisierung gehen? Gibt es Leistungsnachteile zu viel Normalisierung?

Fergus
quelle

Antworten:

37

Sie sollten so weit gehen, wie Sie sollten, und nicht weiter. Na sicher. ~ Das Problem könnte sein, dass dies eine Kunst ist und es deshalb keine reine Wissenschaft ist.

Unser wichtigstes Produkt ist ein Analyse- und Berichtssystem. Daher verfügen wir in dieser Hinsicht über einige detaillierte Aufzeichnungen. Wir hatten es ursprünglich mit vielen Verknüpfungen auf einer gemeinsamen ID für einige der untergeordneten Datensätze entworfen, aber wir fanden heraus, dass wir, wenn wir ein paar Felder denormalisieren, eine Menge Verknüpfungen herausschneiden und viele Leistungsprobleme beseitigen könnten.

Aber wir wussten nur, dass wir 1) ein "normalisiertes" Design erstellt haben, 2) begonnen haben, es zu verwenden, 3) die tatsächliche Leistung nach Hunderten von Millionen Zeilen in Dutzenden von Tabellen berechnet haben.

Die Endgeschichte ist, dass wir bis zu unserer Profilerstellung nicht genau wissen konnten, was für uns funktionieren würde. Wir mochten die Idee der Normalisierung, um die Aktualisierung zu vereinfachen, aber letztendlich war die tatsächliche Leistung der entscheidende Faktor. Das ist mein Rat für Sie: Profil, Profil, Profil.

jcolebrand
quelle
4
Kunst und keine Wissenschaft lässt mich glauben, dass es Voodoo ist. Referenzen?
Abel
3
@Abel wie wäre es mit meiner Anekdote im Allgemeinen? Ein Profiler kann möglicherweise Regeln für die Denormalisierung vorschlagen, diese Regeln stammen jedoch von einem erfahrenen Programmierer. Alle Programmierung ist eine Kunst. Ich werde jemanden finden, der berühmter ist und dasselbe gesagt hat, wenn ich später zu einer vollen Tastatur komme.
Jcolebrand
1
@Abel na dann alle in ('forgiven','pardoned');): p
jcolebrand
2
@Fergus froh, dass es dir gefallen hat. Ich fand Anekdoten immer am besten.
Jcolebrand
2
@abel - 'Eine Kunst ist eine Wissenschaft mit mehr als 7 Freiheitsgraden'. Ab einem gewissen Grad an Komplexität werden erschöpfende Herangehensweisen an ein Problem unmöglich. Hier sind erfahrungsbasierte heuristische Ansätze am effektivsten. Auf dem Gebiet der Datenverarbeitung ist dieses Maß an Komplexität leider nur mit einfachen Softwaresystemen zu erreichen.
ConcernedOfTunbridgeWells
10

Normalisierung ist nur dann ein Ziel, wenn es Ihr Datenmodell gut genug unterstützt, um dies zu gewährleisten. Es soll ein Leitfaden sein, um Wachstum, Management und Wartbarkeit zu ermöglichen. Denken Sie daran, dass weder das Buch zur Normalisierung noch sein Verfasser Ihre Datenbank oder ihre Anwendung erstellen oder warten werden.

Eine gute Lektüre zum Thema "zu viel Normalisierung" ist hier.

Ja, es kann zu Leistungseinbußen bei der Normalisierung kommen. Dies wäre ein tieferes Durchsuchen von Tabellen, um Dinge wie Statusanzeigetabellen aufzunehmen, wenn sie zu einer separaten Tabelle herausgezogen wurden. Einige werden sagen, dass dies normalerweise in Bezug auf die Aktualisierungsgeschwindigkeit (Ändern des Statustextes von "Gut" in "GUT" oder etwas Ähnliches) oder in Bezug auf die Wartbarkeit negiert wird.

REW
quelle
2
Hier ist eine zusätzliche gute Lektüre zum Thema und viel unterhaltsamer qntm.org/gay
jcolebrand
5

Ich empfehle, den folgenden Anhang in einigen neueren Büchern von Chris Date zu lesen :

Zwei Beifall für die Normalisierung

Normalisierung ist alles andere als ein Allheilmittel, wie wir leicht erkennen können, wenn wir uns überlegen, welche Ziele sie verfolgt und wie gut sie mit ihnen in Einklang steht ...

Ich muss klarstellen, dass meine Kommentare in diesem Abschnitt nicht als Angriffe aufgefasst werden sollen. Ich bin der festen Überzeugung, dass alles andere als ein vollständig normalisiertes Design stark kontraindiziert ist ...

eines Tages, wenn
quelle
2

Ich denke, es ist ebenso wichtig, sich die explizit hinzugefügten Denormalisierungen anzusehen, entweder hinzugefügte Aggregatwerte oder einige Felder aus einer Mastertabelle, die in eine Detailkopie kopiert wurden.

Das Argument ist hauptsächlich ein Leistungsargument.

Wenn Sie dies erzwingen, müssen diese Felder durch Trigger aktualisiert werden und die Datenbank muss sie konsistent halten.

bernd_k
quelle
2

Ich stimme vollkommen mit @jcolebrand überein. Wenn Sie ein Modell für Ihre Anwendung entwerfen, sollten Sie alles normalisieren, was Sie können. Dann sollten Sie jedoch die Abfragen, die über Ihrem Modell erstellt wurden, profilieren, insbesondere die Abfragen, die häufig ausgeführt werden.

Meine eigene Erfahrung: Attribute, für deren Erreichen zwei Verknüpfungen erforderlich waren (dh drei verknüpfte Tabellen), sind meistens ein Leistungsproblem. Und um die Sache noch schlimmer zu machen, wird es bei Online-Transaktionen verwendet. Ich denormalisiere das Attribut, so dass nur ein Join erforderlich ist, und fordere den Programmierer auf, die App für die Abfrage anzupassen und das Attribut zu aktualisieren. Jetzt funktioniert es viel besser ...

Mit anderen Worten, Sie sollten die Normalisierung mit der Leistung in Einklang bringen.

Isaac A. Nugroho
quelle