generování odkazů z databáze routování

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
zool
Člen | 144
+
0
-

Ahoj mám takový problém, řeším adresy odkazů až na konci projektu. Adresy generuji z databáze, ale stalo se mi, že když generuji celé kategorie, tak mám hodně dotazů na databázi, a tedy to není moc rychlé , nevíte jak by se to dalo zrychlit děkuji. Inspiroval jsem se návodem od Honzy Smitka o routování.

studna
Člen | 181
+
0
-

Jednoduše, implementuj cache. Tedy výsledky poskládané z DB dat si uložíš do cache a vracíš výsledek z cache.

zool
Člen | 144
+
0
-

No cashování nad databází mám zapnuté, ale pořád je jich mnoho…

zool
Člen | 144
+
0
-

Zkousím to napsat trochu jinak mám vlastní routu, která za pomocí databáze generuje přátelské adresy
mám kód

$routerStranky = new RouterStranky('[<id>/][<produkty-vp-page>/]',array(
            'id'    => array(
                Route::FILTER_OUT   => function ($id) use ($container){
                    if(!is_numeric($id))
                    {
                        return $id;
                    }
                    else
                    {
                        $adresa = $container->model->getStranky()->select('adresa')->get($id)->adresa;
                        return $adresa;
                    }
                },
                Route::VALUE => $uvod
            ),
            'module'    => 'Front',
            'presenter' => 'Stranky',
            'action'    =>  'default'
        ));
        $routerStranky->context = $container;
        $router[] = $routerStranky;

Problém nastává na tomto řádku

$adresa = $container->model->getStranky()->select('adresa')->get($id)->adresa;

Tím že se po každé volá dotaz nad databází a pokud se generují adresy třeba 40 odkazů, tak se do databáze podívá 40×. Přemýšlel jsem nad tím, a myslím, že by šlo si předem uložil pole s klíči id a hodnotou adresy, a pak pouze šahat do tohoto pole(kde by byli uloženy adresy všech stránek), ale nevím jestli je to takto správně.
díky

Tomáš Votruba
Moderator | 1114
+
0
-

@zool: Jak píše studna, přidej cache. Cachování nad db asi myslíš cachování struktury dotazů, nikoliv jejich výsledků (pozor na to).

Takto nějak:

// $adresa = $container->model->getStranky()->select('adresa')->get($id)

$cache = $container->cache;
$adresaList = $cache->load("adresaList");
if ($adresaList == NULL) {
	$adresaList = $container->model->getStranky()->fetchPairs('id', 'adresa');
	$cache->save("adresaList", $adresaList);
}

if (isset($adresaList[$id])) {
	$adresa = $adresaList[$id];
}