Toon posts:

[Database] Opbouw database vergelijkingssite met huismerken

Pagina: 1
Acties:

Anoniem: 271390

Topicstarter
Ik ben bezig met een vergelijkingssite waarop je de prijzen van verschillende sites kan vergelijken. In deze vergelijker wil ik ook huismerken met elkaar vergelijken. Ik vraag me af hoe ik dat in de database het best op kan lossen.

Twee voorbeelden van producten: "Huismerk tandpasta" en "Prodent Coolmint tandpasta". In de achtergrond is de prodent tandpasta bij alle winkels gelijk aan elkaar, maar de huismerk tandpasta is het per winkel anders, wel kunnen 2 winkels hetzelfde huismerk product gebruiken en kan 1 winkel meerdere huismerken hebben.

Zie voorbeeld hieronder:

Prodent Coolmint tandpastaHuismerk tandpasta
KruidvatProdent Coolmint tandpastaKruidvat tandpasta
EtosProdent Coolmint tandpastaEtos tandpasta
Dirx drogistProdent Coolmint tandpastaPerfekt merk tandpasta
Plus drogistProdent Coolmint tandpastaPerfekt merk tandpasta & plus tandpasta


Wat is de beste manier om dit in de database op te lossen zonder dubbele gegevens op te slaan?

De oplossing die ik nu voor me zie:

Eén tabel met producten die optioneel een 'parent_product_id' kunnen hebben. Zowel "Kruidvat tandpasta" als "Huismerk tandpasta" is dan een product. Op een listing pagina zorg ik er dan voor dat alleen producten zonder parent getoond worden. In een tabel prices wordt dan de actuele prijs van een winkel opgeslagen.

Products
id
name
size
weight
...
parent_id (default null)

Prices
product_id
shop_id
price

Dit heeft volgens mij een paar nadelen:
  • De huismerkproducten hebben nu veel lege velden in de producten database (een huismerk product heeft geen size, gewicht, etc.)
  • Het ophalen van de laagste prijs van 'huismerk tandpasta' levert nu een lastige query op. Helemaal op een listing pagina's kan ik me voorstellen dat dit erg zwaar gaat worden.
Is er een betere manier om dit op te bouwen?

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Het lijkt me dat het wel mogelijk zou moeten zijn om size/weight op te slaan van huismerkproducten. Die zou ik dus niet uit je datamodel gooien.

Op zich is het koppelen aan een eigen tabel (als je de diepte weet, en voor zover ik begrijp is die altijd maximaal 1) niet zo'n probleem.

SQL:
1
2
3
SELECT * FROM products AS merk 
LEFT JOIN products AS huismerk ON merk.id = huismerk.parent_id
WHERE merk.parent_id is null


Maar je kunt het uiteraard ook oplossen met een koppelingstabel, dan kun je in elk geval makkkelijker many-to-many koppelingen maken (huismerk naar prodent en huismerk naar colgate). Dat is dan simple een

related_products
merk_product_id
huismerk_product_id

C'est tout :) (Naamgeving is niet helemaal ideaal vind ik, vanwege mix nederlands en engels oa, maar daar mag je zelf iets op verzinnen :) )

Never explain with stupidity where malice is a better explanation


Anoniem: 271390

Topicstarter
Duidelijk, dankje!

Eén vraag: Hoezo kan ik de weight van het product 'huismerk product' ook invullen? Dit is toch een fictief product? Zie hieronder waarbij tabel is ingevuld.

Tabel products:
idtitleweightparent_id
1Prodent Coolmint tandpasta50gr.(null)
2Huismerk tandpasta(null)(null)
3Kruidvat tandpasta50gr.2
4Etos tandpasta60gr.2
5Perfekt merk tandpasta25gr.2
6plus tandpasta60gr.2


Misschien is een extra many-to-many koppeltabel i.d.d. toch handig, want in sommige gevallen kan je bij een huismerk product als fallback een merkproduct tonen (stel kruidvat heeft geen huismerk, maar wel prodent, dan zou je voor kruidvat de prodent kunnen gebruiken).

  • Sgreehder
  • Registratie: Juni 2004
  • Laatst online: 28-03 09:47
Ik zou alles flink normaliseren:

winkels
- id
- naam

producten
- id
...
- categorie_id
- naam
- huismerk = tinyint(1) 0 = nee, 1 = ja

categorieën
- id
- naam

winkel_producten
- winkel_id
- product_id

index op beide velden uiteraard

Eventueel kun je het 'categorie_id' veld uit de producten-tabel kunnen vervangen voor een koppeltabel tussen product en categorieën, maar dat lijkt me in deze context overbodig.

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Hopie83, ik snap de vraag niet helemaal denk ik, waarom zou je geen weight kunnen invullen? En waarom zou je 'huismerk' als apart product opnemen met parent is null, ipv de specifieke huismerken als losse producten?

Daarnaast, als je ook onderling gaat combineren, kun je wellicht beter voor categorieen gaan ipv voor producten. Maar dan wordt het vermoedelijk wel snel complex. (Want dan wil je wellicht een taxonomie tandpasta > mint > coolmint, waarbij je op elk van die niveau's kunt vergelijken tussen alle merk- en alle huisproducten.)

Ik krijg het gevoel dat je voorbeeld iets beperkter is dan wat je uiteindelijk werkelijk wilt - wat voor soort vergelijkingen zou je allemaal willen maken? Het alternatief is overigens om helemaal geen relatie op te nemen, en gewoon de prices-tabel te gebruiken. Dan kun je gewoon listen welke tandpasta's er allemaal zijn bij de Etos ofzo.

Never explain with stupidity where malice is a better explanation


Anoniem: 271390

Topicstarter
@Incaz: Ik neem 'huismerk' als apart product op omdat ik daar gedeeltelijk ook productgegevens voor heb: product titel en afbeelding. In de listing heet een dergelijk product de ene keer bijvoorbeeld 'huismerk tandpasta' en de andere keer 'huismerk tandpasta gevoelige tanden'.

Op een listing page toon ik dan (in dit voorbeeld) in de categorie tandpasta:
  • Prodent Coolmint tandpasta
  • Huismerk tandpasta
  • Huismerk tandpasta voor gevoelige tanden
Op de detail pagina's toon ik bij een 'normaal' product de prijzen in de verschillende winkels. Op een detail pagina voor 'huismerk tandpasta' toon ik de subproducten (bijv. Kruidvat tandpasta) met daarbij de prijzen in de verschillende winkels.

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Het lijkt me heel vreemd om huismerk als generiek product te zien - 'huismerk' is eerder een soort categorie, en kruidvat tandpasta is geen subproduct van 'huismerk' maar een zelfstandig product. Dat is ook wel duidelijk als je bedenkt welke afbeelding je zou tonen: als je bv kruidvat tandpasta en etos tandpasta hebt, dan zal je 'huismerk'-plaatje bij een van beide niet van toepassing zijn. Het plaatje is een eigenschap van een individueel product, net als volledige naam, gewicht/grootte (daar kun je over twisten, maar het makkelijkst is om elk verpakkingsformaat als apart product te beschouwen).
En prodent bij kruidvat en prodent bij Etos zijn hetzelfde (behalve de prijs wellicht), maar huismerk Kruidvat kan anders smaken, andere ingredienten hebben etc, waardoor sommige mensen die het ene huismerk waarderen, een ander huismerk niet willen gebruiken.

Ik denk dus dat je je voorbeelden wat verder uit moet werken (voor jezelf ook vooral) met meer merken, meer shops, en precies welke producten je dan wilt zien. Als je dat helderder hebt, volgt de datahierarchie meestal vanzelf.

Never explain with stupidity where malice is a better explanation


Anoniem: 271390

Topicstarter
Haha, je hebt gelijk dat het vreemd is om een huismerk als generiek product te zien, maar dat gaan we wel doen. Je krijgt (zoals jij ook al zegt) nooit een helemaal eerlijke vergelijking omdat de smaak van het ene huismerk afwijkt van de smaak van het andere, maar je kunt zo wel in grote lijnen de prijs van huirmerken vergelijken met de prijs van gewone merken.

Dat is vooral interessant als je vervolgens hele winkels met elkaar wilt vergelijken. Het lijstje met producten van winkel x is goedkoper / duurder dan bij winkel y. Misschien niet voor de consument interessant, maar wel voor algemene statistieken.

Is het verstandig de database in dat geval anders op te bouwen?

  • itons
  • Registratie: Oktober 2003
  • Niet online
Sgreehder schreef op vrijdag 18 juli 2014 @ 13:11:
Ik zou alles flink normaliseren:
*knip knip*
producten
- id
...
- categorie_id
- naam
- huismerk = tinyint(1) 0 = nee, 1 = ja
Ik zou bovenstaande doen en dan nog een merk tabel toevoegen:

merk
- id
- naam

en dan bij je [b]product[b]
- merk_id

Je krijgt dan een merk Kruidvat (huismerk) en je koppelt dat merk aan je product via merk_id. Klaar is kees. Een huismerk is gewoon merk immers.

Anoniem: 613450

Modbreak:Jij moet nodig Devschuurder werven? Gebruik Vraag & Aanbod! even doorlezen.

[Voor 85% gewijzigd door NMe op 10-08-2014 12:02]

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee