Temat: CQRS czyli co....
Czy to jest pytanie "podchwytliwe" ? Baza najczęściej udostępnia jeden interfejs (metodę) komunikacji - zapytania.
Hm ... jeśli zapytanie jest w requeście do serwisu to wtedy to się nazywa SQL injection, więc strzelam, że view odpytuje bezpośrednio bazę. To potencjalne ryzykowne, ale kto by się tym przejmował. Co dalej :) ?
Wiadomo, że baza udostępnia jeden interface :) bardziej mi chodziło o interfejs, który nasz system wystawia widokowi. SQLa bym nie przekazywał, bo wiąże bezpośrednio widok z bazą, a to zawsze jest złe. Ale za to cienki interfejs
*
pomiędzy widokiem i bazą (całkowite obejście serwisów), posługujący się obiektami DTO, jest moim zdaniem idealny. To właśnie sugeruje CQRS (przynajmniej jak to tak rozumiem).
Temat "dodatkowej" bazy danych, akurat w "tym CQRS" (bo chyba mówimy o tym samym) jest traktowany dość ignorancko. CQRS zakłada, że każda aktualizacja "dodatkowej bazy danych" powiedzie się . Oczywiście to może działać, ale na krótką metę. Na systemach które działają 24/7 i to pod dużym obciążeniem (w te celuje CQRS jak rozumiem) w pewnym momencie jakiś update się nie powiedzie (choćby z powodu starego dobrego zakleszczenia). Co CQRS proponuje robić w takiej sytuacji ? Potencjalna 'desynchronizacja' może być bardzo poważnym problemem.
Wracając do serwisów: w tym przypadku CQRS robi takie małe założenie, że w SQL można wygenerować dane, których potrzebuje View. W ogólnym przypadku (dowolny widok + SQL bez rozszerzeń) nie da się tego zrobić. SQL (bez rozszerzeń) nie jest 'normalnym' językiem programowania.
Tworzenie odrębnej, zdenormalizowanej i potencjalnie zdesynchronizowanej bazy danych w której znajdują się (potencjalnie) procedury generujące dane dla view(!), w celu ograniczenia transferu danych z serwisu do klienta chyba nie jest dobrym pomysłem.
Nie wiem jak inni, ale ja spróbowałbym raczej np. kompresji danych wymienianych pomiędzy klientem i serwerem ...
Architektura nie powstaje po to, "żeby system działał szybko"; od tego są algorytmy i hardware.
Architektura jest po to, żeby programista mógł szybko stworzyć łatwy w analizie i odporny na bugi kod.
co więcej te twoje rozwiązanie też "domaga się" segregacji interfejsów.
Wszystko można segregować na dowolny sposób.
CQRS segreguje interfejsy na ciężkie, dla agregatów
*
ciężkie i jednocześnie cienkie ? ;)
i lekkie dla zapytań.
Co to jest ciężki / lekki interface ?
Jeśli robimy lekki interface dla zapytań tak jak opisałem powyżej, to jest to bardzo naturalna segregacja.
IT nie jest ani specjalnie ciężkie, ani lekkie, ani naturalne.
Dlaczego w ogóle używasz takich pojęć w odniesieniu do technologii ?
To może jeszcze napiszesz, że VB is totaly gay!!! ;)
Jeśli wrzucimy w jeden interface metody zwracające/zapisujące agregaty razem z metodami zwracającymi DTO, to interfejs nam spuchnie i zrobi się w nim burdel. Jego implementacja stanie się trochę takim http://en.wikipedia.org/wiki/God_object
Twórca tego pojęcia albo myli klasę z obiektem, albo klasę z demonem...
Jeśli nie zgadzasz się z czymś co tutaj powiedziałem, czy masz lepszy pomysł to proszę o poprawkę.
W sumie mam - programy 'biznesowe' powinny koncentrować się na funkcjonalności, a nie wydajności.
Wydajnością powinni się zająć ludzie, dla których 'wydajność' jest celem 'biznesowym'.