Stwierdziłem, że DDD jest czymś naturalnym, jeśli pracuję nad aplikacją typu operacyjnego/transakcyjnego. Jednak zawsze mam do czynienia z rozsądnym sposobem obsługi funkcji raportowania.W jaki sposób Domain Driven Design obsługuje raportowanie?
Raportowanie, o którym mówię, nie wiąże się z generowaniem raportów, ale także z funkcjami, które wykonują stosunkowo skomplikowane zapytania. (np. podając podsumowanie wszystkich zamówień, które zrobił przedsiębiorca, lub wyświetlić podsumowanie konta dla kont handlowych mających określone akcje, itp.). Mogą to być po prostu pewne zapytania lub funkcje wspierające, które są używane razem z tymi funkcjami operacyjnymi.
Dla takich funkcji jest całkiem naturalne, jeśli możemy wykonać sprzężenie w SQL (lub innym języku zapytań), uzyskać kolumny, które nas interesują, i zwrócić masowo zestaw wyników. Wydaje się jednak, że nie ma się tak dobrze z DDD: potrzebujemy dodatkowego specjalnego repozytorium lub posiadania najbardziej powiązanego repozytorium zwracającego specjalny "obiekt/obiekt wartości" (który jest wyspecjalizowanym zbiorem wyników). Tego rodzaju specjalne "byty" nie mają w rzeczywistości żadnego znaczenia domeny.
Jeśli chcemy skorzystać ze znaczącej warstwy domenowej, może to prowadzić do wielu dodatkowych wyszukiwań z różnych repozytoriów, a także do wielu prac agregacyjnych w domenie lub warstwie usług, co z łatwością spowoduje pogarszanie się wydajności.
Pomyślałem również o posiadaniu kolejnej "ścieżki" dla tego rodzaju funkcji, która nie przechodzi przez "ścieżkę DDD", mając własny sposób pobierania danych z bazy danych, komponowania wyników do wyświetlenia. Jednak sprawi to, że aplikacja będzie niepotrzebnie skomplikowana, a co gorsza, zapewniamy dodatkową ścieżkę, aby programiści, którzy są bardziej przyzwyczajeni do tradycyjnego programowania zorientowanego na bazy danych, mogą korzystać z tej ścieżki nawet wtedy, gdy jest to niewłaściwe.
Uważam, że taka sytuacja jest dość powszechna (zwykle duży system nie zawiera funkcji operacyjnych, ale także raportowania i zapytania), chciałbym wiedzieć, jak ludzie sobie z tym radzą?
Szczerze mówiąc, trudno jest zdecydować, który z nich jest poprawny, ale używanie CQRS wydaje się być najbardziej rozsądne (i jest to najbardziej przekonująca odpowiedź, którą otrzymuję również z domaindrivendesign.org) –