webForumDet fria alternativet

Kategorier i databas eller array?

PHPur PHP

6 svar · 468 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej alla glada!

Den här frågan fick hamna i PHP för att det är det jag använder tillsammans med MySQL...

Alla wF's forumkategorier ligger väl i databas antar jag, vilket är extremt enkelt för uppdatering, men hade det varit bättre med array egentligen? Eller finns det ytterligare sätt som är ännu bättre?

Om man har huvudkategorier och underkategorier, har man en databastabell för varje eller alla i samma och i så fall, hur kan en sådan databasstruktur se ut?

ID
ParentID (0 om huvudkategori)
Rubrik

?

Kategorier ska sedan kunna loopas ut i vald ordning och man ska kunna söka i databasen med hjälp av kategorierna. Är det smidigare och mer snabbladdat med array?

$kategorier = array("Kategori A" =>
array (
    0=> "Underkategori 1a",
    1=> "Underkategori 2a",)

"Kategori B" =>
array (
    0=> "Underkategori 1b",
    1=> "Underkategori 2b",)
);

Tackar för svar!

Medlem sedan mars 20007 896 inlägg
#2

Visst blir det en viss prestandavinst att lagra det i arrayer istället för databas, men du förlorar så mycket mer då det inte alls blir dynamiskt. För att t.ex. lägga till en kategori måste du ändra i källkoden istället för att bara lägga till ett fält i databasen. Och du måste skapa någon sorts algoritm för att söka igenom arrayerna när du vill ha ut enbart en kategori. Din databasstruktur såg absolut vettig ut. Kör på den, inte på arrayer.

Medlem sedan apr. 2008137 inlägg
#3

ID, parentID, namn är en väldigt vanlig struktur för nästlade strukturer av olika typer. Nackdelen är att du får ett rekursivt anrop när du vill hämta ut vägen till en nod, som exempel räcker det att titta på toppen av denna sida: "webForum > Webbrelaterade forum > Webbutveckling > PHP"
En metod om man ofta hämtar data från trädstrukturer med många nivåer är Modified Preorder Tree Traversal, där man kombinerar parentID med vänster och högervärde på varje nod. Detta kräver mer resurser när man stoppar in värden i trädet, men ger en rejäl prestandaökning vid hämtning.

Medlem sedan nov. 20016 480 inlägg
#4

M'kay, tack! :)

Medlem sedan nov. 20016 480 inlägg
#5

effata skrev:

ID, parentID, namn är en väldigt vanlig struktur för nästlade strukturer av olika typer. Nackdelen är att du får ett rekursivt anrop när du vill hämta ut vägen till en nod, som exempel räcker det att titta på toppen av denna sida: "webForum > Webbrelaterade forum > Webbutveckling > PHP"
En metod om man ofta hämtar data från trädstrukturer med många nivåer är Modified Preorder Tree Traversal, där man kombinerar parentID med vänster och högervärde på varje nod. Detta kräver mer resurser när man stoppar in värden i trädet, men ger en rejäl prestandaökning vid hämtning.

Sweet, men är det värt det om jag bara har huvudkategori och underkategori?

Har du något exempel på hur en sådan inmatnings-fråga kan se ut? Byggs inte hela left/right-systemet om ifall man lägger till kategorier i mitten?

Medlem sedan maj 20012 237 inlägg
#6

Du kan ju alltid cacha kategorierna. Sedan kan du invalidera cachen då kategoristrukturen förändras (t ex då du lägger till, tar bort eller modifierar en kategori) eller att en viss tid gått (TTL=0).

Dock skall du mäta, om cachningen verkligen är lönsamt. Det blir ju ändå lite overhead med cache.

Medlem sedan apr. 2008137 inlägg
#7

bassebhu skrev:

Sweet, men är det värt det om jag bara har huvudkategori och underkategori?

Har du något exempel på hur en sådan inmatnings-fråga kan se ut? Byggs inte hela left/right-systemet om ifall man lägger till kategorier i mitten?

Nej, det är absolut inte värt det om du bara har två nivåer i trädet. Vinsten med left/right får du först när alternativet är rekursiva slagningar. Dvs hämta alla noder med parent 1, sen för varje nod, hämta alla dess barn osv... Det blir snabbt en väldans massa slagningar om man gör så. Har du t.ex. 10 huvudkategorier och underkategorier på alla blir det 11 queries bara för det. Med left/right kan du göra det i en fråga. :)

Länken jag postade har bra kod-exempel. Hela left/rightsystemet byggs om vid insert vilket är den största nackdelen, men det är som sagt gjort för träd där man hämtar mycket oftare än stoppar in.

130 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
127 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)