Antworten:
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.
in ('forgiven','pardoned')
;): p
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.
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 ...
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.
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.