Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Planowanie zadan - struktura bazy
Forum PHP.pl > Forum > Bazy danych
Seth
Pisze system do planowania zadan.
Ma on miec mozliwosc planowania zadan na dany okres ale takze takich, ktore beda sie pojawiac cyklicznie.
Chodzi tez o to aby nie wypelniac bazy takimi zadaniami np do 10 lat w przod.

Czyli potrzebuje ogolnie sposobu zapisu zadania w takiej formie aby moc okreslic kiedy ma sie pojawic dane zadanie, wtedy takze kiedy wystepuje np. co miesiac.

Przyklad:
Planujemy wizyte u lekarza. Ma ona byc powiecmy co 3 miesiace.
W bazie wstawiam znacznik daty pierwszego spotkania i "jakos" podaje ze to zadanie bedzie wykonywane cyklicznie co 3 miesiace.
I teraz wchodzac w dany dzien (pytajac bazy danych przez SQLa) mam miec mozliwosc pobrania tego zadania bo np. jest to dzien w ktorym to zadanie ma sie pojawic bo minely 3 miesiace od ostatniej wizyty.


Ma ktos jakies pomysly jak to rozwiazac w bazie danych?
Koperfild
Jedyne co przychodzi mi na myśl, jest bardzo nieeleganckim rozwiązaniem, ale chyba inaczej sie nie da. Chodzi o to aby przy wywoływaniu zadań najpierw szukać zadań które są jednorazowe czyli:
$query = mysql_query('select * from zadania where cykliczosc=NULL');
a później wszystkie cykliczne i pobrane przesiewać jakąś funkcją.
Nie jest to na pewno dobrym rozwiązaniem, bo baza będzie bardzo obciążona, ale nie mam pojęcia jak to inaczej wykonać.
Seth
To jest akurat jasne dla mnie winksmiley.jpg

Problem jest jednak w tym, ze nie wiem jak za pomoca SQLa stworzyc zapytanie, ktore umozliwialo by pobranie zadan zaplanowanych w danym dniu.
Na podstawie takiego zapytania sam SQL dodawal by/mnozyl/odejmowal (?) aby sprawdzic czy dane pole, jezeli jest "powtarzalne" co jakis czas, bylo brane pod uwage podczas warunky podanej daty.

W gre wchodzi takze procedura skladowa (MySQL).

Tylko no wlasnie. Jaka? biggrin.gif
AxZx
ja wykonywanie zadan cyklicznych zrobilem w prosty sposob

zapisuje date w formacie YYYY-mm-dd
jezeli w polu YYYY sa 0000 to oznacza ze to zadanie ma byc wykonywane co roku
mm = 00 oznacza zadanie wykonywane co miesiac
dd = 00 zadanie wykonywane codziennie

codziennie uruchmiam (wlasciwie to cron robi) plik sprawdzajacy czy mm = 00 OR mm = day(now()) itd.
bardzo prosty spobo wiec nie wiem czy o to ci chodzilo. ale do zadan cyklicznych ten algorytm sprawdza sie dobrze:)
Seth
hmm hmm hmm smile.gif

To jest rozwiazanie. Szczerze mowiac nie pomyslalem o tym.
Jednak mam do tego zalozenia jeszcze jedno "ale" winksmiley.jpg

Problem jest taki, ze zadanie moze sie powtarzac np co tydzien, co 2 miesiace etc.
I tutaj juz wymiekam :/

Bo Twoje rozwiazanie sprawdzi sie napewno jezeli bym potrzebowal planowac co dany dzien, miesiac czy rok. Ale musze miec mozliwosc planowania np co tydzien od danego dnia :/

A nie moge niestety wpisywac kazdego zadania w cronie bo urosl by on do bardzo duzych rozmiarow.
Swoja droga moze wlasnie to jest rozwaizaniem... zrobienie wlasnego crona na bazie danych?
AxZx
w sumie racja, nie pomyslalem o tym:)

Cron w bazie to zly pomysl, zalozmy ze masz co 2 miesiace wysylac maila do userow.
zaczynasz wypelniac tabele 'cron' wpisami co 2 miesiace, i co? do kiedy to wypelniasz? powiedzmy 10 lat? a pozniej co. slabe rozwiazanie, wogole nie elastyczne.

moze dodaj kolumne interval, tam wpisuje np ilosc dni - co ile dni ma byc wykonywane zapytanie.
albo wpisuj tam gotowe czesci zapytania SQL a pozniej to tylko wklejaj w sprawdzaniu czy to ma sie wykonac dzisiaj.

np dla tygodni
DATE_ADD(NOW(), INTERVAL '2' WEEKS);

dla dni
DATE_ADD(NOW(), INTERVAL '2' DAYS);

i ta dwojke zapisuj w jednej kolumnie, a w drugiej zapisuj DAY, MONTH, WEEKS, YEAR

mysle ze daloby sie cos takiego wykombinowac - doprowadzic do stanu uzywalnosci:)
Seth
Przetestowalem kilka mozliwosci i udalo mi sie znalezc taka, ktora dziala bez problemu biggrin.gif
Mamy w bazie tabele T_DispatchSchedule, ktora ma min. pole:
- DispatchDate - ktore jest typu DATE (sama data bez czasu)
- Perpetula - true/false okreslajace czy dana data jest powtarzalna o zdany okres czasu
- DispatchInterval - unix timestamp okreslajacy interval czasowy. Dopuszaclny to X dni, X miesiecy, X lat (oraz laczone).

Do wyznaczania intervalu mam prosta metode:
  1. <?php
  2. public function getInterval($day, $month = 0, $year = 0) {
  3. $interval = $day * 24 * 60 * 60;
  4.  
  5. if ($month > 0) {
  6. $interval *= $month;
  7.  
  8. if ($year > 0) {
  9. $interval *= $year;
  10. }
  11. }
  12.  
  13. return $interval;
  14. }
  15. ?>



Natomiast najwazniejsza rzecz jest skrypt ktory odpala nastepujacego SQLa:

  1. SELECT *
  2. WHERE UNIX_TIMESTAMP(DispatchDate) = UNIX_TIMESTAMP(DATE(NOW())) OR (
  3. Perpetual = 1 AND (UNIX_TIMESTAMP(DATE(NOW())) - UNIX_TIMESTAMP(DispatchDate)) > 0 AND (UNIX_TIMESTAMP(DATE(NOW())) - UNIX_TIMESTAMP(DispatchDate)) MOD DispatchInterval = 0
  4. )


Pobiera on wszystkie zaplanowane czynnosci na dzisiejszy dzien i na dzien kory powtarza sie.

Have fun biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.