Frage

Oft beschäftige ich mich mit Aggregat- oder übergeordneten Unternehmen, die Attribute aus ihren Mitgliedsmitgliedern oder ihren Kindern abgeleitet haben. Zum Beispiel:

  • Das byte_count und packet_count von a TcpConnection Objekt wird aus denselben Attributen seiner beiden Bestandteile berechnet TcpStream Objekte, die wiederum aus ihrem Bestandteil berechnet werden TcpPacket Objekte.

  • Ein Invoices Objekt könnte a haben total Welches ist im Grunde die Summe () seines Bestandteils InvoiceLineItems'Preise, mit ein wenig Fracht, Rabatt und Steuerlogik, die hereingeworfen werden.

Wenn Sie mit Millionen von Paketen oder Millionen von in Rechnung gestellten Werbebuchungen (ich wünsche!), Ist die On-Demand-Berechnung dieser abgeleiteten Attribute-entweder in einer Ansicht oder häufiger in Präsentationslogik wie Berichte oder Web-Schnittstellen-oft unannehmbar langsam.

Wie entscheiden Sie, bevor die Leistung betrifft, ob Sie Ihre Hand erzwingen, ob Sie abgeleitete Attribute für vorkundigte Felder "fördern"?

War es hilfreich?

Lösung

Ich persönlich würde erst dann denmormalisieren, bis die Leistungsverkäufe meine Hand erzwingen (weil der Nachteil der Denormalisierungen zu drastisch ist), aber Sie könnten auch in Betracht ziehen:

  1. Bequemlichkeit: z. B. wenn zwei verschiedene Client -Apps dieselben abgeleiteten Attribute berechnen möchten, müssen beide die Abfragen codieren, um sie zu berechnen. Die Denormalisierung bietet beide Client -Apps das abgeleitete Attribut einfacher.
  2. Stabilität im Laufe der Zeit: z. B. wenn die Formel zur Berechnung eines abgeleiteten Attributs veränderlich ist, ermöglicht die Denormalisierung den abgeleiteten Wert zu einem Zeitpunkt, damit zukünftige Berechnungen niemals falsch verstanden werden
  3. Einfachere Abfragen: Das Hinzufügen von Komplexität zur DB -Struktur kann bedeuten, dass Ihre Auswahlabfrage am Clientend einfacher ist.
  4. Leistung: Wählen Sie Abfragen zu denormalisierten Daten aus, die schneller sein können.

Ref: Der Datenbankprogrammierer: das Argument für die Denormalisierung. Lesen Sie auch seinen Artikel über Denormalisierte Werte korrigieren - Seine Empfehlung ist, Trigger zu verwenden. Das bringt die Art der Kompromiss-Denormalisierung nach Hause.

Andere Tipps

Grundsätzlich nicht. Sie haben die Leistungsbedenken verlassen, um Ihre Hand zu erzwingen.

Das ist die beste Antwort, weil Sie 99% der Fälle sollten nicht Seien Sie so optimiert, so ist es besser, es einfach im laufenden Fliegen zu berechnen.

Es ist jedoch weit verbreitet, dass Client-Application-Entwickler mit falschen Vorurteilen wie "wie" wie "wie" wie "wie" wie "wie" wie "wie" wie "wie" wie "wie" wie möglich), teilnehmen. "On-Demand-Berechnung von ... abgeleiteten Attributen ...-ist häufig Inakzeptabel langsam", und das ist einfach nicht wahr. Der richtige Wortlaut hier wäre"ist selten Inakzeptabel langsam".

Wenn Sie daher ein Experte (DB -Entwicklungsarchitekt usw.) sind, sollten Sie sich nicht auf eine vorzeitige Optimierung einlassen. Warten Sie, bis es ist offensichtlich das muss repariert werden, dann Schauen Sie sich die Voraggregation an.

Wie aktuell die Daten sein müssen, muss feststellen, wie Sie sie implementieren.

Ich werde 2 einfache Zustände annehmen: aktuell oder nicht aktuell.

  • Strom: Indexierte Ansichten, Auslöser, gespeicherte Procs zur Aufrechterhaltung von Gesamttabellen usw.
  • Nicht aktuell: Berichterstellungsservice -Schnappschüsse, Protokollversand/Replikation, Data Warehouse usw.

Trotzdem würde ich mich gegen die gleiche Datenmenge entwickeln wie in Prod, also habe ich ein gewisses Vertrauen in die Reaktionszeit. Sie sollten selten von Ihrer Code -Leistung überrascht sein ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top