Er is mij gevraagd om een webshop op te zetten en toen ik over nadacht groeide de lijst van mogelijke functionaliteiten al snel in het oneindig. Daarnaast heb je genoeg off-the-shelf producten, dus daar maken ze nu gebruik van. Echter tijdens het nadenken bleef ik vastzitten op het volgende: "hoe sla je producten in de database op?.
Het begint uiteraard simpel. Een product heeft een naam, omschrijving en prijs. Iedereen kan deze tabel wel dromen, maar een Intel processor kan een i5 of i7 core hebben. Ik kan geen core kolom opnemen, want daar heeft een fietsenwinkel niets aan. Dus, er moet een generiek ontwerp komen.
Enige tijd later kwam het volgende eruit:

Zo kan een computer winkel een core type als attribuut opnemen en een fietsenwinkel een bandgrootte of fiets kleur opnemen. Alle waardes worden in de koppeltabel opgeslagen.
Hiermee kun je veel meer mogelijkheden van producten aanbieden en relatief eenvoudig op deze waardes zoeken, maar hier zit ook direct een probleem. Core type en kleur kunnen in een string worden opgeslagen, maar bandgrootte kan best in een integer. In dit ontwerp is het niet mogelijk om de BETWEEN functie te gebruiken.
Ontwerp 2:

Zelfde als hierboven kwa mogelijkheden, maar nu heeft de koppeltabel verschillende kolommen gekregen voor de verschillende datatypes.
Ik vind het niet echt een prachtige oplossing, maar het biedt wel weer meer mogelijkheden. Andere oplossingen die ik ook nog heb gezien is: per datatype een waarde tabel. Dit vind ik een Join nachtmerrie, dus dat is niet.
Over joins gesproken. Wanneer ik nu een product wil ophalen moet ik querien over drie tabellen. Het mooiste zijn als je een heel product met één select er uit kan trekken, zonder joins. Een idee is nog om het product in zijn geheel als JSON string op te slaan binnen de product tabel. Zo hoef je alleen joins te te passen in de zoekmachine.
Waarom geen tabel per product? 'Fysiek' wordt er een database tabel aangemaakt welke zo wordt gemodellerd zoals de gebruiker aangeeft. Voordeel is dat de tabel precies aansluit bij de wensen van de gebruiker. Nadeel is dat het systeem nooit kan weten welke tabel hij moet benaderen, dus je zal metadata moeten opslaan. Daarnaast is zoeken over kleding welke rood ook praktisch onmogelijk. Of je moet lelijke union queries gaan schrijven.
Metadata ontkom je dus niet aan, maar een hybride vorm van database tabel per product en metadata tabellen vond ik opzich wel een leuke oplossing. De data wordt dan wel dubbel opgeslagen, maar ruimte is niet echt het grootste probleem tegenwoordig.
Echter nu heb ik alleen nog maar naar attributen gekeken, als je product varianten gaat opnemen dan wordt het een ander spel. Bijvoorbeeld: http://stackoverflow.com/...ariants/24941744#24941744
Aantal tabellen en een aantal relaties. Ik vind het een mooi ontwerp wat je veel ruimte geeft, echter de joins....
Daarnaast is hier ook weer sprake van het data type probleem dat eerder is beschreven.
Conclusie: er moeten keuzes worden gemaakt.
Persoonlijk vond ik de hybride optie tussen een generiek datamodel en product tabellen wel een leuke oplossing. Meer omdat het systeem zelf alles dan aan zal maken en inregelt. Tevens tijdens het zoeken op product attributen heb je het voordeel dat je alleen naar dat product kijkt en dan de voordelen van een datatabel kan gebruiken. Kwa snelheid zie ik hier voordelen. Zoals eerder aangegeven zoeken naar meerdere producten zie ik weer nadelen, maar daar kan het generieke model hulp bieden.
Ik ben wel benieuwd naar wat jullie denken en andere gedachten. Geheid dat ik datamodel patronen niet ken en misschien wel mogelijkheden bieden. Het is in ieder geval een leuk gedachtenpuzzel om in de file over na te denken
Het begint uiteraard simpel. Een product heeft een naam, omschrijving en prijs. Iedereen kan deze tabel wel dromen, maar een Intel processor kan een i5 of i7 core hebben. Ik kan geen core kolom opnemen, want daar heeft een fietsenwinkel niets aan. Dus, er moet een generiek ontwerp komen.
Enige tijd later kwam het volgende eruit:

Zo kan een computer winkel een core type als attribuut opnemen en een fietsenwinkel een bandgrootte of fiets kleur opnemen. Alle waardes worden in de koppeltabel opgeslagen.
Hiermee kun je veel meer mogelijkheden van producten aanbieden en relatief eenvoudig op deze waardes zoeken, maar hier zit ook direct een probleem. Core type en kleur kunnen in een string worden opgeslagen, maar bandgrootte kan best in een integer. In dit ontwerp is het niet mogelijk om de BETWEEN functie te gebruiken.
Ontwerp 2:

Zelfde als hierboven kwa mogelijkheden, maar nu heeft de koppeltabel verschillende kolommen gekregen voor de verschillende datatypes.
Ik vind het niet echt een prachtige oplossing, maar het biedt wel weer meer mogelijkheden. Andere oplossingen die ik ook nog heb gezien is: per datatype een waarde tabel. Dit vind ik een Join nachtmerrie, dus dat is niet.
Over joins gesproken. Wanneer ik nu een product wil ophalen moet ik querien over drie tabellen. Het mooiste zijn als je een heel product met één select er uit kan trekken, zonder joins. Een idee is nog om het product in zijn geheel als JSON string op te slaan binnen de product tabel. Zo hoef je alleen joins te te passen in de zoekmachine.
Waarom geen tabel per product? 'Fysiek' wordt er een database tabel aangemaakt welke zo wordt gemodellerd zoals de gebruiker aangeeft. Voordeel is dat de tabel precies aansluit bij de wensen van de gebruiker. Nadeel is dat het systeem nooit kan weten welke tabel hij moet benaderen, dus je zal metadata moeten opslaan. Daarnaast is zoeken over kleding welke rood ook praktisch onmogelijk. Of je moet lelijke union queries gaan schrijven.
Metadata ontkom je dus niet aan, maar een hybride vorm van database tabel per product en metadata tabellen vond ik opzich wel een leuke oplossing. De data wordt dan wel dubbel opgeslagen, maar ruimte is niet echt het grootste probleem tegenwoordig.
Echter nu heb ik alleen nog maar naar attributen gekeken, als je product varianten gaat opnemen dan wordt het een ander spel. Bijvoorbeeld: http://stackoverflow.com/...ariants/24941744#24941744
Aantal tabellen en een aantal relaties. Ik vind het een mooi ontwerp wat je veel ruimte geeft, echter de joins....
Daarnaast is hier ook weer sprake van het data type probleem dat eerder is beschreven.
Conclusie: er moeten keuzes worden gemaakt.
Persoonlijk vond ik de hybride optie tussen een generiek datamodel en product tabellen wel een leuke oplossing. Meer omdat het systeem zelf alles dan aan zal maken en inregelt. Tevens tijdens het zoeken op product attributen heb je het voordeel dat je alleen naar dat product kijkt en dan de voordelen van een datatabel kan gebruiken. Kwa snelheid zie ik hier voordelen. Zoals eerder aangegeven zoeken naar meerdere producten zie ik weer nadelen, maar daar kan het generieke model hulp bieden.
Ik ben wel benieuwd naar wat jullie denken en andere gedachten. Geheid dat ik datamodel patronen niet ken en misschien wel mogelijkheden bieden. Het is in ieder geval een leuk gedachtenpuzzel om in de file over na te denken