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?
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?
Antworten:
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.
Normalisieren, bis es weh tut, Denormalisieren, bis es funktioniert (dh: Leistung wird akzeptabel) :)
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.
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.
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 .
Fulfillable
Tabelle mit allen Details zu jedem erfüllbaren Element und dann eine FulfillableQueue
Tabelle, die die Warteschlange in SQL Server implementiert . StateID
In der Warteschlange dürfen sich nur Fulfillables mit einem bestimmten Status befinden. StateID
ist in der Fulfillable
Tabelle, aber ich repliziere es FulfillableQueue
und erzwinge dann diese Einschränkung mit FOREIGN KEY
und CHECK
Einschränkungen.