Der Titel macht nicht allzu viel Sinn, aber ich könnte mir keinen besseren Titel für dieses Problem vorstellen.
Ich habe die folgenden Tabellen
Projekte
- Ich würde
- Name
Kunden
- Ich würde
- id_project
- Name
Zahlungen
- Ich würde
- id_customer
- Datum
- Summe
Wenn ein Benutzer das System betritt, hat er Zugriff auf ein bestimmtes Projekt. Jetzt möchte ich alle Zahlungen für dieses Projekt auflisten, und es sollte ziemlich einfach sein:
SELECT FROM payments where id_customer in (SELECT id from customers where id_project = 5)
Meine Frage ist: Wenn es nicht besser ist, der Zahlungstabelle auf diese Weise eine Spalte id_project hinzuzufügen, werden die Abfragen einfacher und schneller.
database-design
normalization
Gabriel Solomon
quelle
quelle
Antworten:
Sie scheinen zu fragen, ob eine Denormalisierung sinnvoll ist.
Die Antwort lautet immer "es kommt darauf an", also hier ist meine Faustregel:
Ob ...
dann normalisiert bleiben . Ja, Denormalisierung ist schneller, aber es bedeutet auch, dass Sie redundante Daten im System haben - Daten, die gepflegt und synchron gehalten werden müssen. Es gibt nicht mehr "eine Quelle" für diese Daten, sondern mehrere Quellen, die abweichen können. Dies ist mit der Zeit riskant, daher sollten Sie es nicht tun, es sei denn, Sie haben sehr gute Gründe, dies zu tun, die durch einige Benchmarks untermauert werden.
Ich würde nur denormalisieren, wenn ...
Joins sind auf moderner Hardware sehr schnell, aber niemals kostenlos.
quelle
Sie sollten die Abfrage folgendermaßen umschreiben:
Während dies weniger präzise erscheint und ein guter Abfrageplaner erkennt, was Sie versuchen, und Ihre korrelierte Unterabfrage stattdessen als obiger Join ausführt, führt ein schlechter Abfrageplan möglicherweise einen Index-Scan durch
payments.id_customer
(vorausgesetzt, Sie haben einen relevanten Index) ) (oder schlimmer noch, das Scannen von Tabellen), anstatt die Dinge auf effizientere Weise zu erledigen. Selbst ein guter Abfrageplaner kann die Optimierung möglicherweise nicht erkennen, wenn die Anordnung dieser Abfrage etwas komplizierter ist. Das Ausdrücken der Beziehung als Join und nicht als Unterabfrage kann mehr bewirken als das Ändern Ihrer Datenstruktur.Wie Jeff sagt, sollte jede Denormalisierung mit Vorsicht in Betracht gezogen werden - dies kann zu leichten Leistungssteigerungen führen, insbesondere für einige Berichtszwecke, kann jedoch zu Inkonsistenzen aufgrund von Fehlern in der unterstützenden Geschäftslogik führen.
Als Randnotiz: Natürlich kenne ich Ihr Geschäft nicht, daher könnte mir etwas fehlen, aber Ihre Tischbeziehungen scheinen mir seltsam. Sie implizieren, dass Sie nie mehr als ein Projekt mit demselben Kunden haben können, was meiner Erfahrung nach normalerweise nicht der Fall ist, zumindest nicht über einen längeren Zeitraum.
oder wenn es weniger normalisiert ist (obwohl ich bezweifle, dass dies notwendig wäre):
Das schließt natürlich die Möglichkeit eines gemeinsamen Projekts mit zwei Kunden aus ...
quelle
DROP VIEW
+CREATE VIEW
anstelle von verwendet wirdALTER VIEW
.In einigen Datenbanken haben Sie die Möglichkeit, "Materialisierte Ansichten" anstelle komplexer ANSICHTEN mit einer großen Datenmenge auf der Grundlage einer komplexen Abfrage zu erstellen. Dies kann verwendet werden, um eine Denormalisierung in einem historisch gewachsenen Anwendungssystem zu vermeiden. Materialisierte Ansichten "Sie müssen eine klare Vorstellung von den Aktualisierungsmethoden und der Menge des Speichers haben, der von der Materialisierten Ansicht verwendet wird ...
quelle