Po pierwsze, chcę powiedzieć, że wydaje się to zaniedbanym pytaniem / obszarem, więc jeśli to pytanie wymaga poprawy, pomóż mi uczynić z tego świetne pytanie, które może przynieść korzyści innym! Szukam porady i pomocy od osób, które wdrożyły rozwiązania rozwiązujące ten problem, a nie tylko pomysłów do wypróbowania.
Z mojego doświadczenia wynika, że istnieją dwie strony aplikacji - strona „zadaniowa”, która w dużej mierze opiera się na domenie i gdzie użytkownicy intensywnie współdziałają z modelem domeny („silnikiem” aplikacji) i stroną raportującą, gdzie użytkownicy uzyskać dane na podstawie tego, co dzieje się po stronie zadania.
Po stronie zadania jasne jest, że aplikacja z bogatym modelem domeny powinna mieć logikę biznesową w modelu domeny, a baza danych powinna być używana głównie do utrwalania. Rozdzielając obawy, każda książka jest o tym napisana, wiemy, co robić, super.
Co ze stroną zgłaszającą? Czy hurtownie danych są akceptowalne, czy też mają zły projekt, ponieważ zawierają logikę biznesową w bazie danych i samych danych? Aby agregować dane z bazy danych do danych hurtowni danych, musisz zastosować logikę biznesową i reguły do danych, a ta logika i reguły nie pochodziły z twojego modelu domeny, ale z procesów agregacji danych. Czy to źle?
Pracuję nad dużymi aplikacjami do zarządzania finansami i projektami, w których logika biznesowa jest rozległa. Podczas raportowania tych danych często będę musiał wykonać DUŻO agregacji, aby pobrać informacje wymagane dla raportu / pulpitu nawigacyjnego, a agregacje zawierają wiele logiki biznesowej. Ze względu na wydajność robiłem to z wysoce zagregowanymi tabelami i procedurami składowanymi.
Jako przykład załóżmy, że potrzebny jest raport / pulpit nawigacyjny, aby wyświetlić listę aktywnych projektów (wyobraź sobie 10 000 projektów). Każdy projekt będzie wymagał pokazania zestawu wskaźników, na przykład:
- cały budżet
- wysiłek do tej pory
- szybkość spalania
- data wyczerpania budżetu przy bieżącym tempie spalania
- itp.
Każda z nich wiąże się z dużą logiką biznesową. Nie mówię tylko o pomnożeniu liczb lub o prostej logice. Mówię o tym, aby uzyskać budżet, musisz zastosować arkusz stawek z 500 różnymi stawkami, po jednym na czas każdego pracownika (w niektórych projektach inne mają mnożnik), stosując wydatki i wszelkie odpowiednie znaczniki itp. logika jest rozległa. Uzyskanie tych danych w rozsądnym czasie dla klienta wymagało dużo agregacji i dostrajania zapytań.
Czy należy to najpierw przeprowadzić przez domenę? Co z wydajnością? Nawet w przypadku prostych zapytań SQL ledwo dostaję te dane wystarczająco szybko, aby klient mógł je wyświetlić w rozsądnym czasie. Nie wyobrażam sobie, aby próbować dostarczyć te dane do klienta wystarczająco szybko, jeśli nawadniam wszystkie te obiekty domeny oraz mieszam, dopasowuję i agreguję ich dane w warstwie aplikacji lub próbuję agregować dane w aplikacji.
Wydaje się, że w tych przypadkach SQL jest dobry w przetwarzaniu danych i dlaczego go nie użyć? Ale wtedy masz logikę biznesową poza modelem domeny. Wszelkie zmiany w logice biznesowej będą musiały zostać zmienione w modelu domeny i schematach agregacji raportów.
Naprawdę nie wiem, jak zaprojektować część raportowania / pulpit nawigacyjny dowolnej aplikacji w odniesieniu do projektowania opartego na domenie i dobrych praktyk.
Dodałem tag MVC, ponieważ MVC jest stylem projektowania i używam go w moim obecnym projekcie, ale nie mogę zrozumieć, w jaki sposób dane raportowania pasują do tego typu aplikacji.
Szukam jakiejkolwiek pomocy w tej dziedzinie - książek, wzorów, słów kluczowych w Google, artykułów, czegokolwiek. Nie mogę znaleźć żadnych informacji na ten temat.
EDYCJA I INNY PRZYKŁAD
Kolejny idealny przykład, z którym się dzisiaj spotkałem. Klient chce raportu dla zespołu sprzedaży klienta. Chcą czegoś, co wydaje się prostą miarą:
Jaka jest do tej pory roczna sprzedaż dla każdego sprzedawcy?
Ale to skomplikowane. Każdy sprzedawca uczestniczył w wielu okazjach sprzedażowych. Niektórzy wygrali, inni nie. W każdej okazji sprzedaży jest wielu sprzedawców, którym przydzielono procent kredytu na sprzedaż według ich roli i udziału. Wyobraźmy sobie teraz, że przechodzimy przez domenę w celu ... nawodnienia obiektu, które musielibyście zrobić, aby pobrać te dane z bazy danych dla każdego sprzedawcy:
Zbierz wszystkie
SalesPeople
->
Dla każdego otrzymaj ichSalesOpportunities
->
Dla każdego uzyskaj procent sprzedaży i oblicz ich kwotę sprzedaży,
a następnie dodaj wszystkieSalesOpportunity
kwoty sprzedaży.
I to JEDNA metryka. Możesz też napisać zapytanie SQL, które może to zrobić szybko i sprawnie i dostroić je tak, aby było szybkie.
EDYCJA 2 - Wzór CQRS
Czytałem o Wzorcu CQRS i chociaż intrygujący, nawet Martin Fowler twierdzi, że nie został przetestowany. Jak więc ten problem został rozwiązany w przeszłości? W pewnym momencie musieli się z tym zmierzyć wszyscy. Jakie jest ugruntowane lub dobrze stosowane podejście z udokumentowanymi sukcesami?
Edycja 3 - Systemy raportowania / narzędzia
Inną rzeczą do rozważenia w tym kontekście są narzędzia do raportowania. Usługi Reporting Services / Crystal Reports, Analysis Services i Cognoscenti itp. Oczekują danych z SQL / bazy danych. Wątpię, aby Twoje dane później trafiły do Twojej firmy. A jednak oni i inni tacy jak oni są istotną częścią raportowania w wielu dużych systemach. W jaki sposób dane są odpowiednio przetwarzane, gdy istnieje źródło logiki biznesowej w źródle danych dla tych systemów, a także ewentualnie w samych raportach?