Temat: [Doctrine2] widoki
Adam Brodziak:
Wojciech Soczyński:
(...)
Nie wspominałem w żadnym miejscu tutaj o logice w zapytaniach SQL, chyba, że mi coś umknęło ? Ja tylko mówię, tyle, że nie zawsze jest sens operować na encjach i zaprzęgać Doctrine do niektórych zadań, których przykładem jest np. raportowanie - jeżeli mamy wyliczyć prosty raport z powiedzmy miliona encji, sprowadzi się to do pobrania tych miliona encji i powiedzmy wykonaniu jakiejś operacji typu Map-Reduce na nich. Jednakże jeżeli wyliczenie tego w bazie danych będzie efektywniejsze to czemu nie ? Warunkiem jest tylko to by cała operacja wyliczania takiego raportu była ukryta np. w klasie jakiegoś Service, a nie byśmy żonglowali SQL-em po całej aplikacji.
Zgadza się, jednak w tym Service będzie jakiś SQL generujący raport. To znaczy że logika raportowania też jest w SQL, co trudno testować.
Druga rzecz to co jest produktem takiego raportu? Czy są to modele stworzone specjalnie dla danego raportu (co można by łatwo zaimplementować widokami)? Co z sytuacją gdy częścią raportu jest dany model (dajmy na to pracownik) i zagregowana wartość (wartość zamówień na miesiąć).
Taka jest prawda, że to wszystko zależy od konkretnego przypadku, ciężko jest generalizować, trzeba wziąć konkretny case, a i jeszcze się okaże, że w konkretnym przypadku ale w różnych kontekstach użycia jest inaczej... :P.
Tak czy inaczej, cokolwiek ma do czynienia z jakimś I/O będzie ciężko testowalne, oczywiście można stworzyć mock, ale wtedy przetestujemy tylko klasę Service'u. Można też, zrobić z naszego raportu widok, lub procedurę, ale wtedy wracamy do starego sposobu pisania aplikacji. Są dwa "czyste" wyjścia z tej sytuacji:
1. pobieramy tylko dane potrzebne do raportu, wyliczamy go w klasie Service'u
2. raport wyliczamy tworząc job w jakimś środowisku Map-Reduce albo przy pomocy bazy NoSQL, z założeniem takim, że mamy narzędzia, dzięki, którym będziemy w stanie przetestować funkcję wyliczającą raport
To, które wyjście wybierzemy oczywiście zależy od wielu czynników, ale najważniejszym będzie to, jak bardzo chcemy by nasza aplikacja była zależna od jakiś zewnętrznych systemów. Jeżeli ma być niezależna to opcja nr.1 a jeżeli zależna to można się zdecydować na opcję nr.2 albo "Old School SQL"
Wojciech Soczyński edytował(a) ten post dnia 23.11.11 o godzinie 14:11