Dla mnie to całkowity bezsens
To że zakończone aukcje to te które się skończyły to chyba logiczne (jest po czasie zakończenia) - dla mnie sprawdzanie w dwóch miejscach czy Zakonczone = 1
jest identyczne z Data_zakonczenia < teraz
i nie wprowadza tu nigdzie logiki do dwóch miejsc
Czyli całkowitym bezsensem jest coś, co sobie dopowiedziałeś do mojego postu? Nigdzie nie pisałem o "zakończone = 1". Pisałem o aukcji z biznesowego punktu widzenia, nie szczegółów przechowywania danych w bazie.
Aukcja jest zależną od czasu maszyną stanów, która może mieć ich wiele - nie tylko trwająca
i zakończona
. Zakańczanie aukcji w zależności od jej rodzaju (i od tego, czy ktoś w niej brał udział) niesie ze sobą różne następstwa: wyznaczenie zwycięzcy, wysłanie informacji, wystawienie faktur, odblokowanie systemu komentarzy, itd.
- W zależności od popularności serwisu będzie trzeba update'ować setki rekordów każdej sekundy - nie jest to może duży narzut pracy ale całkowicie zbędny;
W zależności od popularności serwisu trzeba będzie robić wiele rzeczy każdej sekundy.
w połączeniu z triggerami które mogą się później pojawić na bazie (na przykład w ramach szybkiego rozwiązania czegoś) może zamulić bazę danych
A może jej też nie zamulić. A może też lepiej nie używać triggerów.
- Jeżeli job będzie sprawdzał zamknięcie aukcji co 15 minut to w ciągu tych 15 minut wszystkie wygenerowane raporty będą przekłamane - nie będą brały pod uwagę wszystkich zakończonych już aukcji
Nie pisałem nic o generowaniu raportów co 15 minut, pisałem o odczycie zestawu aukcji co 15 minut. Od tej pory wszystkie aukcje znajdujące się w pamięci mogą być z niezłą wydajnością ustawiane jako zakończane w czasie rzeczywistym. Na raporty online ma to efekt natychmiastowy, tak samo jak na system powiadomień, fakturujący, itd., itp.
- Przypuśćmy że mamy awarię w serwisie i chcemy przedłużyć aukcje kończące się w czasie gdy serwis był niedostępny (tak jak to robi allegro) - w tym przypadku oprócz przedłużenia czasu końca aukcji, musimy pamiętać o tym żeby aukcję "otworzyć" - czyli logikę otwierania / zamykania aukcji niepotrzebnie komplikujemy i logika dotycząca tego musi być w kilku różnych miejscach
Nie trzeba niczego otwierać, bo nic nie zostało zamknięte, a i logika jest w jednym miejscu - warstwie dostępu do danych o aukcjach.
Czas zakończenia jednoznacznie definiuje czy aukcja jest zakończona - kopiowanie tej informacji do innej kolumny to zwyczajna redundancja danych
Nie zapomnij tylko, że powodów zakończenia aukcji może być wiele.
no ale przecież to Ty sugerujesz stworzenie dwóch miejsc decydujących o tym
Wystarczy data zakończenia, a Ty chcesz żeby to zależało jednocześnie od dwóch kolumn które bardzo łatwo mogą utracić ze sobą spójność
Kolumny w bazie to miejsca składowania danych, a nie miejsce decyzyjne. Za to oddzielne decydowanie o stanie aukcji w każdej aplikacji klienckiej korzystającej z systemu aukcyjnego JEST powielaniem logiki.
Utracenie spójności w takim przypadku jest możliwe chyba tylko u ludzi, którzy nie słyszeli o transakcjach.
Nie mówię, że moje rozwiązanie jest idealne. Odnosiłem się jedynie do pomysłu zakończenia aukcji przez wejście na stronę - co jest mieszaniem logiki prezentacji z biznesem i na pewno jest błędne.