Jo, jag står just i begrepp att skriva om en av mina gamla applikationer (ett nyhetsscript) så att man får möjlighet att lägga in fritt antal nivåer/underkategorier istället för som nu att man har en toppnivå där man kan skapa fritt antal kategorier och sen lägga in nyheter under dessa. Jag skulle dock uppskatta lite tankehjälp med detta så kanske jag slipper gå in i nån vägg. :)
Vad jag har idag funkar med hjälp av två db-tabeller som kan förenklas såhär:
news_categories
id
namn
news_items
id
categoryID
namn
innehåll
... som ni ser så kopplas en nyhet alltså till en viss kategori med hjälp av "categoryID" vilket ju är väldans enkelt och funkar bra. Men ofta skulle jag vilja kunna skapa underkategorier till kategorier, och istället för att koda om programmet så att man kan ha just en nivå till skulle det ju kännas mycket smartare att tillåta oändligt antal underkategorier, så att man t.ex. skulle kunna ha följande struktur:
topp
|--- Sverige
|--- Stockholm
|--- Södermalm
|--- Malmö
|--- Norge
|--- Oslo
|--- Drammen
Ja, ni förstår säkert...
Min första tanke var att helt enkelt fortsätta att ange "categoryID" i "news_items" och lägga till typ "parentCategoryID" i "news_categories" så att man hela tiden kan referera bakåt, uppåt i hierarkin. Vilket ju skulle funka, men hur skulle man på ett enkelt sätt lista "barn" som respektive kategori skulle ha utan att behöva göra ett nytt SQL-anrop varje gång man skriver ut en kategori?
Jag menar, skulle verkligen följande SQL vara särskilt optimal?
SELECT id, namn FROM news_categories
... och sen i en foreach-loop:
SELECT id, namn FROM news_categories WHERE parentCategoryID = $id
dvs att man gör en SELECT och därmed en query för varje kategori man listar? Det känns inte smidigt...
Om nån har några ljusglimtar till fina idéer att dela med sig av i den här frågan skulle jag bli både glad och tacksam!
dvs att man gör en SELECT och därmed en query för varje kategori man listar? Det känns inte smidigt...
Det kanske inte känns smidigt. Men det kanske är smidigt i alla fall. Beroende på hur man gör det. Jag har själv gjort ett program där man bland annat navigerar sig fram i en trädstruktur som representerar databasens innehåll. Där ställer jag separata sql-frågor för varje delnivå jag går in på. Alltså ingen sql-fråga som tar fram hela trädet på en gång. Även om något sådant skulle vara möjligt, är det knappast önskvärt. Vill man ha hela trädet på en gång, tar det tid att vänta på databasen. Frågar man efter en gren i taget, vartefter man navigerar fram i trädet, då går det däremot fort (åtminstone att få de delar som du just då efterfrågar), och de enkla sql-frågor du själv redan har kommit på, duger utmärkt.
Fast just i det här fallet vill man ju kunna visa hela trädet på en gång. Iallafall hela trädet av nivåer, kanske inte alla "items" under respektive kategori.
Du kan ju göra så att du skapar en fråga för att hämta ALLT, sorterar de med PHP och visar. När du sedan går in i en undermeny och bara vill plocka upp ett visst antal objekt så frågar du om...