Provozuji také e-shop. Zde je moje rada, jak implementovat funkce, které jste zmínil. Doufám, že to pomůže.
- Kategorie
Uspořádám je do ploché struktury, ve vašem případě by to bylo:
{_id: 1, name: "Electronics", parentId: 0, idPath: "/0/1/" ...}
{_id: 2, name: "Computers", parentId: 1, idPath: "/0/1/2/", ...}
{_id: 3, name: "Graphic Cards", parentId: 2, idPath: "/0/1/2/3/", ...}
A produkt nyní musí být pouze v kategoriích listů. Ve vašem případě:
{
_id: asdasfwetrw34tw34t245y45y,
name: "NVIDIA GTX670",
price: 99.50,
...
...
categoryIds: [3]
}
Produkt může být samozřejmě ve více kategoriích, takže categoryIds
zůstává pole. Tady je ta záludná část. Když uvedete Electronics
kategorie, všechny její podkategorie naleznete podle:
db.categories.find({idPath: /^\/0\/1/})
idPath
index zde funguje, takže to bude rychlé. když najdete všechny podkategorie, můžete snadno najít všechny produkty v nich (vytvořte index na categoryIds
z Product
kolekce).
Nebo můžete načíst všechny kategorie do paměti a vytvořit hashovací tabulku s klíčem->categoryId, hodnotou->[všechny podkategorie]. Vaše kategorie se obvykle nebudou často měnit a nebudete mít mnoho kategorií. Takže to bude v pořádku.
- Značky/možnosti
Za prvé si myslím, že s vaší kategorií není něco v pořádku. Women fashion
je něco obecného, měli byste dát svůj produkt do něčeho konkrétnějšího a také by tam měly být možnosti. Například může existovat kategorie coat
který má size
&color
, jiné než women fashion
. I když stále může být color
možnost v women fashion
protože je to společná vlastnost všech podkategorií.
Pokud se nad tím zamyslíte, proč jsou všechny podkategorie uspořádány do jedné nadřazené kategorie? protože mají něco společného. Tou společnou částí by měly být společné možnosti nadřazené kategorie. to znamená, že by měla existovat dědičnost mezi všemi nadřazenými kategoriemi a podkategoriemi. Například:
Poté coat
bude mít konečně 2 možnosti color
&size
. sun glasses
:color
&shape
. Když si prohlížíte women fashion
, existuje pouze 1 možnost color
. Filtruje také podkategorie, protože přebírají z women fashion
.
Pokud jde o hodnoty barev, můj nápad je použít pouze standardní barvy Strawberry Red
je ve skutečnosti red
, Tangerine
je ve skutečnosti orange
. Opravdu nechcete, aby se zobrazovaly při filtrování produktů. Jinak by tu bylo příliš mnoho možností, což rozhodně není dobré pro uživatelský dojem.
Kromě color
možnost z kategorie, můj web má také něco, co se nazývá customizable options
. Tyto možnosti jsou definovány pouze na produktech. Nikdy se nezobrazí při prohlížení kategorie. Zde můžete mít Strawberry Red
&Tangerine
. Podle mého názoru se nejedná o „přirozené“ vlastnosti produktu. Používají se pouze k tomu, aby se uživatel cítil pohodlněji při prohlížení produktu. Proto také můžete mít možnost tohoto druhu jako Tangerine with figure
atd.
Ještě jedna věc k možnostem. možná budete chtít označit, které možnosti se mají použít pro filtrování produktů. Například color
je určitě jeden. Zatímco dimension
nemusí být.
O typech opcí. Tvoje jsou v pořádku, pokud ti to stačí. Mám mnohem více typů jako Number
, String
, Single Choice
, Multiple Choices
. Plánuji také implementovat Unit
. Záludná část Unit
je to například
1GB = 1024MB = 1024*1024B
Když tedy získáte pevný disk o kapacitě 1 GB a 1 TB, možná budete chtít před filtrováním produktů provést konverzi. Toto je mimo téma, vrátím se k vaší otázce.
Všimněte si, že ačkoli možnosti různých kategorií mají stejný název. Pravděpodobně nejsou totéž. Material
z Coat
a Furniture
jsou 2 různé věci. Takže mám tendenci definovat různé možnosti pro různé kategorie. Tudíž možná color
pro toys
a color
pro women fashion
. To není v rozporu s výše zmíněnou dědičností, protože od určité úrovně začínají podkategorie sdílet stejné možnosti. To zcela souvisí s tím, jak organizujete strukturu kategorií. A pokud chcete změnit strukturu kategorií nebo přesunout produkty, bylo by to bolestivé. Při definování kategorií buďte opatrní.
To je vše, co mě napadá. Obávám se, že nejsem rodilý mluvčí angličtiny, takže některé části mé odpovědi mohou být těžko srozumitelné. Neváhejte a dejte mi vědět.