U variantov produktov je problem napriklad ako ukladat cenu daneho variantu produktu.
Povedzme ze mame produkt tricko (base price 10€) s atributmi: velkost (s, m, l, xl), farba (green, blue, red) a potlac (ano, nie), pricom niektore atributy nam mozu ovplyvnovat aj zakladnu cenu (velkost XL +5€, farba blue +5€, potlac ano +10€). Takze mame dokopy 24 moznych kombinacii s roznou vyslednou cenou:
s, green, ano(+10) = 20€
s, green, nie = 10€
s, blue(+5), ano(+10) = 25€
s, blue(+5), nie = 15€
s, red, ano(+10) = 20€
s, red, nie = 10€
m, green, ano(+10) = 20€
m, green, nie = 10€
m, blue(+5), ano(+10) = 25€
m, blue(+5), nie = 15€
m, red, ano(+10) = 20€
m, red, nie = 10€
l, green, ano(+10) = 20€
l, green, nie = 10€
l, blue(+5), ano(+10) = 25€
l, blue(+5), nie = 15€
l, red, ano(+10) = 20€
l, red, nie = 10€
xl(+5), green, ano(+10) = 25€
xl(+5), green, nie = 15€
xl(+5), blue(+5), ano(+10) = 30€
xl(+5), blue(+5), nie = 20€
xl(+5), red, ano(+10) = 25€
xl(+5), red, nie = 15€
Ak varianty priradujeme k produktu naivne, napriklad takouto tabulkou ProductVariants:
FK product_id: 123 (->tricko)
FK attribute_id: 456 (->velkost)
FK atribute_value: 789 (->XL)
price: +5
tak mame minimalne 2 problemy:
1. nevieme pokryt vsetky mozne kombinacie cien, ale len tychto 24. Ak nejakej hodnote atributu priradime cenu (potlac ano = +10€) tak sa objavi vo vsetkych kombinaciach kde atribut vystupuje. Lenze marketing bude chciet pre kombinaciu atributov potlac s modrou farbou (lubovolna velkost) len +5€ miesto +10€ za potlac, pretoze potlac na modru farbu je lacnejsia ako na ine...
2. Aku cenu zobrazovat v product listingu ked si user prechadza kategorie? Logicky najmensiu, ale nemozeme tam dat automaticky cenu base produktu (10€) pretoze ak produkt ma iba take atributy ktore zvysuju cenu tak najnizsia cena nemusi byt rovnaka ako cena base produktu. Za toto pokutuje napriklad Google ak chcete byt v nejakych jeho feedoch. Musite zobrazovat cenu za aku si to moze zakaznik kupit. Urobit SQL na product listing ktory dynamycky prepocitava ceny podla atributov a vybera najnizsiu (+ rozne ine filtre ktore si user moze naklikat) je pre SQL masiny nemozne v relanom case s realnymi resourcami. Nam to davalo cca 10-30 sekund na request.
3. Su mozne este vylepsenia ze nejaky atribut moze cenu aj znizovat...
Alebo mozeme tieto vsetky mozne kombinacie atributov ukladat zvlast pod vlastnym ID a pokladat to za samostanty produkt, takze miesto jedneho tricko produktu budeme mat max 24 produktov. To je fajn pretoze mame volnost nastavovat lubovolnej kombinacii atributov lubolne ceny. Ak nejaka kombinacia atributov nedava zmysel tak ju neuvedieme (tricko velkosti S s lubovolnou farbou nevieme vyrobit s potlacou lebo sa nam nezmesti na plochu tricka) takze budeme mat menej zaznamov (24 - 3 = 21). SQLka su jednoduchsie, na ukor duplikacie dat v DB. Ale mame aj problemy:
1. Narastie pocet zaznamov v DB. A moze aj extremne. U zlozitych produktov s vela atributmi, pricom tie atributy mozu mat vela roznych hodnot mozeme dostat az milion kombinacii pre jeden produkt. Co ked mame takychto produktov vela?
2. Zlozitejsia administracia. Editor musi vediet nastavit davkovo ceny pre rozne kombinacie atributov, pretoze nechce zadavat manualne vsetky kombinacie, ale zas musi vediet nastavit ked chce aj lubovolnu moznu kombinaciu. OK, u toho tricka s max 24 kombinaciami mozeme zobrazit maticu input boxov ale co ten produkt s milion kombinaciami?
Okrem ceny sa samozrejme k jednotlivym variantom ukladaju aj ine udaje, napr. skladove zasoby. Modrych triciek velkosti XL mam na sklade ine mnozstvo ako cervenych L. Musim vediet vypinat docasne niektore kombinacie atributov,...
Ak vysledkom ma byt tzv faceted search tak by som zvazil pouzit kombinaciu SQL DB + ElasticSearch/Solr. Pri administracii zapisujem do SQL a potom synchronizujem do ES. ES je perfektny na product listing, ked si user filtruje podla roznych parametrov (product name obsahuje 'Adidas' (fulltext), velkost L, modra farba, cenova hladina 10-20€, kategoria 'Panske tricka', na sklade). S ElasticSearchom dostavame response v milisekundach.
EAV pouziva napr. Magento ale tiez maju tzv flatten tabulky, pretoze EAV je moc kosate a rozumny product listing nad tym neurobis. Plus samozrejme tiez tam ide pouzit NoSQL na zrychlenie.