Um die Bedeutung der ursprünglichen Frage vollständig zu verstehen, müssen Sie etwas über die Teamdynamik in der Systementwicklung und die Art des Verhaltens (oder Fehlverhaltens) verstehen, zu dem verschiedene Rollen/Typen von Menschen prädisponiert sind. Normalisierung ist wichtig, weil es nicht nur eine sachliche Debatte über Entwurfsmuster ist, sondern auch viel damit zu tun hat, wie Systeme im Laufe der Zeit entworfen und verwaltet werden.
Datenbankmitarbeiter sind darauf geschult, dass die Integrität der Daten von größter Wichtigkeit ist. Wir denken gerne in Begriffen der 100%igen Korrektheit von Daten, so dass man, wenn die Daten einmal in der DB sind, nicht mehr darüber nachdenken oder sich damit befassen muss, ob sie jemals logisch falsch sind. Diese Denkweise misst der Normalisierung einen hohen Stellenwert bei, weil sie ein Team dazu zwingt, sich mit der zugrunde liegenden Logik der Daten und des Systems auseinanderzusetzen. Ein triviales Beispiel: Hat ein Kunde nur einen Namen und eine Adresse, oder könnte er mehrere haben? Irgendjemand muss das entscheiden, und das System ist darauf angewiesen, dass diese Regel konsequent angewendet wird. Das klingt nach einem einfachen Problem, aber multiplizieren Sie dieses Problem mit dem 500-fachen, wenn Sie ein einigermaßen komplexes System entwerfen, und Sie werden das Problem erkennen - Regeln können nicht nur auf dem Papier bestehen, sie müssen durchgesetzt werden. Ein gut normiertes Datenbankdesign (mit zusätzlicher Hilfe von Eindeutigkeitsbeschränkungen, Fremdschlüsseln, Prüfwerten, logikerzwingenden Triggern usw.) kann Ihnen helfen, ein gut definiertes Kerndatenmodell und Regeln für die Datenkorrektheit zu haben, was wirklich wichtig ist, wenn Sie wollen, dass das System wie erwartet funktioniert, wenn viele Leute an verschiedenen Teilen des Systems arbeiten (verschiedene Anwendungen, Berichte, was auch immer) und verschiedene Leute im Laufe der Zeit an dem System arbeiten. Oder anders ausgedrückt: Wenn Sie keine Möglichkeit haben, ein solides Kerndatenmodell zu definieren und operativ durchzusetzen, wird Ihr System schlecht funktionieren.
Andere Leute (oft weniger erfahrene Entwickler) sehen das anders. Sie sehen die Datenbank bestenfalls als ein Werkzeug, das der Anwendung, die sie entwickeln, untergeordnet ist, oder schlimmstenfalls als eine zu vermeidende Bürokratie. (Beachten Sie, dass ich von "weniger erfahrenen" Entwicklern spreche. Ein guter Entwickler wird sich der Notwendigkeit eines soliden Datenmodells und der Korrektheit der Daten ebenso bewusst sein wie ein Datenbankexperte. Sie mögen unterschiedlicher Meinung darüber sein, was der beste Weg ist, um dies zu erreichen, aber meiner Erfahrung nach sind sie ziemlich offen dafür, diese Dinge in einer DB-Schicht zu tun, solange das DB-Team weiß, was es tut und auf die Entwickler eingehen kann.) Diese weniger erfahrenen Leute sind oft diejenigen, die auf die Denormalisierung drängen, mehr oder weniger als Ausrede für eine schnelle und schmutzige Arbeit beim Entwurf und der Verwaltung des Datenmodells. Auf diese Weise entstehen Datenbanktabellen, die 1:1 mit den Anwendungsbildschirmen und Berichten übereinstimmen, wobei jede Tabelle die Entwurfsannahmen eines anderen Entwicklers widerspiegelt, und die Tabellen sind völlig uneinheitlich und inkohärent. Ich habe das in meiner Laufbahn schon mehrmals erlebt. Es ist eine entmutigende und äußerst unproduktive Art, ein System zu entwickeln.
Ein Grund dafür, dass die Menschen ein starkes Gefühl für die Normalisierung haben, ist also, dass das Thema stellvertretend für andere Themen steht, die ihnen am Herzen liegen. Wenn Sie in eine Debatte über Normalisierung hineingezogen werden, denken Sie an die zugrunde liegende (nicht-technische) Motivation, die die Parteien in die Debatte einbringen könnten.
Dies vorausgeschickt, hier eine direktere Antwort auf die ursprüngliche Frage :)
Es ist sinnvoll, sich Ihre Datenbank so vorzustellen, dass sie aus einem Kerndesign, das einem logischen Design so nahe wie möglich kommt - hochgradig normalisiert und eingeschränkt - und einem erweiterten Design besteht, das andere Aspekte wie stabile Anwendungsschnittstellen und Leistung berücksichtigt.
Sie sollten Ihr Kerndatenmodell einschränken und normalisieren wollen, denn wenn Sie das nicht tun, gefährden Sie die grundlegende Integrität der Daten und alle Regeln/Annahmen, auf denen Ihr System aufbaut. Wenn Sie diese Aspekte außer Acht lassen, kann Ihr System sehr schnell unbrauchbar werden. Testen Sie Ihr Kerndatenmodell anhand von Anforderungen und realen Daten, und iterieren Sie wie verrückt, bis es funktioniert. Dieser Schritt wird sich eher wie die Klärung von Anforderungen anfühlen als die Entwicklung einer Lösung, und das sollte er auch. Verwenden Sie das Kerndatenmodell als Zwangsfunktion, um klare Antworten auf diese Designfragen für alle Beteiligten zu erhalten.
Vervollständigen Sie Ihr Kerndatenmodell, bevor Sie mit dem erweiterten Datenmodell fortfahren. Nutzen Sie es und sehen Sie, wie weit Sie damit kommen. Abhängig von der Datenmenge, der Anzahl der Benutzer und den Nutzungsmustern benötigen Sie vielleicht nie ein erweitertes Datenmodell. Schauen Sie, wie weit Sie mit der Indizierung und den 1.001 leistungsbezogenen Knöpfen, die Sie in Ihrem DBMS drehen können, kommen.
Wenn Sie die Leistungsmanagement-Funktionen Ihres DBMS wirklich ausschöpfen wollen, müssen Sie Ihr Datenmodell so erweitern, dass eine Denormalisierung hinzugefügt wird. Dabei geht es nicht um die Denormalisierung Ihres Kerndatenmodells, sondern um das Hinzufügen neuer Ressourcen, die die Denormdaten verarbeiten. Wenn es beispielsweise einige große Abfragen gibt, die Ihre Leistung erdrücken, sollten Sie einige Tabellen hinzufügen, die die Daten, die diese Abfragen erzeugen würden, vorberechnen, d. h. die Abfrage wird im Wesentlichen vorab ausgeführt. Es ist wichtig, dies so zu tun, dass die Kohärenz der denormalisierten Daten mit den (normalisierten) Kerndaten erhalten bleibt. In DBMS, die dies unterstützen, können Sie zum Beispiel eine MATERIALIZED VIEW verwenden, um die Pflege der denormalisierten Daten zu automatisieren. Wenn Ihr DBMS diese Möglichkeit nicht bietet, können Sie vielleicht Trigger für die Tabellen erstellen, in denen die zugrunde liegenden Daten vorhanden sind.
Es besteht ein himmelweiter Unterschied zwischen Selektiv Denormalisierung einer Datenbank in einem kohärent die Art und Weise, wie man mit einer realistischen Leistungsherausforderung umgeht, im Gegensatz zu einem schwachen Datendesign, bei dem man die Leistung als Rechtfertigung dafür benutzt.
Wenn ich mit wenig bis mittelmäßig erfahrenen Datenbankmitarbeitern und -entwicklern zusammenarbeite, bestehe ich darauf, dass sie ein absolut normalisiertes Design erstellen ... und kann dann später eine kleine Anzahl erfahrenerer Mitarbeiter in eine Diskussion über selektive Denormalisierung einbeziehen. Denormalisierung ist in Ihrem Kerndatenmodell mehr oder weniger immer schlecht. Außerhalb des Kerns ist an der Denormalisierung überhaupt nichts auszusetzen, wenn Sie sie überlegt und kohärent durchführen.
Mit anderen Worten, eine Denormalisierung von einem normalen Entwurf zu einem Entwurf, der das Normale beibehält und gleichzeitig etwas Denormales hinzufügt - das sich mit der physischen Realität Ihrer Daten befasst, während die wesentliche Logik erhalten bleibt - ist in Ordnung. Entwürfe, die keinen Kern aus normalem Design haben - die man nicht einmal als de-normalisiert bezeichnen sollte, weil sie von vornherein nie normalisiert waren, weil sie nie bewusst auf disziplinierte Weise entworfen wurden - sind nicht in Ordnung.
Akzeptieren Sie nicht die Terminologie, dass ein schwaches, undiszipliniertes Design ein "denormalisiertes" Design ist. Ich glaube, dass die Verwirrung zwischen absichtlich/vorsichtig denormalisierten Daten und einfachem, altem, beschissenem Datenbankdesign, das zu denormalen Daten führt, weil der Designer ein unvorsichtiger Idiot war, die Hauptursache für viele der Debatten über Denormalisierung ist.
0 Stimmen
Normalisierung = minimale, nicht redundante Darstellung = das ursprüngliche Prinzip "Don't Repeat Yourself" (DRY)
0 Stimmen
Dieses Thema wurde auch hier behandelt: stackoverflow.com/questions/292797/overnormalization
0 Stimmen
Ein weiterer Link: stackoverflow.com/questions/166028/handling-große-datenbanken