Warum ignorieren viele Designs die Normalisierung in RDBMS?

23

Ich habe viele Entwürfe gesehen, bei denen Normalisierung nicht die erste Überlegung in der Entscheidungsphase war.

In vielen Fällen umfassten diese Entwürfe mehr als 30 Spalten, und der Hauptansatz bestand darin, "alles an der gleichen Stelle zu platzieren".

Soweit ich mich erinnere, ist Normalisierung eines der ersten und wichtigsten Dinge. Warum wird es manchmal so leicht fallen gelassen?

Bearbeiten:

Stimmt es, dass gute Architekten und Experten ein denormalisiertes Design wählen, während nicht erfahrene Entwickler das Gegenteil wählen? Was sind die Argumente gegen den Beginn Ihres Entwurfs im Hinblick auf Normalisierung?

Yosi Dahari
quelle
7
weil normalisierte DBs selbst bei den trivialsten Abfragen eine Menge Joins benötigen
Ratschenfreak
1
Diese Verknüpfungen müssen immer noch passieren, auch wenn sie von Ansichten verdeckt werden
Ratschenfreak
29
Viele Programmierer kennen die Grundlagen des relationalen Modells nicht.
mike30
10
Msgstr "Normalisieren, bis es weh tut, Denormalisieren, bis es funktioniert". codinghorror.com/blog/2008/07/… hat einige gute Antworten.
Matthew Steeples
3
Sie ignorieren dies, da sie weder Datenbankadministratoren noch BI-Analysten oder Sicherheitsprüfern antworten müssen.
Aaronaught

Antworten:

19

Das Interessante an diesem Q & A-Thread ist, dass es tatsächlich 3 Fragen gibt. Jeder hat einen anderen beantwortet, und fast niemand hat den ersten beantwortet:

  1. Warum werden einige Datenbanken nicht normalisiert?
  2. Warum / wann sollte eine normalisierte Datenbank denormalisiert werden ?
  3. In welchen Situationen ist es schädlich oder unnötig, sich überhaupt zu normalisieren?

Hinweisleser werden bemerken, dass dies sehr unterschiedliche Fragen sind, und ich werde versuchen, jede für sich zu beantworten, wobei zu viele Details vermieden werden. Mit "zu viel" meine ich, dass dies nicht der geeignete Kontext ist, um eine ausführliche Debatte über die Begründetheit verschiedener Argumente für oder gegen die Normalisierung zu führen. Ich werde einfach erklären, was diese Argumente sind, vielleicht ein paar Einschränkungen auflisten und die Philosophie für spezifischere Fragen speichern, falls sie jemals auftauchen.

Außerdem gehe ich in dieser Antwort davon aus, dass "Normalisierung" "BCNF, 3NF oder mindestens 2NF " impliziert , da dies der Grad der Normalisierung ist, den Designer im Allgemeinen anstreben. Es ist seltener, 4NF- oder 5NF-Designs zu sehen. Obwohl es sich sicherlich nicht um unmögliche Ziele handelt, befassen sie sich mit der Semantik von Beziehungen und nicht nur mit deren Repräsentation , was wesentlich mehr Wissen über den Bereich erfordert.

Also vorwärts und aufwärts:

1. Warum werden einige Datenbanken nicht normalisiert?

Die Antwort auf diese Frage könnte lauten "weil sie es nicht sein sollten", aber diese Vermutung auf Anhieb zu machen, ist eine ziemlich pissarme Detektivarbeit. Wir würden als Gesellschaft nicht sehr weiterkommen, wenn wir immer davon ausgehen würden, dass das, was auch immer ist, es sein sollte.

Die wahren Gründe, warum Datenbanken überhaupt nicht normalisiert werden, sind komplizierter. Hier sind die Top 5, auf die ich gestoßen bin:

  • Die Entwickler, die es entworfen haben, wussten oder verstanden nicht, wie man es normalisiert. Ein starker Beweis dafür sind viele andere schlechte Designentscheidungen, wie die Verwendung von varchar-Spalten für alles oder das Durcheinander bedeutungsloser Tabellen- und Spaltennamen . Und ich versichere Ihnen, ich habe "echte" Datenbanken gesehen, die genauso schlecht sind wie die in den TDWTF-Artikeln.

  • Die Entwickler, die es entworfen haben, haben sich aus Prinzip nicht darum gekümmert oder waren aktiv gegen Normalisierung . Ich spreche hier nicht von Fällen, in denen absichtlich entschieden wurde, nicht auf der Grundlage von Kontextanalysen zu normalisieren, sondern von Teams oder Unternehmen, in denen Normalisierung mehr oder weniger verstanden, aber einfach ignoriert oder aus Gewohnheit gemieden wird. Wieder überraschend häufig.

  • Die Software wird / wurde als Brownfield-Projekt erstellt . Viele Puristen ignorieren dieses absolut legitime Geschäft und nicht den technischen Grund, sich nicht zu normalisieren. Manchmal ist es nicht möglich, eine neue Datenbank von Grund auf neu zu entwerfen, sondern Sie müssen sich auf ein vorhandenes Legacy-Schema beschränken, und der Versuch, an diesem Punkt zu normalisieren, würde viel zu viel Aufwand bedeuten. 3NF wurde erst 1971 erfunden und einige Systeme - insbesondere Finanz- / Buchhaltungssysteme - haben ihre Wurzeln noch weiter zurück!

  • Die Datenbank wurde ursprünglich normalisiert , aber eine Ansammlung kleiner Änderungen über einen langen Zeitraum und / oder ein weit verbreitetes Team führten subtile Formen der Vervielfältigung und andere Verstöße gegen die ursprüngliche Normalform ein. Mit anderen Worten, der Normalisierungsverlust war zufällig und es wurde zu wenig Zeit für die Umgestaltung aufgewendet.

  • Es wurde absichtlich die Entscheidung getroffen, keine Zeit für Geschäftsanalysen oder Datenbankentwürfe aufzuwenden und einfach "fertig" zu werden. Dies ist oft eine falsche Ökonomie und wird letztendlich zu einer Form der technischen Verschuldung , ist aber manchmal eine rationale Entscheidung, zumindest basierend auf Informationen, die zu der Zeit bekannt waren - zum Beispiel könnte die Datenbank als Prototyp gedacht gewesen sein, aber am Ende stehen aufgrund von Zeitbeschränkungen oder Änderungen im Geschäftsumfeld in den Produktionsbetrieb befördert werden.

2. Warum / wann sollte eine normalisierte Datenbank denormalisiert werden?

Diese Diskussion kommt oft auf , wenn eine Datenbank wird normalisiert zu beginnen. Entweder ist die Leistung schlecht oder die Abfragen (Joins) sind doppelt vorhanden, und das Team ist zu Recht oder zu Unrecht der Meinung, dass es mit dem aktuellen Design so weit wie möglich gekommen ist. Es ist wichtig zu beachten, dass die Normalisierung die meiste Zeit die Leistung verbessert. Es gibt verschiedene Möglichkeiten, um übermäßige Verknüpfungen zu beseitigen, wenn die Normalisierung gegen Sie zu wirken scheint. Viele davon sind weniger invasiv und riskant als der einfache Wechsel zu einem denormalisierten Modell:

  • Erstellen Sie indizierte Ansichten, in denen die häufigsten Problembereiche zusammengefasst sind. Moderne DBMS können sie einfügbar oder aktualisierbar machen (z. B. SQL Server- INSTEAD OFTrigger). Dies ist für DML-Anweisungen in den zugrunde liegenden Tabellen / Indizes mit geringen Kosten verbunden, aber im Allgemeinen die erste Option, die Sie ausprobieren sollten, da es nahezu unmöglich ist, Fehler zu machen, und fast nichts kostet, diese zu warten. Natürlich kann nicht jede Abfrage in eine indizierte Ansicht umgewandelt werden - aggregierte Abfragen sind am schwierigsten. Was uns zum nächsten Punkt führt ...

  • Erstellen Sie denormalisierte Aggregattabellen, die von Triggern automatisch aktualisiert werden. Diese Tabellen existieren zusätzlich zu den normalisierten Tabellen und bilden eine Art CQRS- Modell. Ein anderes CQRS-Modell, das heutzutage immer beliebter wird, ist die Aktualisierung der Abfragemodelle mithilfe von Pub / Sub, was den Vorteil der Asynchronität bietet. Dies ist jedoch möglicherweise in sehr seltenen Fällen ungeeignet, in denen die Daten nicht veraltet sind.

  • Manchmal sind indizierte Ansichten nicht möglich, die Transaktionsraten und das Datenvolumen sind zu hoch, um Trigger mit akzeptabler Leistung zuzulassen, und die Abfragen müssen immer Echtzeitdaten zurückgeben. Diese Situationen sind selten - ich würde vermuten, dass sie auf Dinge wie Hochfrequenzhandel oder Strafverfolgungs- / Nachrichtendatenbanken zutreffen - aber sie können existieren. In diesen Fällen haben Sie wirklich keine andere Wahl, als die Originaltabellen zu denormalisieren.

3. In welchen Situationen ist es schädlich oder unnötig, sich überhaupt zu normalisieren?

Tatsächlich gibt es hier einige gute Beispiele:

  • Wenn die Datenbank nur für die Berichterstellung / Analyse verwendet wird. In der Regel bedeutet dies, dass für OLTP eine zusätzliche , normalisierte Datenbank verwendet wird, die regelmäßig über ETL oder Messaging mit der Analysedatenbank synchronisiert wird.

  • Bei der Durchsetzung eines normalisierten Modells wäre eine unnötig komplexe Analyse der eingehenden Daten erforderlich. Ein Beispiel hierfür ist möglicherweise ein System, das Telefonnummern speichern muss, die von mehreren externen Systemen oder Datenbanken gesammelt wurden. Sie könnten die Rufnummer und die Ortsvorwahl denormalisieren, müssten jedoch alle möglichen Formate, ungültigen Telefonnummern und Vanity-Nummern (1-800-GET-STUFF) berücksichtigen, ganz zu schweigen von den verschiedenen Ländereinstellungen. Es ist normalerweise mehr Mühe als es wert ist, und Telefonnummern werden normalerweise nur in ein einzelnes Feld eingegeben, es sei denn, Sie haben einen bestimmten Geschäftsbedarf für die Vorwahl alleine.

  • Wenn die relationale Datenbank in erster Linie dazu dient, Transaktionsunterstützung für eine zusätzliche, nicht relationale Datenbank bereitzustellen. Beispielsweise können Sie die relationale Datenbank als Nachrichtenwarteschlange verwenden oder den Status einer Transaktion oder Saga verfolgen, wenn die primären Daten in Redis oder MongoDB oder in einem anderen Verzeichnis gespeichert sind. Mit anderen Worten sind die Daten "Steuerdaten". Normalerweise macht es keinen Sinn, Daten zu normalisieren, die eigentlich keine Geschäftsdaten sind .

  • Serviceorientierte Architekturen, die eine physische Datenbank gemeinsam nutzen. Dies ist ein bisschen seltsam, aber in einer echten SOA müssen gelegentlich Daten physisch dupliziert werden, da die Dienste nicht direkt die Daten der anderen abfragen dürfen. Wenn sie passieren die gleiche physische Datenbank zu teilen, werden die Daten erscheinen nicht normalisiert werden - aber in der Regel, die von jedem einzelnen Dienst eigenen Daten sind immer noch normalisieren es sei denn , eine der anderen schadensbegrenzenden Faktoren an seinem Platz ist. Ein Abrechnungsdienst besitzt möglicherweise die Entität "Rechnung", der Abrechnungsdienst muss jedoch das Rechnungsdatum und den Rechnungsbetrag empfangen und speichern, damit er in den Umsatz für dieses Jahr einbezogen werden kann.

Ich bin sicher, dass es weitere Gründe gibt, die ich nicht aufgelistet habe. Was ich im Wesentlichen verstehe, ist, dass sie ziemlich spezifisch sind und ziemlich offensichtlich sein werden, wenn sie in der Praxis auftauchen. OLAP-Datenbanken sollten Sternschemata verwenden, SOAs sollten einige Duplikate aufweisen usw. Wenn Sie mit einem bekannten Architekturmodell arbeiten, das mit Normalisierung einfach nicht funktioniert, werden Sie nicht normalisiert. Im Allgemeinen hat das Architekturmodell Vorrang vor dem Datenmodell.

Und um die allerletzte Frage zu beantworten:

Stimmt es, dass gute Architekten und Experten ein denormalisiertes Design wählen, während nicht erfahrene Entwickler das Gegenteil wählen? Was sind die Argumente gegen den Beginn Ihres Entwurfs im Hinblick auf Normalisierung?

Nein, das ist ein vollständiges und vollständiges BS. Es ist auch BS, dass Experten immer ein normalisiertes Design wählen . Experten folgen nicht nur einem Mantra. Sie recherchieren, analysieren, diskutieren, klären und iterieren und wählen dann den Ansatz, der für ihre jeweilige Situation am sinnvollsten ist.

Die 3NF- oder BCNF-Datenbank ist in der Regel ein guter Ausgangspunkt für die Analyse, da sie sich in Zehntausenden von Projekten auf der ganzen Welt bewährt hat, aber auch in C. Das bedeutet nicht, dass wir C automatisch in allen Projekten verwenden neues Projekt. In realen Situationen können einige Änderungen am Modell oder die Verwendung eines anderen Modells erforderlich sein. Sie wissen es nicht, bis Sie in dieser Situation sind.

Aaronaught
quelle
1
Sie sollten dies kopieren und in einen Blog-Artikel einfügen ... das ist GOLD.
Marcel Popescu
15

Die in der Frage und in einigen Antworten enthaltene Annahme ist, dass Normalisierung auch ein gutes Datenbankdesign ist. Dies ist in der Tat oft nicht der Fall. Normalisierung ist eine Möglichkeit, bestimmte Entwurfsziele zu erreichen, und eine Anforderung, wenn Sie sich stark auf die Datenbank verlassen, um "Geschäftsregeln" für die Beziehungen zwischen Datenelementen durchzusetzen.

Die Normalisierung bietet Ihnen einige wichtige Vorteile:

  1. Minimiert die Menge redundanter Daten.
  2. Maximiert das Ausmaß, in dem die in der Datenbank integrierten Integritätsmechanismen (Fremdschlüsselbeschränkungen, Eindeutigkeitsbeschränkungen) genutzt werden können, um die Integrität der Daten sicherzustellen.
  3. Reduziert die Anzahl der Spalten pro Zeile und erhöht in einigen Fällen die Effizienz von E / A. Das Abrufen breiter Zeilen dauert länger.

Das heißt, es gibt viele triftige Gründe für eine Denormalisierung:

  1. Die Leistung, insbesondere für Analysen, kann durch Normalisierung beeinträchtigt werden. Für die Analyse gegen relationale Datenbanken sind denormalisierte dimensionale Modelle der Standardansatz.
  2. Der Vorteil der Durchsetzung der Datenintegrität in der Datenbank nimmt allmählich ab. Da sich die Entwicklung immer mehr auf die objektorientierte Mittelschicht konzentriert, die häufig Geschäftsregeln durchsetzt, ist die Abhängigkeit von relationalen Einschränkungen in der Datenbank weniger wichtig.
  3. Wie bereits erwähnt, erschwert die Normalisierung die zum Abrufen relevanter Daten erforderlichen Abfragen.

Es ist nicht klar, dass Normalisierung ein Zeichen für gutes Design ist. In einigen Fällen ist die Normalisierung ein Artefakt einer Zeit, in der Speicherplatz knapp war und in der ein Großteil der Verantwortung für die Codierung von Geschäftsregeln in der Datenbank lag (denken Sie an Client-Server-Anwendungen mit zwei Ebenen und den meisten, wenn nicht allen Geschäftslogiken) Gespeicherte Prozeduren). Es kann durchaus sein, dass viele Projekte aufgrund guter Architekturentscheidungen von der Normalisierung abweichen, anstatt die Prinzipien des Datenbankdesigns schlecht zu verstehen.

Der Artikel von Jeff Atwood, auf den in den obigen Kommentaren verwiesen wird, bietet eine gute ausführliche Diskussion - "Vielleicht ist Normalisieren nicht normal" .

DemetriKots
quelle
7
Hallo Yosi, ich verstehe deinen Standpunkt. Normalisierung ist eine Grundvoraussetzung, um die Theorie relationaler Datenbanken wirklich zu verstehen, und kann in der Praxis angewendet werden. Es ist daher nicht verwunderlich, dass es sich um ein großes Thema in Kursen handelt. Gute Ingenieure sollten es verstehen und verstehen, wann es angewendet werden sollte. Die Sache, die in der Kursarbeit nicht behandelt zu werden scheint, ist, dass selektives Denormalisieren eine Menge Nutzen bringen kann und einige Probleme sich nicht für normalisierte Modelle eignen.
DemetriKots
1
Was ist mit Datenkonsistenz? Wenn Sie zum Beispiel den Shopnamen in allen Details eines Verkaufs haben, können Sie möglicherweise unterschiedliche widersprüchliche Beschreibungen haben. Wenn die Daten normalisiert sind, wird der Shopname nur einmal angezeigt (in der Shoptabelle) und es gibt keinen Platz für Inkonsistenzen.
Tulains Córdova
1
Genau. Ich denke, die Normalisierung wird manchmal von Datenbankadministratoren überholt, denen beigebracht wurde, dass dies das beste Design ist. Ich habe immer vorgeschlagen, dass die DBAs die Tabellen in der ETL nach Belieben normalisieren können, aber wenn es um die Tabellen geht, auf die die Benutzeroberfläche verweist, benötige ich Tabellen, die ohne übermäßige Verknüpfungen einfach abzufragen sind. Ich bin auf Tabellen gestoßen, die zu stark normalisiert waren, sodass ich Benutzerprobleme kaum beheben konnte, ohne dafür Stunden für die Fehlerbehebung aufzuwenden.
L_7337
1
Au contraire, ist Analytik irrsinnig schwierig , wenn Sie nicht in der Lage sind , beginnen von einem normalisierten Modell. Ich musste nur diese Übung machen, und es war die Hölle. Anwendungsentwickler sollten niemals davon ausgehen, dass ein denormalisiertes Schema für Analyseanforderungen geeignet ist. Und Punkt 3 gegen die Normalisierung ist ein Problem, das durch materialisierte / indizierte Ansichten fast trivial gelöst wird.
Aaronaught
1
Und # 2 klingt vernünftig, belastet aber die Glaubwürdigkeit in der Praxis - ich kann mich nicht erinnern, dass ich in meinen über 10 Jahren eine einzige Instanz gesehen habe, in der die Anwendung tatsächlich gründliche Zwänge durchgesetzt hat. In den meisten Fällen setzen Entwickler Geschäftsregeln entweder fälschlicherweise mit Datenintegrität in Verbindung oder nutzen die Tatsache, dass ORMs theoretisch relationale Einschränkungen durchsetzen können , als Entschuldigung dafür, dies überhaupt nicht zu tun. Vielleicht bin ich nur zynisch, aber alle meine beruflichen Erfahrungen haben mich gelehrt, dass Aussagen wie "die Anwendung wird die Datenintegrität erzwingen" enorme rote Fahnen sind.
Aaronaught
11
  1. Viele Entwickler wissen nichts über Normalisierung, Datenmodellierung oder Datenbank.
  2. Für manche Jobs ist es wirklich nicht wichtig.
  3. Manchmal gibt es einen guten Grund, sich zu de-normalisieren, zum Beispiel, um eine besonders schwierige Arbeitsbelastung gut zu machen.
  4. Relationale Datenbankkonzepte sind in letzter Zeit weniger in Mode als in den 1990er und 2000er Jahren. Entwickler neigen dazu, von der Mode beeinflusst zu werden, auch wenn sie behaupten, sehr rational zu sein. Über Geschmack lässt sich nicht streiten.

Normalisierung ist historisch gesehen auch ein Gebiet für religiöse Auseinandersetzungen, daher zögere ich, noch viel mehr zu sagen.

joshp
quelle
Ich füge hinzu, dass relational manchmal nicht das richtige Design für eine Datenbank ist. Beispielsweise ist ein LDAP-Verzeichnis hierarchisch, einige andere Typen können durch ein flaches Design besser bedient werden.
Maximus Minimus
1
In Bezug auf Punkt 4 würde ich sagen, dass relationale Datenbanken weniger in Mode sind und allmählich gegen nosql-Varietäten ausgetauscht werden, und das ist in der Regel eine großartige Sache. Aber ich sehe nicht viele Macher, die nicht relationale Datenmodelle mithilfe eines RDBMS zusammenführen. Das ist doch blöd.
Aaronaught
@joshp - Danke, schöne Zusammenfassung. Punkt 3 ist der Punkt, der mich persönlich mehr interessiert. Warum "schlagen" andere Faktoren das Bedürfnis nach Normalisierung?
Yosi Dahari
@ JimmyShelter Ich stimme zu. Abgesehen von der Mode ist relational nicht immer die beste Wahl.
Joshp
4
@Yosi - Der Grund, warum einige Faktoren die Normalisierung übertreffen können, ist, dass die Normalisierung eine Technik ist, mit der häufige Datenkonsistenzprobleme beim Einfügen, Aktualisieren und Löschen von Daten vermieden werden. Wenn die Daten einmal geschrieben und erst danach gelesen werden, sind C, U und D von CRUD nicht mehr wichtig. In einem solchen Fall sind die Vorteile der Normalisierung im Grunde genommen bedeutungslos, sodass andere konkurrierende Faktoren Vorrang haben können, z. B. die Leseleistung oder die Einfachheit der Abfrage.
Joel Brown
9

Bei großen Projekten und insbesondere bei Großrechnern ist dies nicht der Fall. Tatsächlich sehen Sie beim Durchsuchen von Websites mehrere Stellen für Datenmodellierer. Auch das Vorhandensein vieler Spalten in einer einzelnen Tabelle widerspricht nicht der Normalisierung. Trotzdem gilt Ihre Beobachtung für einige Projekte.

Das Datenbankdesign ist eine der Fähigkeiten, die zum Aufbau von Qualitätssystemen erforderlich sind. Allerdings wissen einige Entwickler nicht genug über Datenbankdesign und werden dennoch mit der Aufgabe der Datenmodellierung und des Datenbankdesigns beauftragt. Einige Projekte überspringen sogar die Datenmodellierung. Der Schwerpunkt vieler Projekte liegt hauptsächlich auf Codierung und Front-End-Design.

Ein weiterer Grund für ein schlechtes Datenbankdesign ist die Tatsache, dass die Normalisierung kein triviales Thema ist, insbesondere wenn es um die 4. NF, 5. NF usw. geht. Die meisten Bücher, die ich gesehen habe, konnten diese Formen nicht klar erklären. Es gibt normalerweise schlechte Beispiele und zu viel Theorie. Dies macht das Thema weniger populär als es sollte.

Fehler im Datenbankdesign sind schwer zu finden, es sei denn, Sie suchen sie oder begegnen ihnen beim Testen. Wenn es keinen Standard für die Qualität des Datenbankdesigns gibt, können Fehler wahrscheinlicher auftreten.

Hinzu kommt, dass einige Projekte keiner strengen Entwicklungsmethode folgen (einer, die das Datenbankdesign fördert). Infolgedessen gehen Verantwortlichkeiten und Aufgaben zwischen dem Geschäftsanalysten, den Entwicklern und den Datenbankadministratoren verloren. Entwickler sprechen in OO und UML, während DBAs in DD und einige in ERDs sprechen und wahrscheinlich viele keine UML oder OO erhalten. Kurz gesagt, der Mangel an Wissen, das Fehlen guter klarer Ressourcen, das Fehlen einer einheitlichen Sprache zur Beschreibung von Daten und das Fehlen von Methodik sind alle schuld.

Keine Chance
quelle
Können Sie Dokumente / Artikel in Datenbankdesignqualität (nicht nur Schema, sondern auch Verfahren) vorschlagen?
Tilak
"Viele Spalten in einer einzigen Tabelle zu haben, widerspricht nicht der Normalisierung" - Sicher. Meine Absicht war #entailments. In der Frage, die ich der Einfachheit halber #columns genannt habe, ging ich davon aus, dass der Leser die Korrelation verstehen wird und damit, was ich meinte
Yosi Dahari,
@ Tilak, ich bin nicht sicher, ob es eine spezielle Referenz gibt, um die besten Richtlinien zu erhalten, aber Sie können Ihre Liste aus der Literatur zu Datenmodellierung und Datenbankdesign zusammenstellen. Entschuldigung, wenn dies Ihre Frage nicht beantwortet. Ich denke, dass dies ein gutes Thema für ein Buch sein könnte.
NoChance