Jag brukar använda mig av följande struktur:
En tabell som heter tblOptionGroup som innehåller olika grupper av valmöjligheter, typ en som heter Färg, en som heter Storlek osv osv...
Denna tabell har dels ett internt namn och ett externt, eftersom många grupper blir snarlika. Så det kan se ut så här
tblOptionGroup
ID|IName____|EName|....
-----------------------------
01|FärgSkor__|Färg
02|FärgByxor_|Färg
Sedan har jag en tblOption som innehåller alla valmöjligheter.
tblOption
ID|Name|.....
-----------------------------
01|Röd
02|Grön
03|Gul
Sedan en tabell som kopplar ihop tblOptions med tblOptionsGroup, tblOptionGroup_Option
tblOptionGroup_Option
IDOptionGroup|IDOption|....
--------------------------------
01__________|01
01__________|02
02__________|01
Nu har jag 2 olika grouper som jag kan använda som Färg valmöjlighet.
Sedan har jag en tblArticle där artiklen ligger lagrad, och sedan en tblArticle_OptionGroup, så att man kan ha flera valmöjligheter till en article, typ färg och storlek.
tblArticle_OptionGroup
IDArticle|IDOptionGroup
---------------------------------------
01_____|01
01_____|02
Sedan måste varje Optionsval sparas ner i databasen så det matchar den article som man har köpt. Först lagras articlen i en tblOrderRow. Denna är kopplad med en tblOrderHeader (orkar inte visa den)
tblOrderRow
ID|IDArticle|Quantity|Price...
---------------------------------------
01|01____|1______|110.50
02|01____|3______|135.00
Till sist så har jag en tblOrderRow_Option som kopplar ihop en orderrad med de valmöjligheter som man har valt på artiklen
tblOrderRow_Option
IDOrderRow|IDOption
---------------------------------
01________|01
01________|02
02________|01
Det blir några tabeller, men ett total flexibelt system, du kan lägga till hur många valmöjligheter som helst, till hur många grupper, du kan sedan koppla hur många grupper du vill till en artikel och alla dina val kommer att sparas tillsammans med din orderinformation för just den artiklen. Mycket bättre blir det inte :)
Du kan sedan bygga ut dina tabeller, så man kan ha olika priser för olika valmöjligheter. Säg att färgen svart kostar 50 kr extra. inga problem, lägg till kolumnen Price i tblOption och i tabellen tblOrderRow_Option. Och du kan ta med den kostnad när du räknar ut total priset på produkten.
Sedan gör jag så att när en kund väljer att lägga till en vara i korgen så skrivs den direkt ner till tblOrderRow. Detta kräver att man kan koppla ihop just denna rad med kunden, samt även en lösning om kunden inte loggat in (då har man inget kundid :) ).
Sedan när kunden går till kassan, och skickar order, så läggs alla orderrows samman och en orderHeader rad skapas och läggs i tblOrderHeader.
Man kan ta bort alla "oköpta" varur i tblOrderRow om man vill, eller så använder man det som statistik, och gör analyser av köpbeteende och varför köpet inte genomfördes, osv osv...
- Magnus