InnuDb – data bez databáze

24. června 2013

Před několika málo dny, jsem se pustil do jednoho menšího experimentu na jehož konci stojí knihovna InnuDb. Vše stojí na jednoduchém předpokladu – ne každý web potřebuje pro uložení svých dat databázi.


Databází mám v tomto případě na mysli např. MySQL, nebo jinou relační databázi. Je poměrně nesmyslné pro nějaký pidi-web zřizovat databázi a mít v ní např. 2 tabulky a v obou dohromady tak max. 40 řádků. Ano, pro takový web můžete použít např. SQLite, tj. všechna data máte v jednom souboru vedle zdrojáků. Ale stejně pak musíte nějak ty data z té databáze vytáhnout, zpracovat, pravděpodobně nad standardním rozhraním, které nabízí PHP, postavíte a použijete nějakou objektovou obálku. Nebylo by prostě jednodušší mít ty data v nějakém jednoduchém poli, ze kterého si pak jen vytáhneme údaje, které nás zajímají?

Rozhodně nechci, aby to vyznělo, že databáze jsou k ničemu. To vůbec ne! Databáze jsou super! A když to s nimi umíte a víte co dokážou a v čem vám můžou pomoci, můžete je využít na maximum a stávají se nenahraditelným pomocníkem. Transakce, triggery, cizí klíče, indexy,… věci které vám normální pole dat prostě nenabídne. Ale to ani není cílem.

Cílem je např. zobrazení osob, s jejich emailovou adresou, telefonním číslem, poštovní adresou. Nic víc, nic míň. Žádné vkládání a editace dat přes webové rozhraní. Žádné nahrávání fotek, vkládání komentářů, hodnocení, ankety,… Můžete to načíst z databáze, nebo to prostě načtete z jednoduchého asociativního pole. Je na vás, kterou cestu zvolíte.

Všichni podvědomě šáhnou po databázovém systému ikdyž ho ve skutečnosti nepotřebují. Jak např. dokazují tvůrci webu Kinohled.cz – web stojí na moderních technologiích (HTML5, Stylus, Nette 2, jQuery) a nepoužívá žádnou databázi – veškerá data si stáhne ve formě JSON souboru, který poté už jen naservíruje uživateli v nějaké podobě. Nic víc, nic míň.
(Pokud se chcete o Kinohledu dozvědět více, můžete navštívit jejich profil na Facebooku.)

Samozřejmě zvolená cesta vždy záleží na mnoha aspektech. Kolik těch dat bude, potřebuji hlídat referenční integritu, triggery, budou data vkládána přes webové rozhraní, nebo se jen vygeneruje data-set a ten se nějak zobrazí?

Zrodila se nedatabáze

InnuDb je pidi knihovna o čtyřech třídách, kterou vlastně ani nepotřebujete. Ale může vám ulehčit práci.

InnuDb předpokládá, že data (pole) máte uložena v nějakém souboru v rámci zdrojových kódů (já vím SQLite), ale není to podmínkou. Pro uložení dat jsou nyní podporovány 4 typy souborů – soubor s PHP polem, NEON, JSON a INI. Data ze souboru načtete a nějak použijete. Můžete data seřadit, můžete použít limit a offset, můžete data omezit pomocí podmínek (WHERE).

$pathToFile = __DIR__ . '/data.php';
$loader = new Cz\InnuDb\Loader;
$innudb = new Cz\InnuDb\InnuDb($loader, $pathToFile);

// vytahneme z pole subset nazvaný 'persons'
$persons = $innudb->createCollection('persons');

// a zpracuje
foreach($persons as $id => $person) {
    var_dump($person['name']);
    var_dump($person['age']);
}

Pokud máme data v PHP souboru s polem, může obsah souboru vypadat např. nějak takto:

<?php
return array(
    'persons' => array( // 'persons' subset
        'harry-potter' => array(
            'name' => 'Harry Potter',
            'story' => 'Harry Potter',
            'age' => 20,
        ),

        'gandalf' => array(
            'name' => 'Gandalf The White',
            'story' => 'Lord of the Rings',
            'age' => 2000,
        ),
    ),
);

Ale jak už jsem psal, soubor s daty nepotřebujete, můžete rovnou použít pole přímo v kódu:

<?php
$data = array(
    'harry-potter' => array(
        'name' => 'Harry Potter',
        ...
    ),
    ...
);

$persons = new Cz\InnuDb\Collection($data);

// a ted uz je to stejne jako pri nacitani ze souboru
foreach ($persons as $id => $person) {
    var_dump($id); // 'harry-potter'
    var_dump($person['name']);
}
  • Repozitář na GitHubu
  • Licence: New BSD License
  • Závislosti: Nette Framework – vyžaduje třídu Nette\Object a třídy pro načtení NEON, JSON, INI a PHP pole.

Knihovna je zatím jen experimentem. Pokud naleznete nějaký problém, budu rád, když mi ho nahlásíte – ať už formou issue, zde v komentářích, nebo nějak jinak.

Líbí se vám tato stránka?