Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Planowanie zadan - struktura bazy
Seth
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Koperfild
post
Post #2





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 4.08.2005

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
Seth
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


To jest akurat jasne dla mnie (IMG:http://forum.php.pl/style_emoticons/default/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? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
AxZx
post
Post #4





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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:)
Go to the top of the page
+Quote Post
Seth
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


hmm hmm hmm (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

To jest rozwiazanie. Szczerze mowiac nie pomyslalem o tym.
Jednak mam do tego zalozenia jeszcze jedno "ale" (IMG:http://forum.php.pl/style_emoticons/default/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?
Go to the top of the page
+Quote Post
AxZx
post
Post #6





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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:)
Go to the top of the page
+Quote Post
Seth
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


Przetestowalem kilka mozliwosci i udalo mi sie znalezc taka, ktora dziala bez problemu (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 13:04