Wann sollten Sie denormalisieren?

45

Ich denke, wir sind alle mit der Normalisierung von Datenbanken vertraut .

Meine Frage ist: Welche Richtlinien verwenden Sie, wenn Sie die Tabellen denormalisieren möchten?

Richard
quelle
3
StackExchange-Websites haben gegenüber anderen Websites im Internet den einzigartigen Vorteil, dass 1) die besten Antworten am einfachsten zu finden sind und 2) die besten Antworten von der Community bestimmt werden. Aus diesem Grunde glaube ich , dass diese Website und das Internet von dieser Frage profitieren würden, trotz dass es Art des geht gegen FAQ .
Richard
2
mögliches Duplikat von Wie weit solltest du mit der Normalisierung gehen?
Jack Douglas
1
Mögliche Duplikate / zugehörige Informationen Zeitpunkt der Denormalisierung des Datenbankdesigns
John Sansom

Antworten:

34

Denormalisieren, wenn es sich um OLAP-Vorgänge handelt, Normalisieren, wenn OLTP (aus dem verknüpften Artikel im Abschnitt Denormalisierung)

Datenbanken, die für die Online-Transaktionsverarbeitung (OLTP) vorgesehen sind, sind in der Regel stärker normalisiert als Datenbanken, die für die Online-Analyseverarbeitung (OLAP) vorgesehen sind. OLTP-Anwendungen zeichnen sich durch ein hohes Volumen kleiner Transaktionen aus, z. B. durch die Aktualisierung eines Umsatzdatensatzes an einer Supermarktkasse. Es wird erwartet, dass jede Transaktion die Datenbank in einem konsistenten Zustand belässt. Im Gegensatz dazu handelt es sich bei für OLAP-Vorgänge bestimmten Datenbanken in erster Linie um "meistens gelesene" Datenbanken. OLAP-Anwendungen extrahieren in der Regel historische Daten, die sich über einen langen Zeitraum angesammelt haben. Für solche Datenbanken können redundante oder "denormalisierte" Daten Business-Intelligence-Anwendungen erleichtern. Insbesondere enthalten Dimensionstabellen in einem Sternschema häufig denormalisierte Daten. Die denormalisierten oder redundanten Daten müssen während der Extraktions-, Transformations- und Ladeverarbeitung (ETL) sorgfältig kontrolliert werden, und es sollte Benutzern nicht gestattet werden, die Daten zu sehen, bis sie in einem konsistenten Zustand sind. Die normalisierte Alternative zum Sternschema ist das Schneeflockenschema. In vielen Fällen hat der Bedarf an Denormalisierung nachgelassen, da Computer und RDBMS-Software immer leistungsfähiger wurden. Da jedoch das Datenvolumen im Allgemeinen zusammen mit der Hardware- und Softwareleistung zugenommen hat, verwenden OLAP-Datenbanken häufig immer noch denormalisierte Schemata.

Die Denormalisierung wird auch verwendet, um die Leistung auf kleineren Computern zu verbessern, wie in computergestützten Registrierkassen und Mobilgeräten, da diese die Daten möglicherweise nur zum Nachschlagen verwenden (z. B. Preissuchen). Denormalisierung kann auch verwendet werden, wenn für eine Plattform (z. B. Palm) kein RDBMS vorhanden ist oder wenn keine Änderungen an den Daten vorgenommen werden sollen und eine schnelle Reaktion von entscheidender Bedeutung ist.

billinkc
quelle
4
Ich denormalisiere, wenn ich Berichte oder Analysen erstelle und schnelle Ergebnisse erzielen möchte. Alle Indizes der Welt mit mehreren Joins sind niemals so schnell wie eine denormalisierte Tabelle, die zwischengespeicherte Daten darstellt, die sich nicht ändern werden.
Kevin
Prägnant und sehr hilfreich. Ich habe an der Peripherie von DBA gearbeitet und dies hilft, viele Dinge in den Kreis zu schließen.
Jason P Sallinger
Viele Anwendungen haben sowohl OLAP- als auch OLTP-Anforderungen. Daher sollte jeder Back-End-Entwickler lernen, diese beiden zu mischen und die denormalisierten Daten auf dem neuesten Stand zu halten.
JustAMartin
22

Normalisieren, bis es weh tut, Denormalisieren, bis es funktioniert (dh: Leistung wird akzeptabel) :)

Andrei Rînea
quelle
5
Dies ist wahrscheinlich nicht die beste Antwort, aber es ist eine der besten Einzeiler, die ich auf Stack Overflow gesehen habe :)
Owen
15

Ein potenziell vernünftiger Grund für die Anwendung der kontrollierten Denormalisierung besteht darin, dass Sie auf die Daten eine Integritätsbeschränkung anwenden können, die sonst nicht möglich wäre. Die meisten SQL-DBMS unterstützen Einschränkungen für mehrere Tabellen nur sehr eingeschränkt. In SQL besteht die einzige effektive Möglichkeit, bestimmte Einschränkungen zu implementieren, manchmal darin, sicherzustellen, dass die an der Einschränkung beteiligten Attribute alle in derselben Tabelle vorhanden sind - auch wenn die Normalisierung vorschreibt, dass sie in separate Tabellen gehören.

Kontrollierte Denormalisierung bedeutet, dass Mechanismen implementiert werden, die sicherstellen, dass aufgrund redundanter Daten keine Inkonsistenzen auftreten können. Die Kosten dieser zusätzlichen Kontrollen und das Risiko inkonsistenter Daten müssen berücksichtigt werden, wenn entschieden wird, ob sich eine Denormalisierung lohnt.

Ein weiterer häufiger Grund für eine Denormalisierung besteht darin, eine Änderung der Speicherstrukturen oder eine andere physikalische Optimierung zuzulassen, die das DBMS sonst nicht zulassen würde. Nach dem Prinzip der Unabhängigkeit von physikalischen Daten sollte ein DBMS die Möglichkeit haben, interne Speicherstrukturen zu konfigurieren, ohne die logische Darstellung von Daten in der Datenbank unnötig zu ändern. Leider schränken viele DBMS die physischen Implementierungsoptionen für ein bestimmtes Datenbankschema sehr ein. Sie neigen dazu, die Unabhängigkeit der physischen Datenbank zu gefährden, indem sie nur eine suboptimale Implementierung des gewünschten logischen Modells unterstützen.

Es sollte offensichtlich sein, aber es muss noch gesagt werden: In allen Fällen können nur Änderungen der physischen Implementierungsmerkmale die Leistung bestimmen - Merkmale wie interne Datenstrukturen, Dateien, Indizierung, Hardware und so weiter. Normalisierung und Denormalisierung haben nichts mit Leistung oder Speicheroptimierung zu tun.

nvogel
quelle
4

Denormalisieren Sie, wenn Sie häufig auf berechnete Daten zugreifen, wie in den Antworten auf diese Frage vorgeschlagen . Die Kosten für das Speichern und Verwalten der berechneten Daten sind häufig geringer als die Kosten für das erneute Berechnen, wenn Ihr Lastprofil stark ausgelesen wird.

Nick Chammas
quelle
Beachten Sie, dass dies besonders hilfreich ist, wenn bei der Denormalisierung nur Werte zwischengespeichert werden sollen. Damit liegt noch eine normalisierte Auflistung von Tabellen / Feldern zugrunde. Das heißt, für jeden Wert sollte eine einzige "Master" -Zelle vorhanden sein, die diesen Wert enthält - bei anderen Werten handelt es sich bekanntermaßen lediglich um Kopien oder Berechnungen dieses Masters - in normalisierten Beziehungen.
ToolmakerSteve
3

Ich denormalisiere routinemäßig, damit ich die Datenintegrität mit Einschränkungen erzwingen kann. Ein Beispiel ist eine kürzlich auf dieser Site gestellte Frage : Ich repliziere eine Spalte in einer anderen Tabelle, damit ich sie mit einer CHECK-Einschränkung mit einer anderen Spalte vergleichen kann. Ein weiteres Beispiel für diese Technik ist mein Blogbeitrag .

Sie können CHECK-Einschränkungen nicht zum Vergleichen von Spalten in verschiedenen Zeilen oder in verschiedenen Tabellen verwenden, es sei denn, Sie binden diese Funktionen in skalare UDFs ein, die von einer CHECK-Einschränkung aufgerufen werden. Was ist, wenn Sie tatsächlich Spalten in verschiedenen Zeilen oder in verschiedenen Tabellen vergleichen müssen, um eine Geschäftsregel durchzusetzen? Angenommen, Sie kennen die Arbeitszeiten eines Arztes und möchten sicherstellen, dass alle Termine innerhalb der Arbeitszeiten liegen? Natürlich können Sie einen Auslöser oder eine gespeicherte Prozedur verwenden, um diese Geschäftsregel zu implementieren, aber weder ein Auslöser noch eine gespeicherte Prozedur können Ihnen eine 100% ige Garantie dafür geben, dass alle Ihre Daten sauber sind - jemand kann Ihren Auslöser deaktivieren oder löschen, etwas eingeben fehlerhafte Daten, und aktivieren Sie den Trigger erneut oder erstellen Sie ihn erneut. Außerdem kann jemand Ihre Tabelle direkt ändern und gespeicherte Prozeduren umgehen.

Lassen Sie mich zeigen, wie Sie diese Geschäftsregel nur mit FK- und CHECK-Einschränkungen implementieren. Dadurch wird sichergestellt, dass alle Daten die Geschäftsregel erfüllen, solange alle Einschränkungen vertrauenswürdig sind.

Ein weiteres Beispiel ist ein Weg, um sicherzustellen, dass Zeiträume keine Lücken und keine Überlappungen aufweisen .

AK
quelle
1
"Ich denormalisiere routinemäßig, damit ich die Datenintegrität mit Einschränkungen erzwingen kann." Hier gilt das gleiche. Es ist ein großartiger Kompromiss: Sie denormalisieren ein wenig, gewinnen aber DRI .
Nick Chammas
@ NickChammas - das ist sehr interessant. Können Sie Szenarien teilen, wenn Sie solche Dinge tun?
AK
1
Bestimmt. Wir haben ein Fulfillment-System, das eine Warteschlange mit zu erfüllenden Artikeln enthält. Es gibt eine FulfillableTabelle mit allen Details zu jedem erfüllbaren Element und dann eine FulfillableQueueTabelle, die die Warteschlange in SQL Server implementiert . StateIDIn der Warteschlange dürfen sich nur Fulfillables mit einem bestimmten Status befinden. StateIDist in der FulfillableTabelle, aber ich repliziere es FulfillableQueueund erzwinge dann diese Einschränkung mit FOREIGN KEYund CHECKEinschränkungen.
Nick Chammas