Ik ben bezig met een website voor een online winkel
Je hebt er te maken met categorieen (bijvoorbeeld sport), subcategorieen (bijvoorbeeld voetbal) en subsubcategorieen (voetbalschoenen). Nu heb ik voor zowel categorieen, subcategorieen en subsubcategorieen een aparte tabel gemaakt. Om onderstaande gegevens te krijgen moet ik dus een JOIN doen op de 3 tabellen. Nu kreeg ik van iemand te horen dat het beter is als ik deze categorieen gewoon allemaal in dezelfde tabel plaats. Kan iemand mij vertellen of dit klopt en of dit dan ook beter is?

SPORT (categorie)

Voetbal (subcategorie)
Voetbalschoenen (subsubcategorie)
Voetbaltassen (subsubcategorie)
Voetballen (subsubcategorie)

Tennis (subcategorie)
Tennisschoenen (subsubcategorie)
Tennisballen (subsubcategorie)
etc




Wat denk ik efficienter zou zijn is je datamodel wijzigen. en bij elke veld een "Subcategorie van" veld toevoegen

OF

Je maakt een table subcategorieen :

Table
Hoofd_categorie
sub_categorie


Met bovenstaand model kun je tot in oneindig (theoretisch) subcategorieen aanmaken.

Als ik iets meer ttijd heb kan ik hier wel even iets uitgebreider op in gaan maar dat heb ik nu even niet :)
Als je zeker weet dat je niet dieper wilt gaan dan de subsubcategorie, kun je het prima in aparte tabellen houden. Echter als jij bijvoorbeeld in de toekomst de voetbalschoenen nog wilt gaan onder verdelen in verschillende merken, wat dus en subsubsubcategorie zou worden, kom je met je huidige opzet in de problemen.

Je kunt ook 1 tabel gebruiken voor de categorieen waarin je een kolom 'parent' opneemt. In deze kolom geef je aan wat de bovenliggende categorie van een bepaalde categorie is. Als je te maken hebt met een hoofdcategorie (en er dus geen bovenliggende categorieen zijn) vul je 0 in.

De opzet is dan:

categorieen
--------------
id
naam
parent

ps. @Jacco: dan dus liever 1 tabel voor alle categorieen ;)
Blanche: 'In principe' komen er niet subsubsubcategorieen. Maar ja, zeker weten doe je dat denk nooit. ;-) Ik vind de keuze toch erg lastig. Ik ben namelijk zelf het meest bekend met 3 aparte tabellen en vrees dat ik dat van die parent (nog) te moeilijk is voor mij. Kan het ook veel in de performance schelen? Ik neem aan dat je een veel kortere query krijgt als je het doet met alles in 1 tabel waardoor de performance ook veel beter is?
Ook bij het gebruik van 3 aparte tabellen kun je prima alles in 1 query uitvoeren. Persoonlijk zou ik gaan voor de oplossing die ik gaf, die geeft je later namelijk iets meer bewegingsvrijheid.
Je kunt het wel in 1 query uitvoeren, maar je krijgt wel meerdere joins. Een query zonder joins lijkt mij een stuk sneller of zie ik dat verkeerd?

Zou je misschien een beetje uit kunnen leggen hoe jouw manier dan werkt? Ik heb namelijk geen idee hoe je dan bijvoorbeeld zo'n overzicht kan krijgen als dat ik in mijn 1ste post gaf.
Zo'n overzicht kun je niet eenvoudig met een sql query krijgen, hier komt ook altijd nog een stuk php aan te pas. Dit komt omdat je zo'n overzicht nooit op zo'n manier uit de database kunt trekken.

Om zo'n overzicht te genereren zou je bijvoorbeeld alle records uit je tabel op kunnen halen. Als je sorteert op 'parent' krijg je een lijstje met onder elkaar de hoofdcategorieen, subcategorieen en subsubcategorieen:

+----+----------+--------+
| id | label    | parent |
+----+----------+--------+
| 1  | sport    | 0      |
| 2  | voetbal  | 1      |
| 5  | tennis   | 1      |
| 9  | hockey   | 1      |
| 3  | schoenen | 2      |
| 4  | tassen   | 2      |
| 6  | ballen   | 5      |
| 7  | shirts   | 5      |
| 8  | rackets  | 5      |
+----+----------+--------+

Vervolgens zou je met PHP het lijstje moeten genereren.

Stel nu dat je bijvoorbeeld alle subcategorieen van de categorie voetbal zou willen ophalen en je weet niet welk id die categorie heeft. Dan doe je het volgende:

SELECT *
FROM categorieen
WHERE parent = (
    SELECT id
    FROM categorieen
    WHERE label = 'voetbal' )


Dit zou je bijvoorbeeld kunnen doen op de pagina waar je alle voetbal categorieen laat zien. Het grote voordeel van dit systeem is dat al je (sub)categorieen een uniek id hebben en je straks in je artikelen tabel dus altijd een uniek ID op kunt geven.

Ik kan me namelijk zomaar voorstellen dat er zowel artikelen in de subsubcategorie voetbalschoenen komen maar ook in de subcategorie voetbal. Dit is op deze manier geen probleem.
Bedankt voor de duidelijke uitleg! Ik wil het dan met een $_GET doen, maar ik neem aan dat dat ook geen probleem is dan.

Alleen nog 1 vraagje wat de query betreft. Kun je dan niet gewoon het volgende doen?
SELECT *
FROM categorieen
WHERE parent = 2
Ja, als je het id weet natuurlijk wel ;)
Haha oke! Bedankt voor je hulp. Ik kan er helaas pas vanavond mee aan de slag. Als ik problemen heb hoor je nog van me. ;-)

Reageren