Salvando, organizando e consultando produtos, opções / tags e categorias

Antes de tudo, deixe-me esclarecer que não estou pedindo nenhum código; Apenas não quero idéias / orientações / opiniões gerais sobre como implementar o que estou prestes a perguntar.

Estou começando a criar um sistema de comércio eletrônico on-line (Yii2 + MongoDB, portanto, PHP + NoSQL), e existem dois requisitos que não tenho certeza de como implementar sem criar uma enorme bagunça no meu código e no base de dados.

Ambos os requisitos estão relacionados, então vou explicar os dois como um.

Como qualquer outro comércio eletrônico sério, ele teria categorias. E também, como qualquer outro comércio eletrônico sério, cada produto terátags ouoptions. Deixe-me explicar um pouco mais o que eu chamotags/options.

Essas são as opções disponíveis que um usuário pode selecionar ao comprar um produto, por exemplo, a cor ou o tamanho, o material etc.

Categorias

Haveria múltiplosgeneral categorias, bem como outras subcategorias. Por exemplo,Electronics poderia ser uma categoria geral e subcategorias seriamComputers eSmart TVs. Então,Motherboards eRAM podem ser subcategorias deComputers.

Isso por si só poderia ser facilmente armazenado em um banco de dados, mas aqui está o problema:

Cada produto deve aparecer ao listar qualquer uma das categorias às quais pertence ou as categorias superiores. Isso significa que se eu (como usuário final) procurar todos os itens emComputers categoria, eu deveria verNVIDIA GTX670 que pertence à subcategoriaGraphic cards da categoriaComputers.

Eu poderia salvar cada produto da seguinte maneira:

{
    _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
    ]
}

Mas:

Não sei com que rapidez seria uma consulta para recuperar todos os itens de uma determinada categoria (e, é claro, os itens de todas as subcategorias).Não tenho certeza de quais outros contras esse método teria; portanto, fique à vontade para recomendar qualquer esquema alternativo para armazenar isso.


2)Tags / opções

É aqui que está a verdadeira dor de cabeça.

Cada opção pode pertencer a 0 ou mais categorias e subcategorias, portanto a categoriaWoman fashion poderia ter as opçõessize ecolor, mas a categoriaSunglasses (subcategoria deWoman fashion) poderia ter apenascolor, ou mesmo outro conjunto de opções, completamente diferente deWoman fashion.

Além disso, os valores dentro de cada opção (red, green, blue nocolor opção) pode aparecer em categorias aleatórias. assimWoman fashion teria cores comoStrawberry Red eTangerine, enquantoCars teriaCarbon eBlack metallic.

Além disso, haveria vários tipos de opções:

Completamente estático (li, kesize, que poderia ser apenasS ouM, mas nunca os dois. De qualquer forma, o administrador não poderá escrever umpersonalizadas tamanho, comoKind of small; ele poderia apenas selecionar o que já está no banco de dados).Estática que pode combinar (comocolors, que poderia serred ougreenou uma combinação de cores escolhida pelo administrador).Entrada livre (comodimensions ouweight, idealmente, seriam campos de entrada e valores suspensos para se associar. Por exemplo[10] | (mg||kg|tons) ou[20] (cm|m|km|miles))


Eu poderia salvar cada opção assim:

{
    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
    ]
}

Mas estou preocupado com o tamanho de uma única opção, quando existem 30 categorias e cada valor da opção é definido para aparecer em categorias aleatórias.
Também não o vejo suficientemente limpo, mas talvez seja apenas eu.

De qualquer forma, como no ponto anterior, sinta-se à vontade para sugerir qualquer coisa que possa surgir. Agradecemos imensamente qualquer feedback que você possa me dar.

questionAnswers(1)

yourAnswerToTheQuestion