Zunächst möchte ich sagen, dass dies eine vernachlässigte Frage / ein vernachlässigter Bereich zu sein scheint. Wenn diese Frage also verbessert werden muss, hilf mir, diese Frage zu einer großartigen Frage zu machen, von der andere profitieren können! Ich suche Rat und Hilfe von Leuten, die Lösungen implementiert haben, die dieses Problem lösen, und nicht nur Ideen zum Ausprobieren.
Nach meiner Erfahrung gibt es zwei Seiten einer Anwendung - die "Task" -Seite, die größtenteils domänengesteuert ist und auf der die Benutzer intensiv mit dem Domänenmodell (der "Engine" der Anwendung) interagieren, und die Berichterstellungsseite, auf der die Benutzer Erhalten Sie Daten basierend darauf, was auf der Aufgabenseite passiert.
Auf der Aufgabenseite ist klar, dass eine Anwendung mit einem umfangreichen Domänenmodell über Geschäftslogik im Domänenmodell verfügen und die Datenbank hauptsächlich aus Gründen der Persistenz verwendet werden sollte. Trennung von Bedenken, jedes Buch ist darüber geschrieben, wir wissen, was zu tun ist, genial.
Was ist mit der Berichtsseite? Sind Data Warehouses akzeptabel oder haben sie ein schlechtes Design, weil sie Geschäftslogik in die Datenbank und in die Daten selbst integrieren? Um die Daten aus der Datenbank in Data Warehouse-Daten zu aggregieren, müssen Sie Geschäftslogik und Regeln auf die Daten angewendet haben. Diese Logik und Regeln stammen nicht aus Ihrem Domänenmodell, sondern aus Ihren Datenaggregationsprozessen. Ist das falsch?
Ich arbeite an großen Finanz- und Projektmanagementanwendungen, bei denen die Geschäftslogik umfangreich ist. Wenn ich über diese Daten berichte, habe ich oft eine Menge Aggregationen zu erledigen, um die für den Bericht / das Dashboard erforderlichen Informationen abzurufen, und die Aggregationen enthalten eine Menge Geschäftslogik. Aus Gründen der Leistung habe ich es mit stark aggregierten Tabellen und gespeicherten Prozeduren gemacht.
Angenommen, Sie benötigen einen Bericht / ein Dashboard, um eine Liste der aktiven Projekte anzuzeigen (stellen Sie sich 10.000 Projekte vor). Jedes Projekt benötigt eine Reihe von Metriken, die damit angezeigt werden, zum Beispiel:
- Gesamtbudget; Gesamtetat
- Aufwand bis heute
- Verbrennungsrate
- Budget Erschöpfungstermin bei aktueller Brennrate
- usw.
Jedes davon beinhaltet eine Menge Geschäftslogik. Und ich spreche nicht nur von der Multiplikation von Zahlen oder einer einfachen Logik. Ich spreche davon, um das Budget zu erhalten, müssen Sie ein Tarifblatt mit 500 verschiedenen Tarifen anwenden, einen für die Zeit jedes Mitarbeiters (bei einigen Projekten haben die anderen einen Multiplikator), Ausgaben und einen angemessenen Aufschlag usw. Logik ist umfangreich. Das Aggregieren und Optimieren von Abfragen erforderte eine Menge Zeit, um diese Daten für den Client in angemessener Zeit zu erhalten.
Sollte dies zuerst über die Domain ausgeführt werden? Was ist mit der Leistung? Selbst bei reinen SQL-Abfragen erhalte ich diese Daten kaum schnell genug, damit der Client sie in angemessener Zeit anzeigt. Ich kann mir nicht vorstellen, diese Daten schnell genug an den Client zu senden, wenn ich all diese Domänenobjekte rehydriere und ihre Daten in der Anwendungsebene mische und abgleiche und aggregiere oder versuche, die Daten in der Anwendung zu aggregieren.
In diesen Fällen scheint SQL gut darin zu sein, Daten zu verarbeiten, und warum nicht? Dann haben Sie jedoch Geschäftslogik außerhalb Ihres Domain-Modells. Jede Änderung an der Geschäftslogik muss in Ihrem Domänenmodell und Ihren Berichtsaggregationsschemata geändert werden.
Ich bin wirklich ratlos, wie der Berichterstellungs- / Dashboard-Teil einer Anwendung in Bezug auf domänenbasiertes Design und bewährte Methoden gestaltet werden soll.
Ich habe das MVC-Tag hinzugefügt, weil MVC das Design-Flavor du Jour ist und ich es in meinem aktuellen Design verwende, kann aber nicht herausfinden, wie die Berichtsdaten in diese Art von Anwendung passen.
Ich suche Hilfe in diesem Bereich - Bücher, Designmuster, Schlüsselwörter zu Google, Artikel, alles. Ich kann zu diesem Thema keine Informationen finden.
EDIT UND EIN ANDERES BEISPIEL
Ein weiteres perfektes Beispiel, dem ich heute begegnet bin. Der Kunde möchte einen Bericht für das Customer Sales Team. Sie wollen eine einfache Metrik:
Wie hoch ist der aktuelle Jahresumsatz jedes Vertriebsmitarbeiters?
Das ist aber kompliziert. Jeder Verkäufer nahm an mehreren Verkaufschancen teil. Einige haben sie gewonnen, andere nicht. In jeder Verkaufschance gibt es mehrere Vertriebsmitarbeiter, denen je nach Rolle und Teilnahme ein Prozentsatz der Gutschrift für den Verkauf zugewiesen wird. Stellen Sie sich nun vor, Sie gehen die Domain durch ... die Menge an Objekt-Rehydration, die Sie durchführen müssten, um diese Daten für jeden Vertriebsmitarbeiter aus der Datenbank abzurufen:
Holen Sie sich alle
SalesPeople
->
Für jeden erhalten Sie ihreSalesOpportunities
->
Für jeden erhalten Sie ihren Prozentsatz des Verkaufs und berechnen Sie ihre Verkaufsmenge
dann Addieren Sie alle ihreSalesOpportunity
Verkaufsmenge.
Und das ist EINE Metrik. Sie können auch eine SQL-Abfrage schreiben, die schnell und effizient ausgeführt und auf Schnelligkeit eingestellt werden kann.
EDIT 2 - CQRS-Muster
Ich habe über das CQRS-Muster gelesen, und obwohl es faszinierend ist, sagt sogar Martin Fowler, dass es nicht getestet wurde. Wie wurde dieses Problem in der Vergangenheit gelöst? Dies muss irgendwann von jedem erlebt worden sein. Was ist ein etablierter oder abgenutzter Ansatz mit Erfolgsbilanz?
Bearbeiten 3 - Berichtssysteme / Tools
In diesem Zusammenhang sind auch Berichterstellungstools zu berücksichtigen. Reporting Services / Crystal Reports, Analysis Services und Cognoscenti usw. erwarten alle Daten von SQL / Datenbank. Ich bezweifle, dass Ihre Daten später in Ihrem Unternehmen eingehen. Und doch sind sie und andere wie sie ein wesentlicher Bestandteil der Berichterstattung in vielen großen Systemen. Wie werden die Daten für diese Systeme richtig gehandhabt, wenn in der Datenquelle für diese Systeme und möglicherweise in den Berichten selbst sogar Geschäftslogik vorhanden ist?