Producten met veel specificaties, hoe bewaren?
Hieronder vind je het schema van een artikel met al haar specificaties. (er zijn er nog veel meer, maar ik heb dit voorbeeld beperkt). Mijn vraag is, hoe bewaar je dit artikel in een databank, en hoe bouw je dit html/javascript gewijs op tot een duidelijke bestelpagina?
Mijn idee is: een tabel met artikelen, en daaraan gekoppeld een tabel met artikelspecificaties. Deze data wordt dan opgehaald en in JSON formaat doorgegeven aan de JS in de pagina, die dan vervolgens alles mooi toont met de nodige drop-downs.
Kan ik van zo'n systeem ergens een voorbeeld vinden (code en DB-schema)?
Hopelijk ben ik duidelijk genoeg!
Groetjes,
Jan
Begin bij het begin, zet eerst eens je formulier op, met handmatig alle opties. Kijk of je daar uit komt. Dan kun je het later uitbreiden naar dynamisch ophalen en nog later verder.
Ook lijkt er een soort hierarchie (boomstructuur?) te zitten in de eigenschappen zelf.
Ook zou je kunnen denken aan een dynamische structuur, waarbij je de volgende opzet hebt:
tabel met standaard artikelinformatie (1)
tabel met eigenschappen (2)
tabel met waarden van eigenschappen per eigenschap (3)
koppeltabel tussen artikelen (1) die gelinkt worden aan specifieke waarden van eigenschappen (3)
Maar dat is misschien een schot te ver voor de boeg, simpelweg omdat we geen representatieve samples van concrete artikelen hebben.
Gewijzigd op 05/08/2017 00:43:59 door Ben van Velzen
== Uniek ID (foreign key)
== Artikelnummer (streepjescode?)
Tabel 2: kenmerken
== het ID van het artikel
== Datumtijd van toevoegen van kenmerk
== Naam van kenmerk (bijvoorbeeld: Naam, omschrijving, gewicht, prijs, aantal_op_voorraad)
== Inhoud van kenmerk (bijvoorbeeld: Cirkelzaag, "een ronde zaag", 1800, 36.33, 12
Dus een cirkelzaag van 1800 gram en 36,33 euro. En je hebt er 12.
Zo kan je ongelimiteerd aantal kenmerken toevoegen. Waaronder prijs (die kan wijzigen... je voegt gewoon een NIEUWE rij toe aan tabel Kenmerken, ID = 3847, Naam = "Prijs", Inhoud = "36,33"
Zo ook met breedte/gewicht/wattage/kleur/etc etc etc.
Voordelen: je kan prijswijzigingen bijhouden en een geschiedenis opbouwen.
Je zit niet met lege kolommen voor kenmerken maar komt er ook nooit te kort.
Bij meerdere
Gewijzigd op 07/08/2017 14:21:12 door Ben van Velzen
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
CREATE TABLE `productspecs` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`level` int(11) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`value` varchar(100) DEFAULT NULL,
`main_group_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
`price` float DEFAULT NULL,
PRIMARY KEY (`id`)
)
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`level` int(11) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`value` varchar(100) DEFAULT NULL,
`main_group_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
`price` float DEFAULT NULL,
PRIMARY KEY (`id`)
)
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
CREATE TABLE `products` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`description` varchar(100) DEFAULT NULL,
`category_id` int(11) DEFAULT NULL,
`info` text,
PRIMARY KEY (`id`)
)
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`description` varchar(100) DEFAULT NULL,
`category_id` int(11) DEFAULT NULL,
`info` text,
PRIMARY KEY (`id`)
)
Met deze structuur kan ik als volgt te werk gaan:
Het product: een fotoblok (foto gedrukt op een houten paneel)
Dit product krijgt in tabel 'products' bv ID 4, dan is dit de inhoud van tabel 'productspecs' voor dit artikel:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
INSERT INTO `productspecs` (`id`, `level`, `name`, `value`, `main_group_id`, `product_id`, `price`)
VALUES
(8, 1, 'Materiaal', 'Berkenplexhout 40mm', 0, 4, 0),
(9, 2, 'Formaat', '10 x 15 cm', 8, 4, 4.2),
(10, 2, 'Formaat', '15 x 15 cm', 8, 4, 6.29),
(11, 2, 'Formaat', '20 x 30 cm', 8, 4, 16.78),
(12, 2, 'Formaat', '30 x 40 cm', 8, 4, 33.57),
(13, 3, 'Whitewash', 'Ja', 9, 4, 1.5),
(14, 3, 'Whitewash', 'Nee', 9, 4, 0),
(15, 3, 'Whitewash', 'Ja', 10, 4, 2),
(16, 3, 'Whitewash', 'Nee', 10, 4, 0),
(17, 3, 'Whitewash', 'Ja', 11, 4, 2.5),
(18, 3, 'Whitewash', 'Nee', 11, 4, 0),
(19, 3, 'Whitewash', 'Ja', 12, 4, 4),
(20, 3, 'Whitewash', 'Nee', 12, 4, 0);
VALUES
(8, 1, 'Materiaal', 'Berkenplexhout 40mm', 0, 4, 0),
(9, 2, 'Formaat', '10 x 15 cm', 8, 4, 4.2),
(10, 2, 'Formaat', '15 x 15 cm', 8, 4, 6.29),
(11, 2, 'Formaat', '20 x 30 cm', 8, 4, 16.78),
(12, 2, 'Formaat', '30 x 40 cm', 8, 4, 33.57),
(13, 3, 'Whitewash', 'Ja', 9, 4, 1.5),
(14, 3, 'Whitewash', 'Nee', 9, 4, 0),
(15, 3, 'Whitewash', 'Ja', 10, 4, 2),
(16, 3, 'Whitewash', 'Nee', 10, 4, 0),
(17, 3, 'Whitewash', 'Ja', 11, 4, 2.5),
(18, 3, 'Whitewash', 'Nee', 11, 4, 0),
(19, 3, 'Whitewash', 'Ja', 12, 4, 4),
(20, 3, 'Whitewash', 'Nee', 12, 4, 0);
Veld 'main_group_id' verwijst dan naar de id in dezelfde tabel van de bovenliggende specificatie.
Veld 'level' duidt de stap aan.
Dus in dit voorbeeld beginnen we bij stap 1: Materiaal. Hier is er maar één keuze van materiaal na deze keuze wordt de volgende stap gekozen: Formaat. Hier keuze uit 4 formaten. Bij de formaten staan ook (voor de eerste keer) prijzen ingevuld. Dus bij keuze van een formaat wordt de prijs gekozen. De volgende stap is dan Whitewash. Afhankelijk van het gekozen formaat, is er een andere meerprijs (indien er JA gekozen wordt). Die prijs wordt dan bij opgeteld bij de vorige prijs.
Voor een eenvoudig product als dit, is dit perfect haalbaar, maar je ziet dat in dit voorbeeld de vraag 'whitewash' 8 keer terugkeert (afhankelijk van mogelijke antwoorden van de vorige stap), dus bij een meer gecompliceerd product komt vele specificaties steeds terug en wordt de tabel zeer groot.
Ik heb een ingewikkeld product geprobeerd, en zit ondertussen al aan 1600 records in de tabel en ik ben nog niet rond :-)
Daarom mijn vraag of dit op een andere manier te bewaren is in de databank.
Groetjes!
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
CREATE TABLE `productspecs` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`level` int(11) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`value` varchar(100) DEFAULT NULL,
`main_group_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
`price` float DEFAULT NULL,
PRIMARY KEY (`id`)
)
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`level` int(11) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`value` varchar(100) DEFAULT NULL,
`main_group_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
`price` float DEFAULT NULL,
PRIMARY KEY (`id`)
)
Je gebruikt voor level een INT(11), waarom zo groot? Als het om stappen gaat kun je volgens mij ook met TINYINT uit de voeten?
https://dev.mysql.com/doc/refman/5.7/en/integer-types.html
Daar kunnen 255 stappen in.
Dit is overigens ook voor je VARCHAR:
https://dev.mysql.com/doc/refman/5.7/en/char.html
Persoonlijk zou ik nog een aantal tabellen maken:
product_materials
product_size
product_finish
In deze tabellen komen dan ook weer unieke ID's aan elke regel.
In productspecs kun je deze dan koppelen aan de hand van de ID's. Zo kun je b.v. bepaalde keuze opties maken per product.
(Je zult dan de kolomnamen moeten aanpassen)
Als een extraatje nog: ik zou dimensies nooit (alleen) als tekst opslaan. Je hebt specificaties immers ook zodat je makkelijk kan zoeken. Je zou complete menustructuren kunnen bouwen op basis van wat je aan specificaties hebt.