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?
database-design
Richard
quelle
quelle
Antworten:
Denormalisieren, wenn es sich um OLAP-Vorgänge handelt, Normalisieren, wenn OLTP (aus dem verknüpften Artikel im Abschnitt Denormalisierung)
quelle
Normalisieren, bis es weh tut, Denormalisieren, bis es funktioniert (dh: Leistung wird akzeptabel) :)
quelle
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.
quelle
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.
quelle
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 .
quelle
Fulfillable
Tabelle mit allen Details zu jedem erfüllbaren Element und dann eineFulfillableQueue
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 derFulfillable
Tabelle, aber ich repliziere esFulfillableQueue
und erzwinge dann diese Einschränkung mitFOREIGN KEY
undCHECK
Einschränkungen.