Autor Zpráva
Fenykl
Profil *
Hezké nedělní odpoledne,

pro svoji známou se snažím vytvořit menší PHP / MySQL aplikaci, bohužel jsem se zasekl v polovině a nemohu s tím pohnout, zdá se mi, že nemám dobře navržené DB schéma, ale nemohu to dovymyslet.

Jedná se o jakous takous rezervaci pro malou školku. Školka má 2 třídy (zaregistrované děti v počtu cca 15-20 dětí).
Pro jeden hlídací den je kapacita na 1 třídu 10 dětí.

A ted to nejdůležitější. Některé děti mají svoje stabilní dny kdy chodí do školky. Stabilní dny jsou Po - Pá.

Pokud není v nějaký den zaplněná kapacita (tj. 10 dětí) je možné svoje dítě dopřihlásit pro ten den.

A já nyní řeším jak to celé navrhnout protože se může stát toto:


* Dítě které chodí ve stabilní den se z něj může odhlásit (rodič odhlásí samozřejmě)
* Pokud si to rozmyslí může jej znovu přihlásit
* Pokud někde vznikne volná kapacita, tj < 10 dětí tak se může dítě, které ten den stabilní nemá přihlásit (jen pro ten den)
* Samozřejmě se z něj může odhlásit
* Pokud v administraci budu šachovat s nastavováním dětí a jejich stabilními dny, musím pokrýt situace, že když budu chtít dítěti přidat stabilní den, nesmí "denní kapacita" přetéct, nesmí to uškodit jinému stabilnímu dítěti nebo přihlášenému dítěti (dočasně) ...


To je asi vše.

Navrhl jsem si tabulky
r
ejstrik_dite (id | jmeno | login | heslo )
zarazeni (dite_id | trida_id | day1 | day2 | day3 | day4 | day5 ) (den1 = Pondělí , den5 = Pátek, ukládá se 0 nebo 1 podle toho jestli je to jeho stabilní den)
akce (datum | dite_id | trida_id | typ = prihlaseni/odhlaseni) (Jaký si rejstřík akcí, jak se kdo prihlašuje a odhlašuje)

A ted když se podívám na kalendář tak potřebuji vidět kolik je volných míst a kolik z toho je zaplněno stabilní dětmi, kolik stabilních se odhlásilo, kolik přihlásilo a kolik dočasných přihlášeních a odhlášeních .... => ke každému dni

Jenže z těhle mých tabulek to neumím dát do kupy, klidně bych to dopočítal v PHP ale přijde mi, že si to nějak špatně ukládám a je to celé takové špatné.

Prosím dobrodince o nějaký nástřel jak to připravit lépe, abych pokryl moje požadavky. Případně bych něco zaplatil (dělám to zdarma, ale slíbil jsem to :-( a ted z toho nechci vycouvat).
preca1
Profil
Zdravim,
nejsem na DB odborník, ale nadhodim, co mě napadlo a snad mi to někdo kdyžtak zkritizuje.

tabulka dite
id (PK) | jmeno | ...

tabulka trida
id (PK) | kapacita | ...

tabulka registrace
id (PK) | datum | id_dite (FK) | id_trida (FK) | ...

Nepotřebuješ ukládat, jestli je přihlášený, nebo odhlášený - když neni přihlášený, je logický, že neni přihlášený :)).
Je opravdu potřeba vědět, jestli je to jeho stabilní den? Nebo stačí jen to dítě přihlásit na všechny dny dopředu? Jestli ano, řešil bych to sloupečkem stabilni (boolean) v tabulce registrace.

Údaje kde je dítě přihlášený, jaká je volná kapacita třídy, kdo je a kdo neni stabilní, apod. z tohodle podle mě vycucneš. Logika (kontrola kapacity) bude probíhat ve scriptu na serveru.

Snad sem pomoh
juriad
Profil
dite (id, jmeno, ...)
trida (id, nazev)
den (id, nazev, stabilni) (obsahuje: 1-pondeli-1, 2-utery-1, 3-streda-1, 4-ctvrtek-1, 5-patek-1, 6-sobota-0, 7-nedele-0)
stabilni_dochazka (dite_id, trida_id, den_id)
dochazka (dite_id, trida_id, den_id, date)

SELECT COUNT(*) FROM dochazka JOIN stabilni_dochazka USING (dite_id, trida_id, den_id) WHERE date = '2013-04-28' AND trida_id = 1 -- pocet stabilnich prihlasenych na dnesek
SELECT COUNT(*) FROM dochazka WHERE date = '2013-04-28' AND trida_id = 1 -- pocet vsech prihlasenych na dnesek
SELECT COUNT(*) FROM stabilni_dochazka WHERE den_id = 2 AND trida_id = 1 -- pocet stabilnich v utery

pravidelně (třeba o půlnoci z neděle na pondělí) budeš CRONem plánovat docházku na další týden (prakticky překopíruješ tabulku stabilni_dochazka s reálným datumem do tabulky docházka, žádná data nebudeš mazat)
přihlašování a odhlašování probíhá čistě přidáním/odebráním záznamu pro reálný den v tabulce dochazka.
přidání/odebrání záznamu v tabulce stabilni_dochazka mění jen plánování na příští týden, tento týden nemění
Fenykl
Profil *
Ahoj Juriade,

díky moc za návrh, nadtím CRONem a postupným přidáváním datumů jsem již také přemýšlel, ale chtěl jsem se tomu vyhnout, ale když na to ted koukám, bude to snazší pak ty data z DB dolovat a ověřovat, a ne ten můj nesmysl, kdy porovnávám nějaka uložená data X nějaké tinyINT jako stabilní dny a vznikájí z toho nekozinstetní datové typy a nedá se to prakticky rozumně porovnat.

Tak děkuji moc, jdu 90% práce odmazat a začít znovu, lépe ted než později.


Ještě dodatek:

Je opravdu potřeba vědět, jestli je to jeho stabilní den? Nebo stačí jen to dítě přihlásit na všechny dny dopředu?
Asi ne, jen jsem se Tím chtěl vyhnout problémům kdy si v administraci přehodí nebo zaškrtne / odškrtne nějaký den u dítětě považovaný za jeho stabilní (musí se vygenerovat vše dopředu nebo naopak odmazat, je to takové pracné... )

Ale každopádně děkuji.
Fenykl
Profil *
preca1:
Tobě taky děkuji, nakonec se mi zdá, že tabulka registrace bude nejsnažším řešením.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: