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.
CategoriasHaveria 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
ougreen
ou 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.