Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Plan zajeć (MySQL i operacje na datach)
Forum PHP.pl > Forum > PHP
piotras
Witam,

zabieram się za aplikację, która będzie służyła do rezerwacji terminów zajęć. Zajęcia odbywają się cyklicznie i trwają przez okres 6 miesięcy.

Osoba zapisuje się na zajęcia w okreslonym dniu tygodnia i o określonej godzinie.

Mam w związku z tym 3 pytania:

1) Czy rejestrując nowego uczestnika zajęć w systemie lepiej w bazie trzymać informacje o wybranym przez niego dniu tygodnia i godziny, czy policzyć wszystkie daty, w ktorych ten dzień występuje) przez całe 6 miesięcy i tak zapisać to w dedykowanej do tego tabeli?

2) Który ze sposobów opisanych wyżej lepiej (łatwiej) nadaje się do sprawdzania kolizji terminów w trakcie rejestracji kolejnego uczestnika?

3) Czy MySQL ma jakąś funkcję, która sprawdza, czy dana data 'zawiera' się w wybranym przedziale czasowym?

Z góry dziękuję za pomoc.

Pozdr
Piotr
mar1aczi
Cytat(piotras)
1) Czy rejestrując nowego uczestnika zajęć w systemie lepiej w bazie trzymać informacje o wybranym przez niego dniu tygodnia i godziny, czy policzyć wszystkie daty, w ktorych ten dzień występuje) przez całe 6 miesięcy i tak zapisać to w dedykowanej do tego tabeli?

Użytkownik zapisując się na kurs będzie do niego przypisany (wiązanie użytkownik<->kurs), a z kolei kurs ma swój rozkład zajęć(?).
Cytat(piotras)
2) Który ze sposobów opisanych wyżej lepiej (łatwiej) nadaje się do sprawdzania kolizji terminów w trakcie rejestracji kolejnego uczestnika?

Dla danego kursu masz limit użytkowników? Sprawdzasz ilu już jest przypisanych i pozwalasz na kolejnego lub nie.
Cytat(piotras)
3) Czy MySQL ma jakąś funkcję, która sprawdza, czy dana data 'zawiera' się w wybranym przedziale czasowym?

between
Crozin
Bardzo często zdarza się, że przy wszelkiego rodzaju rozkładach jazdy, planach zajęć czy ogólnie harmonogramach jakieś pojedyncze zajęcia zostają przesunięte w czasie. Powodów dla tego typu przypadków jest cała masa, święta, niedyspozycyjność prowadzących, konflikt z innymi zajęciami itp. itd. Dlatego też sugerowałbym każde pojedyncze zajęcia zapisywać osobno, a nie jako "wydarzenie cykliczne".
piotras
hej

Trochę uprościłem pierwszego posta, żeby łatwiej wytłumaczyć.

W rzeczywistości wygląda to tak:

1. Uczestnik może zapisać się do danej grupy
2. Grupa ma określony poziom trudności, czas trwania i liczbę użytkowników
3. Grupa (a nie uczestnik) ma zdefiniowany rozkład zajęć (czyli wiązanie: uczestnik->grupa->kurs)

Czyli jak lepiej? Liczyć wszystkie daty, czy zdefiniować dla grupy dzień tygodnia, godzinę i czas trwania i sprawdzać to w locie?

Jeszcze jedno pytanie abstrahując od powyższego: Jeżeli sprawdzam kolizję zajęć (czy jedno nie nakłada się na drugie) lepiej mieć w bazie datetime rozpoczęcia zajęć i czas trwania, czy datetime rozpoczęcia i zakończenia? Sprawdzając (np funkcją between) chyba lepiej te drugie. Co myslicie?

Pozdrawiam
Piotrek


Cytat(Crozin @ 20.02.2013, 15:34:02 ) *
Bardzo często zdarza się, że przy wszelkiego rodzaju rozkładach jazdy, planach zajęć czy ogólnie harmonogramach jakieś pojedyncze zajęcia zostają przesunięte w czasie. Powodów dla tego typu przypadków jest cała masa, święta, niedyspozycyjność prowadzących, konflikt z innymi zajęciami itp. itd. Dlatego też sugerowałbym każde pojedyncze zajęcia zapisywać osobno, a nie jako "wydarzenie cykliczne".



Zajęcia z powodów technicznych nie mogą zostać przesunięte. Te zajęcia, ktore się nie odbyły dostają status 'do odrobienia'

Czy proponujesz policzyć np wszystkie czwartki o 17.00 i zapisać jako osobne rekordy w bazie?
mar1aczi
Cytat(piotras)
Czyli jak lepiej? Liczyć wszystkie daty, czy zdefiniować dla grupy dzień tygodnia, godzinę i czas trwania i sprawdzać to w locie?

Grupa jest przypisana do konkretnego kursu (jego id) a ten kurs z kolei ma ustalony rozkład zajęć (wiązanie kurs<->harmonogram_zajec) - ja tak bym to widział.
Crozin
Cytat
Zajęcia z powodów technicznych nie mogą zostać przesunięte. Te zajęcia, ktore się nie odbyły dostają status 'do odrobienia'
To nadal nie rozwiązuje wszystkich problemów. Powiedzmy, że jakaś grupa ma zajęcia raz w tygodniu, w poniedziałek o 10:00, od września do końca grudnia (ok. 16 zajęć). Co z 11 listopada, który w tym roku wypada właśnie w poniedziałek? Raczej łatwiej będzie Ci pracować z bazą danych, gdzie każde pojedyncze zajęcia są zapisane jako osobny wpis. Wyszukiwanie kolidujących terminów również powinno być dużo prostsze.
Cytat
[...] lepiej mieć w bazie datetime rozpoczęcia zajęć i czas trwania, czy datetime rozpoczęcia i zakończenia?
Zdecydowanie druga opcja. Jednak jeżeli znajdziesz jakiś przypadek, gdzie czas trwania byłby wygodniejszy niż data i czas zakończenia zawsze możesz:
1. Dynamicznie wyliczyć czas trwania jako różnicę czasu zakończenia i rozpoczęcia.
2. Trzymać datę rozpoczęcia i zakończenia oraz czas trwania w bazie. Będziesz jedynie musiał pilnować by aktualizując dane, zachować spójność informacji.
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.