Autor Zpráva
lukáš b.
Profil *
Dobrý den,

programuji rezervační systém a zasekl jsem se hned při tvorbě návrhu databáze, poradil byste mi někdo prosím, jakým způsobem bych měl řešit následující problém?

Uživatelé se mohou rezervovat na libovolný den (dle výběru z kalendáře) v určitých dobách (ty budou neměnné) a to tak, že na každou tuto pevně danou dobu se může registrovat buď jen jeden uživatel, který zvolí "single" a nebo čtyři uživatelé, kteří zvolí "more" v části rezervace (formuláře na webu).

Př.:

7:00 - 8:00 ... např. tuto celou dobu může max. 1 uživatel zabrat sám pro sebe, pokud zvolí "single"
8:00 - 9:00 ... a např. tuto dobu mohou zabrat max. 4 uživatelé, kteří zvolili "more"
9:00 - 10:00 ...

Děkuji za každou pomoc
Lukáš B.
ninja
Profil
Určitě pro každý den a hodinu (období) samostatný záznam (řádek).

Je na zvážení jestli mít v každém záznamu 4 sloty, nebo si do budoucna usnadnit a rovnou udělat vlastní záznam i pro každý slot.
lukáš b.
Profil *
Děkuji za radu, popravdě jsem asi k něčemu podobnému došel, určitě si to do budoucna usnadním tím, že pro každý slot bude jeden záznam.

Momentálně si ale nedovedu představit, jakým hrůzným způsobem bych měl zjišťovat, zda je možné se do daného dne ještě zarezervovat.

Uvedu to na příkladu, budu mít tedy tabulku rezervace, která bude mít sloupce

id_uzivatel
datum
cas - tady si myslím, že bych mohl mít počáteční hodinu (tedy třeba 7:00 .. bude to slot od 7:00 do 8:00)
typ - "single" / "more"

Zádrhel je v tom, kdyby někdo náhodou rezervoval ve stejný čas, jeden uživatel by zvolil "single" a druhý "more" a už by to bylo chybně. Nemůžu přijít na to, zda by mi tady v něčem neusnadnily práci nějaké indexy (unikátní?), ale nevidím nikde, kde je použít. Nebo pokud byste mi ještě poradil, jakým způsobem vyřešit to, aby taková situace nebyla možná? (protože i když je tu malá pravděpodobnost, že toto nastane, bude to ale možné...)

Děkuji
ninja
Profil
Na zajištění konzistence dat se používá zamykání tabulek nebo transakce. Případně vložit dotaz s ověřením přímo do INSERTu.

Ověření volných, respektive obsazených slotů na nějaký termín například:

SELECT datum, cas, COUNT(IF(typ='single',4,1)) AS pocet_obsazenych_slotu FROM rezervace GROUP BY datum, cas;
lukáš b.
Profil *
ninja
Díky, ale ten select myslím nefunguje tak jak bych chtěl právě. Problém je s tím počítáním, konkrétně COUNT(IF(typ='single',4,1)) AS pocet_obsazenych_slotu

Spočítá to prostě všechny vybrané řádky a na čísla 4 a 1 v té podmínce to nemá vliv.
ninja
Profil
jistem, misto COUNT ta ma byt SUM, opraveno.
lukáš b.
Profil *
To je zvláštní, původně jsem měl vytvořené dvě tabulky, ale předělal jsem to do jedné a počítá to dobře jak má. Ale pokud jsem tam spojoval dvě tabulky JOINem a pak pomocí count / sum tak mi to ukazovalo jiný výsledek než když to mám v jedné tabulce.. Ale už to funguje.

Díky moc za rady a nakopnutí správným směrem.
lukáš b.
Profil *
ninja
K transakcím, nikdy jsem je nepoužíval, vždycky jsem si vystačil s MyISAM. Možná nastal čas je začít používat. Něco jsem si o nich přečetl, ale nevím jestli to chápu dobře. Navíc všechny dobré zdroje jsou anglicky a já angličtinu neumím..

Chápu to dobře, že by to fungovalo, kdybych to provedl tímto způsobem?

start transakce
výběr (klasický select ..) počtu volných slotů na objednávaný den
vytvoření rezervace
konec transakce

Vyřeší se tímto ten problém, že pokud by ve stejnou dobu dva různí uživatelé rezervovali - jeden "single" a druhý "more", že se to povede rezervovat jen jednomu? Chovají se transakce jako fronta nebo ne? Případně jak bych měl postupovat, abych zajistil konzistentnost dat pro takovou možnost?

Předem díky za upřesnění

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: