Jak zrobić tydzień na dodawanie wpisów ?

0

Musze zrobić głosowanie powiedzmy że glosuje się od Czwartku od godziny 12:00 do kolejnego czwartku do godziny 11:59 i w tym czasie liczą się glosy na tydzień nr 1. potem jak minie ta godzina to powinno się w bazie zaktualizować że teraz jest aktywny tydzień nr 2 i wszystkie glosy idą na nowy tydzień nr 2. To jak to zrobić żeby sprawdzać czy zakończył się już tydzień i ustawić aktywację na nowy tydzień ?

Tabelka
aktywne tygodnie

ID Nazwa status
1 Tydzień 1 1

i teraz jak minie czwartek godzina 11:59 na 12:00 tożzeby dodać wpis

ID Nazwa status
1 Tydzień 1 0
2 Tydzień 2 1
1

Najprościej cronem.

0

Zupełnie nie potrzeba do tego zaprzęgać cyklicznie uruchomionego skryptu. Pamiętaj, że możesz po prostu pobrać w swojej aplikacji datę i na jej podstawie wybrać wiersz w bazie, który chcesz aktualizować. Albo po prostu dodać głosy jak leci i analizować datę ich dodania przy wyświetlaniu.

0

W pierwszej opcji musze uzyc crona jednak ale raz w tygodniu wiec nie jest źle. Nie mialem wpisu w bazie a cron ma taki wpis dodawac z kolejnym tygodniem. Co do głosów to nie chcę żeby się przeliczało za każdym razem.

0
masterO napisał(a):

Musze zrobić głosowanie

Może gdybyś opisał bardziej szczegółowo cały mechanizm aplikacji, udało by się znaleźć inne rozwiązanie niekoniecznie wymagające takiego algorytmu działania który opisałeś.

0

bardziej zbliżone do rzeczywistości będzie tworzenie nowego wpisu co tydzień a później dokładanie głosów do najnowszego

gdyby zrealizować taką ankietę w rzeczywistości to raz na tydzień ktoś by musiał zmienić pojemnik na głosy

w drugim rozwiązaniu jedyny plus to taki że nie trzeba tworzyć zadania, ale rozwiązanie jest bardziej skomplikowane i komplikuje aplikacje niemal w każdym momencie
przy dodawaniu głosu trzeba sprawdzić najpierw czy wpis istnieje, potem go użyć lub założyć nowy
przy wyświetlaniu też trzeba znaleźć najnowszy wpis i zrobić obsługę gdy go nie ma
przy każdym korzystaniu z tych danych (dodawanie / modyfikowanie / usuwanie / tworzenie statystyk) będzie trzeba ponowić logikę odpowiedzialną za obsługę wpisów - w przypadku jeśli ta logika miałaby się nagle zmienić to trzeba program poprawiać w kilku miejscach

najlepszym rozwiązaniem wydaje się dodawanie głosów jak leci i tylko ich obsługa przy tworzeniu statystyk, ale to też ma swoje minusy - na przykład jeżeli w pewnym momencie stwierdzimy że nie chcemy zmieniać kontenerka co tydzień tylko co 2 dni, albo co miesiąc byśmy chcieli szybkie głosowanie jednodniowe to takie zmiany będą bardzo trudne i będzie to miało wpływ na wszystkie głosowania jakie się do tej pory odbyły lub znacznie skomplikuje się logika wyświetlania

w tym przypadku najprostsze rozwiązanie jest zarazem najbardziej elastyczne

w rozwiązaniu z tworzeniem wpisu w locie trzeba jeszcze brać pod uwagę wielowątkowość - jeżeli za dodawanie nowych "kontenerków" z punktu widzenia programu będzie odpowiedzialna osoba która teraz głosuje to w przypadku dwóch głosujących w jednym momencie dojdzie do konfliktu - w praktyce może dojść do dodania kontenerka po tym jak inny głosujący właśnie sprawdził że go nie ma - w rezultacie trzeba całą operację przeprowadzić w transakcji blokując tymczasowo dostęp do kontenerka

0

@uuuf, a co w przypadku, gdy ktoś zagłosuje przed odpaleniem cron-a, albo odda głos w tym samym momencie co zostanie odpalony cron? Też będzie konflikt.

Nie ma co kombinować i używać do tego cron-a. Możesz zrobić w ten sposób:

  1. W tabeli z tygodniami masz kolumny z nazwą, flagą czy jest aktywny oraz datą do kiedy jest on aktywny np: 2015-03-26 1159.
    1.1 Kolumna z datą powinna mieć indeks UNIQUE, tak aby nie można było dodać dwóch identycznych wpisów.
  2. Podczas głosowania pobierasz aktywny tydzień na podstawie flagi oraz obecnej daty.
    2.1 Jeśli zostanie zwrócony pusty wynik obliczasz kiedy zakończy się obecny okres głosowania, czyli np.: 2015-04-02 1159.
    2.2 Dodajesz nowy wpis, pobierasz nowe id, a dla pozostałych ustawiasz flagę na 0.
    2.3 W przypadku konfliktu baza danych wyrzuci wyjątek, o próbie dodania wpisu z istniejącą już datą, wystarczy to obsłużyć i problem konfliktu rozwiązany.
0
freemp3 napisał(a):

@uuuf, a co w przypadku, gdy ktoś zagłosuje przed odpaleniem cron-a, albo odda głos w tym samym momencie co zostanie odpalony cron?

w takim przypadku tak jak w prawdziwym życiu odda głos do poprzedniego kontenerka

1 użytkowników online, w tym zalogowanych: 0, gości: 1