webForumDet fria alternativet

Hemarbete: Oändligt antal nästlade nivåer...?

Databaser & SQL

4 svar · 345 visningar · startad av Mungo

Medlem sedan jan. 2000372 inlägg
Frågan#1

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!

//Måns

Medlem sedan maj 20018 027 inlägg
#2

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.

Medlem sedan jan. 2000372 inlägg
#3

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.

Medlem sedan apr. 2002830 inlägg
#4

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...

// Nippe

Medlem sedan apr. 20007 588 inlägg
#5

Flyttad från PHP

259 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)