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