EN | CS | Přihlásit | Registrovat

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říkaz SET NAMES utf8 na 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


Komentáře Comments feed

_Martin_ | 26. 1. 2010, 23:49 | question

Měl by se SQL soubor ukládat přímo do složky app?

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/lib­s/dibi/libs/Di­biConnection.php Line: 68 … elseif (!is_array($con­fig)) { throw new InvalidArgumen­tException(‚Con­figuration 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 ?

mtk23 | 24. 5. 2010, 21:37 | comment

Login to submit a comment