Сохранение, организация и запрос продуктов, опций / тегов и категорий

Прежде всего, позвольте мне прояснить, что я не прошу никакого кода; Мне просто не нужны некоторые общие идеи / рекомендации / мнения о том, как я могу реализовать то, что я собираюсь спросить.

Я начинаю создавать систему электронной коммерции онлайн (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 категорий, и каждое значение параметра должно отображаться в случайных категориях.
Кроме того, я просто не вижу этого достаточно чистым, но, возможно, это только я.

В любом случае, как и в предыдущем пункте, пожалуйста, не стесняйтесь предлагать что-нибудь, что может придумать, я буду очень признателен за любые отзывы, которые вы можете дать мне.

Ответы на вопрос(1)

Ваш ответ на вопрос