Ako správne navrhnúť tabuľky schopné pre Nette?
- SontoEremo
- Člen | 341
Zdravím…
Rád by som vedel vaše názory ako správne vytvoriť pre môj problém
tabuľky tak aby bolo prepojiteľné…
Mám tri tabuľky
tabulka_klienti
CREATE TABLE `tabulka_klienti` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rezervacia_id` varchar(7) COLLATE utf8_bin NOT NULL,
`cele_meno` varchar(128) COLLATE utf8_bin NOT NULL,
`emailova_adresa` varchar(1024) COLLATE utf8_bin NOT NULL,
`telefonne_cislo` varchar(20) COLLATE utf8_bin NOT NULL,
`typ_rezervacie` varchar(32) COLLATE utf8_bin NOT NULL,
`typ_sluzby` varchar(32) COLLATE utf8_bin NOT NULL,
`datum_rezervacie` varchar(10) COLLATE utf8_bin NOT NULL,
`cas_rezervacie` varchar(15) COLLATE utf8_bin NOT NULL,
`stav_rezervacie` varchar(32) COLLATE utf8_bin NOT NULL,
`datum_prijatia` varchar(10) COLLATE utf8_bin NOT NULL,
`cas_prijatia` varchar(8) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
tabulka_mesiace
CREATE TABLE `tabulka_mesiace` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`meno_mesiaca` varchar(32) COLLATE utf8_bin NOT NULL,
`adresa_mesiaca` varchar(32) COLLATE utf8_bin NOT NULL,
`aktivny_stav` varchar(32) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
tabulka_datum
CREATE TABLE `tabulka_datum` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`den` varchar(10) COLLATE utf8_bin NOT NULL,
`datum` varchar(10) COLLATE utf8_bin NOT NULL,
`tabulka_mesiace_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `tabulka_mesiace_id` (`tabulka_mesiace_id`),
CONSTRAINT `tabulka_datum_ibfk_1` FOREIGN KEY (`tabulka_mesiace_id`) REFERENCES `tabulka_mesiace` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Potrebujem navrhnúť tabuľky tak aby keď sa klient rezervuje tak ja
v administrácii
potrebujem vytiahnuť tabulka_klienti->datum_rezervacie a
priradiť to k tabulke_datum
Napadla ma jedna varianta
spraviť si tabuľku napr. tabulka_idecka a tam si vytiahnuť tabulka_klienti_id, tabulka_mesiace_id a tabulka_datum_id ale neviem či je to ideálne a ako by som to potom vytiahol tak aby to dávalo zmysel…
Napadá Vás nejaké lahšie, prehladnejšie či jednoduchšie riešenie?
Za každú radu/pomoc som vopred vďačný.
Editoval SontoEremo (18. 12. 2015 23:41)
- hitzoR
- Člen | 51
Za prvé moc nechápu to rozdělení data na měsíc a datum. Chtělo by to nějak líp popsat, co by celá ta databáze měla dělat, popsat vztahy apod., protože ten slovní popis je takový zmatený (skoro mám pocit, že měsícem není myšleno kalendářní měsíc, ale těleso ve vesmíru, které má dokonce vlastní adresu :D).
Jediná rada, kterou s těmahle informacema můžu dát, je rozdělení tabulky klienti na dvě tabulky, protože v ní mícháš dvě různé různé entity – klienty a rezervace. A taky u IDček používej unsigned integer.
Editoval hitzoR (22. 12. 2015 7:45)
- SontoEremo
- Člen | 341
nazdar @hitzoR
Nevšimol som si, že si odpísal takže k veci.
Za prvé moc nechápu to rozdělení data na měsíc a
datum.
Mám kalendár v selecte si vyberieš mesiac napr. január a pod ním sa ti
zobrazia dni príslušne k danému mesiacu. Nevedel som to urobiť
efektívnejšie stále sa na nette učím :)
Chtělo by to nějak líp popsat, co by celá ta databáze měla
dělat, popsat vztahy apod.
Mám stránku kde sa dá objednať na nechty (je to pre známu).
Prídeš na stránku vyberieš si v kalendári mesiac a deň na ktorý sa
chceš objednať klasický sa vyplní form a odošle.
Ku každému dňu prisluhujú tri časy v select-e teda mám
– 09:00 – 11:00 –
– 13:00 – 15:00 –
– 15:00 – 17:00 –
Napr. niekto príde vyberie si január, deň 10.01.2016 a čas 13:00 – 15:00
vyplní form a odošle …
po ňom príde ďalší vyberie si január, deň 10.01.2016 ale čas
13:00 – 15:00 už na ten deň nebude figurovať čiže
dostupné budú už len
– 09:00 – 11:00 –
– 15:00 – 17:00 –
nakoľko už ten čas bol obsadený…
a ak sa na daný deň teda 10.01.2016 obsadia všetký časy potrebujem aby sa
po poslednom volnom čase v daný deň zároveň aktualizovala tabuľka a
zmenila deň z tohto
<tr>
<td><a href="javascript:;">10.01.2016</a></td>
</tr>
na toto
<tr class="busy">
<td>10.01.2016</td>
</tr>
Ak by niekto z nejakého dôvodu zrušil objednávku tak potrebujem povedať tabuľke že objednávka napr. na čas – 09:00 – 11:00 – bola zrušená aktualizuj sa a zmeť toto
<tr class="busy">
<td>10.01.2016</td>
</tr>
na toto
<tr>
<td><a href="javascript:;">10.01.2016</a></td>
</tr>
a pri vyplňaní form už bude dostupný uvolnený čas pre daný deň, teda v selecte bude – 09:00 – 11:00 – pre výber času…
Jediná rada, kterou s těmahle informacema můžu dát, je
rozdělení tabulky klienti na dvě tabulky, protože v ní mícháš dvě
různé různé entity – klienty a rezervace.
Ale ja tabuľku klienti používam len čisto na objednávku teda nevytváram
klientom žiadny účet… (možno časom) ako tak teraz čítam asi bude
lepšie rozdeliť tabuľky aby som to neskôr neolutoval :) …
A taky u IDček používej unsigned integer.
Môžeš mi vysvetliť prečo používať unsigned integer.
Ak nebudeš niečomu rozumieť rád vysvetlím ešte viac podrobnejšie :D … pomaly sa sám začínam v tom zamotávať.
- chemix
- Nette Core | 1310
@SontoEremo
unsigned = nezaporny viz https://dev.mysql.com/…r-types.html
mrkni i na jine typy sloupcu (date, datetime, enum, …)
stav_rezervacie = misto stringu pouzivam radeji tinyint, nebo enum
datum_prijatia + cas_prijatia = datetime
osobne volim anglicke popisky sloupecku, pokud muzes tak si hned rozdel klienty a rezervace, pozdeji je oser to resit (prace navic)
- SontoEremo
- Člen | 341
@chemix ďakujem za informácie :)
Ale nenapadá Vás nejaké fajn riešenie ako to všetko poprepájať?
- GEpic
- Člen | 566
Na všechny datumy, dny, názvy dnů, časy, termíny ti stačí jeden údaj
a to timestamp, se kterým se dá díky tříde DateTime
v PHP
dobře pracovat a kde si můžeš pomocí funkce format()
zjistit
cokoliv potřebuješ. Taktéž ho můžeš modifikovat (posouvat o dny / hodiny
dopředu / dozadu) pomocí funkce modify()
např.
modify("+$offset hour")
nebo získávat rozdíly dvou různých
údajů a následně pracovat s třídou DateInterval
např. pro
výpočet zbývajícího času do začátku události.
Jednoduchý návrh databáze:
Tabulka klienti:
ID - AI (PRIMARY KEY)
JMENO
PRIJMENI
TELEFON
HESLO
....
Tabulka udalosti:
ID - AI (PRIMARY KEY)
USER_ID (FOREIGN KEY)
ACCEPTED - TIMESTAMP
CREATED - TIMESTAMP
TYPE
STATE
WHATEVER...
Pak se po vybrání události z databáze můžeš jednoduše dostat na záznam z tabulky klienti
Já osobně využívám podobný model, každopádně v databázi se vždy snažím ukládat co nejvíce číselných hodnot, a pomocí PHP Modelu je pak převádět do „lidské podoby“
Například pokud mám nějaké stavy události – přijatá, zrušená, odložená, smazaná, apod… využívám podobný styl funkcí:
public function getState() // Kde $id je číselná hodnota z databáze
{
return array(
1 => "Přijatá",
2 => "Zrušená",
3 => "Odložená"
...
);
}
V programu si pak volám např.: (Kde $id je hodnota ze sloupečku v databázi)
$state = $this->getState();
$this->template->stavObjednavky = $state[$id];
Snad alespon TROŠIČKU pomohu… :)
Editoval GEpic (5. 1. 2016 19:57)
- SontoEremo
- Člen | 341
Nazdar @GEpic určite mi tvoj post pomôže … momentálne som to ešte neskúšal ale neskôr určite potom by som napísal lebo dosť veciam nechápem … a ako vidno ty si skoro podobný problém už riešil …
- GEpic
- Člen | 566
Kdyby něco, klidně napiš, pokusím se ti pomoct pokud to bude v mých silách… :)
A ano, řešil. Programoval jsem aplikaci na rezervaci tenisových kurtů. Kde je několik kurtů, několik typů událostí, některé opakovatelné, většina uživatelských, atp.
Editoval GEpic (5. 1. 2016 22:50)