Menu      

Adatok tárolása fa szerkezetben (PHP)

Biztos sokan szerettünk már például termék kategóriákat eltárolni jól lekövethető és gyorsan kikérdezhető módon. Egy hasznos konvertert mutatunk be mely a hagyományos fa szerkezetű adattárolást átalakítja olyan formátumra, hogy a kikérdezést rekurzó nélkül megoldhassuk, ezzel jelentős erőforrásokat megspórolva az adatbázis szervernek.
Hagyományosan a legtöbben a következő táblaszerkezetet használjá fa szerkezetek tárolására:
id name parent_id created
1 Kateg1 0 dátum
2 Kateg2 1 dátum
3 Kateg3 3 dátum
Ebből látható, hogy a parent_id mező hivatkozik mindig a szülő rekordra. Ez mind szép és jó, mind ameddig kevés adatunk van a táblában, ugyanis gyorsan végig tudja pörgetni a mysql általában a rekurzív függvényünket, mely a példánkban is látható.
Azonban amint több ezer sorunk van a táblában, tehát egy jó nagy webshopot akarunk felépíteni például, akkor erősen gondolkodunk kell az optimalizáláson. Ehhez nem kell mást tennünk, mint még két oszlopot hozzácsapni az eredeti táblázatunkhoz, például lft és rght néven.

id name parent_id lft rght created
1 Kateg1 0 1 6 dátum
2 Kateg2 1 2 5 dátum
3 Kateg3 3 3 4 dátum

A két mező fogja meghatározni, hogy egyes kategóriába mennyi alkategória van, és sokkal egyszerűbb lesz a lekérdezésünk is. Azonban most ebbe nem megyek bele, az eddig legjobb cikk az alábbi linken olvasható angol nyelven, mely ezt a témát boncolgatja emberi nyelven.



Most lássuk akódunkat, mely az eredeti táblánkat átalakítja:
function rebuild_tree($parent, $left) 
{
    $right = $left + 1;

    $result = mysql_query('SELECT parent_id, id FROM studio_webshop_categories WHERE parent_id = "'.$parent.'";'); 
    while ($row = mysql_fetch_array($result)) 
    {
        $right = rebuild_tree($row['id'], $right);
    }

    mysql_query('UPDATE studio_webshop_categories SET lft = '.$left.', rght = '.$right.' WHERE id = "'.$parent.'";');

    return $right+1;
}

 rebuild_tree(0, 1) ; //kiadjuk a parancsot a fa újraépítésére

Adatok tárolása fa szerkezetben (PHP)

#totalstudio