Сохранение, организация и запрос продуктов, опций / тегов и категорий
Прежде всего, позвольте мне прояснить, что я не прошу никакого кода; Мне просто не нужны некоторые общие идеи / рекомендации / мнения о том, как я могу реализовать то, что я собираюсь спросить.
Я начинаю создавать систему электронной коммерции онлайн (Yii2 + MongoDB, так что PHP + NoSQL), и есть два требования, которые я не совсем уверен, как реализовать без создания огромного беспорядка в моем коде и база данных.
Оба реквизита связаны между собой, поэтому я объясню их как один.
Как любая другая серьезная электронная коммерция, у нее были бы категории. А также, как и любая другая серьезная электронная коммерция, каждый продукт будет иметьtags
или жеoptions
, Позвольте мне немного подробнее объяснить, что я называюtags
/options
.
Это доступные параметры, которые пользователь может выбрать при покупке товара, например, цвет или размер, материал и т. Д.
категорииТам будет несколькоgeneral
категории, а также другие подкатегории. Например,Electronics
может быть общая категория и подкатегории будутComputers
а такжеSmart TVs
, Затем,Motherboards
а такжеRAM
может быть подкатегорииComputers
.
Это само по себе может быть легко сохранено в базе данных, но здесь возникает проблема:
Каждый продукт должен отображаться при перечислении любой из категорий, к которым он относится, или верхних категорий. Это означает, что если я (как конечный пользователь) просматриваю все элементы вComputers
категория, я должен увидетьNVIDIA GTX670
которая принадлежит подкатегорииGraphic cards
категорииComputers
.Я мог бы сохранить каждый продукт следующим образом:
{
_id: asdasfwetrw34tw34t245y45y,
name: "NVIDIA GTX670",
price: 99.50,
...
...
categories: [
"Electronics", //<-- just the ID of that group
"Computers", //<-- just the ID of that group
"Graphic cards" //<-- just the ID of that group
]
}
Но:
Я не уверен, насколько быстрым будет запрос для извлечения всех элементов определенной категории (и, конечно, элементов всех подкатегорий).Я не уверен, какие другие недостатки у этого метода, поэтому, пожалуйста, не стесняйтесь рекомендовать любую альтернативную схему для хранения этого.
2.Метки / опции
Вот где настоящая головная боль.
Каждый параметр может принадлежать 0 или более категориям и подкатегориям, поэтому категорияWoman fashion
может быть вариантыsize
а такжеcolor
, но категорияSunglasses
(подкатегорияWoman fashion
) мог иметь толькоcolor
или даже другой набор опций, полностью отличающийся отWoman fashion
.
Кроме того, значения внутри каждой опции (red
, green
, blue
вcolor
опция) может появиться в случайных категориях. ТакWoman fashion
будет иметь такие цвета, какStrawberry Red
а такжеTangerine
, в то время какCars
будет иметьCarbon
а такжеBlack metallic
.
Также будет несколько типов опций:
Полностью статичный (li, kesize
, который мог быть толькоS
или жеM
, но никогда не оба. В любом случае администратор не сможет написатьобычай размер, какKind of small
; он сможет просто выбрать то, что уже есть в базе данных).Статика, которая может объединяться (например,colors
что может бытьred
или жеgreen
или сочетание цветов, которые выбирает админ).Бесплатный вход (какdimensions
или жеweight
, в идеале это поля ввода и выпадающие значения для соединения. Например[10]
| (mg||kg|tons)
или же[20]
(cm|m|km|miles)
).
Я мог бы сохранить каждый вариант так:
{
option: "Color",
type: "Static with combinations"
values: [
{
value: "Red",
categories: [
"Sunglasses"
]
},
{
value: "Green",
categories: [
"Sunglasses",
"T-Shirts"
]
},
{
value: "Black metallic",
categories: [
"Cars"
]
}
],
categories: [
"Woman fashion", //<-- only the ID of this group
"Cars" //<-- only the ID of this group
]
}
Но я беспокоюсь о том, насколько большим может оказаться один вариант, когда существует 30 категорий, и каждое значение параметра должно отображаться в случайных категориях.
Кроме того, я просто не вижу этого достаточно чистым, но, возможно, это только я.
В любом случае, как и в предыдущем пункте, пожалуйста, не стесняйтесь предлагать что-нибудь, что может придумать, я буду очень признателен за любые отзывы, которые вы можете дать мне.