Obsah
Vytvoření databáze
Jako každá aplikace, která pracuje s nějakými daty, i náš todo list potřebuje svá data někam ukládat. Tohle „někam“ pro nás bude představovat MySQL databáze. V souladu s dobrými návyky softwarového inženýrství, je dalším logickým krokem tedy to, že tuto databázi navrhneme a vytvoříme. Tak hurá na to!
Návrh databáze
Když chceme databázi navrhnout jako první se musíme zamyslet nad tím, co do naší databáze budeme potřebovat uložit. Vyjdeme z toho, že chceme vytvořit jednoduchý todolist. Takový todolist obsahuje jednotlivé úkoly.
Struktura databáze
→ Budeme tedy potřebovat jednu tabulku, kam uložíme ty úkoly.
Otázka zní, co všecho bude takový jeden úkol mít?
Struktura tabulky
- No, tak jednak u něho potřebujeme vědět, zda už je, či není splněn → tudíž budeme potřebovat jeden sloupeček typu ANO/NE (boolean)
- Úkol by také mohl mít svůj text, dlouhý maximálně 100 znaků → potřebujeme sloupeček typu řetězec (varchar), s velikostí 100
- Také budeme potřebovat vědět datum a čas, kdy byl úkol přidán → potřebujeme jeden sloupeček typu časové razítko (timestamp)
- No a jelikož budeme chtít, aby šly názvy úkolů měnit, budeme potřebovat jeden sloupeček, podle kterého jednotlivé úkoly od sebe odlišíme → bude to číslo, které použijeme jako ID, neboli primární klíč (int)
Sečteno podtrženo by naše tabulka měla vypadat nějak takto:
Struktura tabulky „tasks“:
| id (int, PK): | text (varchar(30)): | added (datetime): | done (enum(yes,no)): |
|---|
když by v ní byla nějaká data pak:
Možný obsah tabulky „tasks“:
| id (int, PK): | text (varchar(30)): | added (datetime): | done (enum(yes,no)): |
|---|---|---|---|
| 1 | úkol 1 | 2010–01–24 18:16:05 | no |
| 2 | úkol 2 | 2010–01–24 18:17:45 | no |
| 3 | úkol 3 | 2010–01–24 18:18:12 | yes |
Vytvoření databáze
Když strukturu naší tabulky vyjádříme SQL příkazem v MySQL dialektu pak získáme:
CREATE TABLE `tasks` (
`id` int(11) NOT NULL auto_increment,
`text` varchar(100) NOT NULL,
`added` datetime NOT NULL,
`done` enum('yes','no') NOT NULL default 'no',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Příkazy, pomocí kterých bychom do ní mohli přidat testovací data lze v MySQL vyjádřit takto:
INSERT INTO `tasks` VALUES('1','úkol 1','2010-01-24 18:16:05','no'),
('2','úkol 2','2010-01-24 18:17:45','no'),
('3','úkol 3','2010-01-24 18:18:12','yes');
Když oba dva SQL skripty spojíme a přidáme příkazy pro vytvoření a vybrání databáze společně s několika dalšími detaily, získáme následující SQL skript:
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
CREATE DATABASE `todolist`;
USE `todolist`;
DROP TABLE IF EXISTS `tasks`;
CREATE TABLE `tasks` (
`id` int(11) NOT NULL auto_increment,
`text` varchar(100) NOT NULL,
`added` datetime NOT NULL,
`done` enum('yes','no') NOT NULL default 'no',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tasks` VALUES('1','úkol 1','2010-01-24 18:16:05','no'),
('2','úkol 2','2010-01-24 18:17:45','no'),
('3','úkol 3','2010-01-24 18:18:12','yes');
SET FOREIGN_KEY_CHECKS = 1;
Pomocí tohoto SQL skriptu lze vytvořit naši databázi včetně testovacích dat.
Tento skript si uložíme do souboru tasks.sql do adresáře
TodoList/app/.
Hotovo
Tak a naše databáze je hotova – ani to moc nebolelo ne? :-)
Výsledek této části průvodce si můžete stáhnout níže.
Co bychom si měli zapamatovat?
- Databázi, neboli datový layer, navrhujeme vždy dřív než začneme vyvíjet, je to první krok vývoje
- Strukturu databáze navrhneme nejprve na papír, či pomocí specializovaného nástroje a potom jej přepíšeme (nebo to udělá nástoj za nás) do SQL.
- SQL obsahuje strukturou databáze a může obsahovat a základní data (tzv. fixtures), toto SQL si archivujeme, zpravidlav repozitáři s aplikací (pozn. místo SQL lze v případě pokročilých nástrojů používat alternativní fomráty – např. YAML)
- Pokud používáme databázi
MySQL, tak nesmíme zapomenout na příkazSET NAMES utf8na začátku komunikace!
Když máme vyřešeno úložiště dat, můžeme začít vytvářet samotnou aplikaci. Už se těším! Začneme vytvořením presenteru…
Připojené soubory
- todo-list.zip 427 kB
Komentáře 
Ondřej Mirtes | 27. 1. 2010, 0:37 | comment
Já bych pro uložení booleanu v MySQL použil tinyint(1) – používá se to tak.
Inza | 27. 1. 2010, 16:37 | comment
Ad tinyint(1), jednoznačná konvence v tomto směru neexistuje, cíl je, aby výsledek zabíral pokud možno jeden bit (Ano/Ne), když použiješ tinyint s velikostí 1 nebo binární enum, výsledná paměťová složitost bude v MySQL stejná. To yes a no vypadá lépe když si prohlíží DB nějakým administračním nástrojem – např. Adminerem, nebo phpMyAdminem… proto jsem zvolil toto. Zcela stejná diskuze by se asi dala vést na téma zda ukládat datum a čas jako timestamp nebo jako datetime…
Honza Marek | 27. 1. 2010, 19:04 | comment
Určitě tinyint(1), protože dibi umí phpčkové true nebo false převést právě na 0 a 1.
Taco | 28. 1. 2010, 1:45 | comment
Inza Jen pro pořádek, co se týče ukládání datumu do databáze o tom by se diskuse vést nedala. To je totiž naprosto jasné. Někdo, kdo bude datum ukládat jako timestamp (myslím tím unix-timestamp) si zaslouží přerazit pazoury.
Inza | 3. 2. 2010, 7:47 | comment
Taco: Jo, taky bych přerážel, ale jak vidíš, tak jsou lidé (např. Acu), kteří to dělají – každý přístup má své pro a proti, já používám datetime a enum – databázi tak lze bezproblémů snadno číst i v jejím „RAW“ formátu přímoz nástrojů jako je Adminer, PHPMyAdmin, nebo Navicat…
mtk23 | 22. 5. 2010, 21:29 | question
Zdravím, nejspíš jsem uplně mimo, ale nejde mi připojit k databázi přez dibi, pořád hlásí Configuration must be array, string or ArrayObject. Přitom ve výpisu vidím jak se předává v argumentu pole objektu: Source file: /TodoList/libs/dibi/libs/DibiConnection.php Line: 68 … elseif (!is_array($config)) { throw new InvalidArgumentException(‚Configuration must be array, string or ArrayObject.‘); }
Call stack:
1. dibi/dibi.php DibiConnection → __construct (arguments ▼) $config
object(Config) (8) ▼ {
„profiler“ ⇒ string(1) „1“
„username“ ⇒ string(8) „todolist“
„password“ ⇒ string(8) „todolist“
„driver“ ⇒ string(5) „mysql“
„database“ ⇒ string(8) „todolist“
„charset“ ⇒ string(4) „utf8“
„lazy“ ⇒ string(1) „1“
„host“ ⇒ string(9) „localhost“ }
$name
int(0)
2. app/bootstrap.php dibi:: connect (arguments ▼) ten samy $config
Nevíte někdo prosím kde je chyba ?




_Martin_ | 26. 1. 2010, 23:49 | question
Měl by se SQL soubor ukládat přímo do složky
app?