[php/mysql] Datamodel voor productspecificaties

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bij mijn webwinkel wil ik bij elk product ook specificaties tonen. Ik vraag me echter af wat de beste manier is om dit te doen. Nu doe ik het als volgt:

Ik heb een eigenschappen tabel waarin ik alle eigenschappen in zet die een product kan hebben. Aangezien producten uit dezelfde categorie ook dezelfde eigenschappen hebben, heb ik deze dus gekoppeld aan de de tabel categorieen.

De waardes van deze eigenschappen zet ik in de tabel specificaties. Ik leg een link tussen de tabellen eigenschappen en specificaties door het id van eigenschappen op te nemen bij specificaties. Ook geef ik in deze tabel aan bij welk product een specificatie hoort.

Is dit nou een goede manier of kan ik het beter anders doen? Ik had het eigenlijk zo gedaan omdat het mij handig leek om de eigenschappen toe te wijzen aan een categorie, maar loop nu toch tegen wat 'problemen'. Zodra ik namelijk bijvoorbeeld nog geen specificaties heb toegewezen aan een product wordt er in principe niks weergeven en moet ik dus weer een heel andere query gaan uitvoeren waarbij ik de eigenschappen van de betreffende categorie opvraag. Als er dus zegmaar wel resultaten zijn haal ik ze op via de tabellen eigenschappen en specificaties en als er geen resultaten zijn haal ik ze op via eigenschappen en categorieen. Is dit niet vreemd en kan ik het dus niet beter gewoon steeds de eigenschappen toewijzen per product in plaats van eigenschappen toevoegen aan de categorie?

Mijn vraag is dus eigenlijk hoe ik het beste de productspecificaties kan opslaan in de database. Ik hoop dat ik mijn 'probleem' een beetje duidelijk heb uitgelegd en dat iemand een antwoord weet. :)


Mijn huidige database model:

CATEGORIEEN
id naam parent
1 Audio 0
2 Losse systemen 1
3 Speakers 1
4 Overige 1
5 Cd spelers 2
6 Dvd spelers 2
7 Mp3spelers 4


PRODUCTEN
id naam categorie_id
1 ipodnano8gb 7
2 nwx 2gb 7


EIGENSCHAPPEN
id naam parent categorie_id
1 Algemeen 0 7
2 Type opslag 1 7
3 Opslagcapaciteit 1 7


SPECIFICATIES
id waarde eigenschap_id product_id
1 Flash geheuegen 2 1
2 8GB 3 1

Acties:
  • 0 Henk 'm!

  • reddevil
  • Registratie: Februari 2001
  • Laatst online: 19-09 17:42
Eigenschappen van categoriën horen bij categoriën en dus niet bij producten tenzij ze productspecifiek zijn. Met outer joins kan je de benodigde informatie makkelijk ophalen.

Zoek meer informatie over normalisatie e.d. Dit is exact waar je vragen over hebt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb ook genormaliseerd. Ik ben hier echter nog niet heel ervaren in en weet dus niet zeker of het goed is.

In principe zijn het eigenschappen van een categorie, maar de waardes die deze eigenschappen krijgen (specificaties) zijn weer eigenschappen van een product.

De categorie mp3-spelers heeft bijvoorbeelde volgende eigenschappen:
Speelduur audio
Type batterij

Producten uit deze categorie hebben dus waardes op deze eigenschappen:
Speelduur audio (eigenschap categorie): 24 uur (waarde van het product)
Type batterij (eigenschap categorie): Li-Ion accu (waarde van het product)

Daarom heb ik nu dus de eigenschappen aan de categorieen verbonden, en de waardes van deze eigenschappen (specificaties) aan het product verbonden. Is dit dan dus goed of 'moet' het anders?

Het is nu namelijk zo dat als een product al specificaties heeft dat ik een query doe waarin ik de specificaties ophaal en een join doe op de eigenschappen tabel. Mocht het zo zijn dat het resultaat van die query 0 is, dan zijn er dus nog geen specificaties en haal ik met een query gewoon de eigenschappen op met de eigenschappen tabel. Ik werk hiervoor dus met een if constructie. Dit lijkt mij wat omslachtig of is dat niet zo? Is het bijvoorbeeld niet mogelijk dat ik gewoon bij beide eerst de eigenschappen ophaal en indien er ook al specificaties voor een product zijn ingevuld, deze dan vervolgens toon. Hierdoor zou ik niet met een if 'constructie' hoeven te werken.

Ik hoop dat je hier nog het antwoord op wilt geven.

Acties:
  • 0 Henk 'm!

  • reddevil
  • Registratie: Februari 2001
  • Laatst online: 19-09 17:42
Producten uit deze categorie hebben dus waardes op deze eigenschappen:
Speelduur audio (eigenschap categorie): 24 uur (waarde van het product)
Type batterij (eigenschap categorie): Li-Ion accu (waarde van het product)
Aan een mp3 speler hang je dus een speelduur en een type batterij.

Voor speelduur bepaal je de verschillende mogelijkheden die je in een tabel (bijvoorbeeld tabel 'speelduur') zet.
Voor de types bepaal je de verschillende mogelijkheden die je in een andere tabel (bijvoorbeeld 'batterijtype') zet.
Beide tabellen hebben een lijstje van id's met types, bijvoorbeeld:

SPEELDUUR
-------------------
11-2
2 2-4
3 4-8
4 8-12
5 12-24
6 24+

zoiets gelijk voor types.

Dan zet je in de tabel bij een mp3 speler zelf bij 'speelduur' dus niet '12-24' neer, maar '5'.

Om de waardes op te halen voor de mp3 speler kan je een outer join query doen. Als je query goed is krijg je niet '5' terug maar '12-24'.

Je kan dan ook eventuele meerdere kolommen direct uit de tabel voor speelduur halen.

[ Voor 3% gewijzigd door reddevil op 19-02-2008 15:19 ]


Acties:
  • 0 Henk 'm!

  • Pul
  • Registratie: Februari 2008
  • Laatst online: 06-08 13:54

Pul

Met een beetje mazzel werkt het met deze query:

SELECT `s.waarde`, `e.naam`
FROM `eigenschappen` AS e
LEFT JOIN `specificaties` AS s
ON (
(`s.eigenschappen_id` = `e.id`)
AND
(`s.producten_id` = '13')
)
WHERE `e.categorie_id` =
(SELECT `categorie_id` FROM `producten` WHERE `id` = '13';);

laat me weten of het werkt :)

Acties:
  • 0 Henk 'm!

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 18-09 20:05
De meeste shop databases hebben sku's (stock keeping unit). Dat zijn de uiteindelijke producten met een bepaalde specificatie. Dus als het een product een sok is. Dan kan een sku een rode of gele sok zijn. Verder hebben ze gewoon alle eigenschappen van het product zelf.

Misschien handig om ook mee te nemen in je datamodel.

[ Voor 9% gewijzigd door paulh op 20-02-2008 19:40 ]

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]

Pagina: 1