MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Enregistrer, organiser et interroger les produits, les options/tags et les catégories

Je gère également un site e-commerce. Voici mes conseils sur la façon dont j'implémente les fonctionnalités que vous avez mentionnées. J'espère que ça aide.

  • Catégories

Je les organise dans une structure plate, dans votre cas ce serait :

    {_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/", ...}

Et le produit doit maintenant être uniquement dans les catégories de feuilles. Dans votre cas :

    {
        _id: asdasfwetrw34tw34t245y45y,
        name: "NVIDIA GTX670",
        price: 99.50,
        ...
        ...
        categoryIds: [3]
    }

Le produit peut être dans plusieurs catégories bien sûr, donc les categoryIds reste un tableau. Voici la partie délicate. Lorsque vous répertoriez l'Electronics catégorie, vous pouvez trouver toutes ses sous-catégories par :

    db.categories.find({idPath: /^\/0\/1/})

idPath index fonctionne ici donc ça va être rapide. lorsque vous découvrez toutes les sous-catégories, vous pouvez facilement trouver tous les produits qu'elles contiennent (construisez l'index sur les categoryIds de Product collecte).

Ou bien, vous pouvez lire toutes les catégories en mémoire et créer une table de hachage avec la clé->categoryId, value->[all the subcategories]. Vos catégories ne changeront généralement pas fréquemment et vous n'aurez pas beaucoup de catégories. Donc tout ira bien.

  • Balises/Options

Tout d'abord, je pense qu'il y a quelque chose qui ne va pas avec votre catégorie. Women fashion est quelque chose de générique, vous devriez mettre votre produit dans quelque chose de plus spécifique, et les options devraient être là aussi. Par exemple, il peut y avoir une catégorie coat qui a la size &color , autre que women fashion . Bien qu'il puisse encore y avoir de la color option en women fashion car c'est une caractéristique commune à toutes les sous-catégories.
Si vous y réfléchissez, pourquoi toutes les sous-catégories sont organisées dans une seule catégorie parent ? parce qu'ils ont quelque chose en commun. Cette partie commune devrait être les options communes de la catégorie parent. c'est-à-dire qu'il doit y avoir un héritage entre toutes les catégories et sous-catégories parentes. Par exemple :

Puis coat aurait finalement 2 options color &size . sun glasses :color &shape . Lorsque vous regardez women fashion , il n'y a qu'une seule option color . Il filtre également les sous-catégories car elles héritent de la women fashion .
En ce qui concerne les valeurs de couleur, mon idée est de n'utiliser que les couleurs standard Strawberry Red est en fait red , Tangerine est en fait orange . Vous ne voulez pas vraiment qu'ils apparaissent lorsque vous filtrez les produits. Sinon, il y aurait trop d'options, certainement pas bonnes pour l'expérience utilisateur.
Cependant, en plus de la color option de la catégorie, mon site a aussi quelque chose appelé customizable options . Ces options ne sont définies que sur les produits. Ils n'apparaissent jamais lorsque vous visualisez la catégorie. Ici, vous pouvez avoir Strawberry Red &Tangerine . À mon avis, ce ne sont pas des propriétés « naturelles » d'un produit. Ils sont uniquement utilisés pour que l'utilisateur se sente plus à l'aise lors de la visualisation du produit. Ainsi, vous pouvez également avoir une option de ce type comme Tangerine with figure etc.
Encore une chose à propos des options. vous voudrez peut-être marquer les options censées être utilisées pour filtrer les produits. Par exemple color est certainement un. Tandis que dimension peut-être pas.

À propos des types d'options. Les vôtres vont bien si cela vous suffit. J'ai beaucoup plus de types comme Number , String , Single Choice , Multiple Choices . Je prévois également d'implémenter l'Unit . Partie délicate de Unit est-ce par exemple

1GB = 1024MB = 1024*1024B

Ainsi, lorsque vous obtenez un disque dur de 1 Go et 1 To, vous voudrez peut-être faire une conversion avant de filtrer les produits. C'est hors sujet, je reviens à votre question.

Notez que bien que les options des différentes catégories portent le même nom. Ce n'est probablement pas la même chose. Material de Coat et Furniture sont 2 choses différentes. J'ai donc tendance à définir différentes options pour différentes catégories. Ainsi il peut y avoir color pour les toys , et color pour la women fashion . Cela n'entre pas en conflit avec l'héritage mentionné ci-dessus car à partir d'un certain niveau, les sous-catégories commencent à partager les mêmes options. Ceci est entièrement lié à la façon dont vous organisez votre structure de catégories. Et si vous souhaitez modifier la structure des catégories ou déplacer des produits à un moment donné, ce serait pénible. Soyez donc prudent lorsque vous définissez vos catégories.

C'est tout ce qui me vient à l'esprit. J'ai bien peur de ne pas être de langue maternelle anglaise, vous pourriez donc trouver une partie de ma réponse difficile à comprendre. N'hésitez pas à me le faire savoir.