PHP/MySQL - Kategorisystem
Tjena!
Har ett problem vi brottats med ett tag nu. Det är ganska omfattande, så jag ska försöka göra det så kortfattat som möjligt.
Vi håller på med en hemsida där användare ska kunna välja sina kompetenser. Varje användare kan alltså ha flera kompetenser, och varje kompetens kan ha x antal kategorier - antalet kategorieroch levlar kan variera hos olika kompetenser.
De största kraven är enligt följande:
- Enkelt kunna lägga till/ta bort kompetenser och dess kategorier.
- Möjlighet att få fram alla huvudkategorier.
- Kunna få fram alla kategorier hos en kompetens.
- Kunna ha olika många levlar kategorier hos en kompetens.
- Enkelt att byta namn/plats etc. hos olika kompetenser.
Och så ska förstås systemet vara logiskt och inte ta mer prestanda än nödvändigt. Vi har tänkt igenom 3 olika metoder för att åstadkomma detta, och jag tänkte presentera den jag tycker är bäst.
Då har vi följande tabeller i databasen:
- users(id, username)
- competences(id, parent, name)
- list_competences(user_id, competence_id)
Och så tar vi lite exempeldata...
Olle har följande kompetenser:
Administration->Arbetsledning
Språk->Tolk->Polska
Filosofi
Pelle har följande kompetenser:
Hantverke->Snickeri
Språk->Tolk->Arabiska, Persiska
I det här fallet ser databasen kanske ut så här:
I tabellen competences ligger alltså själva kompetenserna som refereras till i list_competences. Kolumnen parent anger till vilken kategori kompetensen tillhör - om kompetensen inte tillhör till någon kategori eller är en huvudkategori så är detta satt till 0.
Så att lista alla huvudkategorier är inga konstigheter:
SELECT id, name FROM competences WHERE parent = 0;
Men hur gör jag för att lista huvudkategoriernas respektive underkategorier? Och hur listar jag upp användarnas kompetenser insorterat i sina kategorier? Det största problemet är som sagt att olika kompetenser kan ha olika många kategorier/levlar.
Kanske det går att skapa en MySQL-funktion som loopar igenom kompetenserna?
Bara att säga till om något är oklart. Var inte blyg för att komma med tips!
Tack på förhand!