2009-04-02 5 views
8

Je construis une boutique en ligne pour vendre des produits comme "Green Extra-large, T-shirts". Par exemple, la même chemise peut avoir plusieurs tailles/couleurs, une combinaison différente peut être épuisée, une combinaison différente peut avoir des prix différents, etc.Comment modéliser des "produits" dans une application de magasin en ligne

Ma question est comment je devrais modéliser ces produits dans mon application Rails (ou vraiment comment le faire dans n'importe quelle application).

Ma pensée actuelle est la suivante:

Class Product 
    has_many :variants, :through => :characteristics 
    has_many :characteristics 
end 

Class Characteristic 
    belongs_to :product 
    belongs_to :variants 
end 

Class Variant 
    has_many :products, :through => :characteristics 
    belongs_to :characteristic 
end 

Ainsi, chaque produit aura une ou plusieurs caractéristiques (par exemple, « couleur », « Taille », etc.), et chaque caractéristique sera alors une ou plusieurs variantes (par exemple, "Rouge", "Bleu", etc.)

Le problème avec cette méthode est où puis-je stocker le prix et l'inventaire? Par exemple, le prix et l'inventaire d'un produit donné sont déterminés par les variantes que prennent ses caractéristiques. (Le vert pourrait être plus cher que le rouge, le gros pourrait être en rupture de stock, etc.). Une idée que j'ai eu était de donner aux produits un «prix de base», et de laisser les variantes le modifier, mais cela semble trop complexe (et pourrait ne pas fonctionner).

Répondre

13

J'ai vu deux solutions à ce genre de dilemme. Le premier est d'essayer d'utiliser des caractéristiques pour définir des produits subordonnés au produit "principal". Le défi ici est que, en plus de vos pensées pour loin, dans la plupart des cas, le produit évoluera avec de nouveaux fabricants qui apportent de nouveaux aspects à la table. Par exemple, un fabricant peut fabriquer un produit moins cher, mais avoir une méthode d'application différente pour le logo ou la couture qui peut être suffisamment importante pour suivre. Je pense que le fait de porter un numéro de produit non significatif pour chaque produit, puis d'attacher les caractéristiques en tant qu'attributs, donne les meilleurs résultats. Il est facilement recherché et extensible. Si un groupe de produits est fortement lié, un groupe de produits auquel les produits individuels s'attachent fonctionne bien.

Dans les tableaux:

  ProductGroup 
      -------------------- 
      ProductGroupID 
      ProductGroupName 
      ProductGroupDescription 

      Product 
      -------------------- 
      ProductID 
      ProductGroupID 
      QtyOnHand 
      BasePrice 
      ProductColorID 
      ProductSizeID 

      ProductColor 
      ------------ 
      ProductColorID 
      ProductColorName 

      ProductSize 
      -------------- 
      ProductSizeID 
      ProductSizeName 

      ...more attributes... 

Les avantages ici sont que vous pouvez facilement interroger des attributs spécifiques, les attributs sont « flexibles » en ce que plus peuvent être ajoutés (et les anciens ajustés: si vous avez commencé avec « Red "mais ensuite ajouté un autre" Rouge "à la piscine de couleur, vous pouvez les changer en" Maroon "et" Rouge vif "

Vous pouvez contrôler le prix et l'inventaire sont au niveau du produit de détail (bien que plus de tableaux peuvent être nécessaires pour tenir compte des coûts approvisionnement).

Tout cela suppose que vos caractéristiques sont universellement partagées. Si ce n'est pas le cas, l'approche de votre sous-table caractéristique peut fonctionner en créant une table de jointure entre les caractéristiques et les tables de détails du produit et en renseignant le cas échéant. Cela nécessitera plus de logique métier. Pour s'assurer que chaque catégorie de produit obtient toutes les caractéristiques nécessaires. Dans ce dernier cas, j'utiliser des produits « prototypes » dans le tableau des produits de base (avec Quantité et coût de 0) que je cloner les caractéristiques de puis ajuster chaque nouveau produit est entré. À mesure que vous avancez, quand une nouvelle variation apparaît, avoir une fonction «cloner ce produit» qui vous permet d'ajuster simplement les différences du produit de base serait précieuse.Enfin, en ce qui concerne la gestion de l'inventaire et des prix, cela se fera au niveau de la couche d'interface utilisateur. Le fait de pouvoir générer des requêtes pour des produits associés (groupes de produits) et de gérer tous les prix pour des produits apparentés contribuera grandement à rendre cela vivable.

+0

Ceci est un conseil judicieux. Dans l'entreprise pour laquelle je travaille, nous n'avons que deux tables - Product et ProductItem - et la couleur et la taille n'ont pas été correctement normalisées. Il rend la gestion/l'association d'images spécifiques aux couleurs un véritable cauchemar. C'est comme ça que je le ferais; la couleur et la taille sont des concepts de première classe .... –

+0

... et nous avons rencontré des scénarios où "les jaunes sont fabriqués en Thaïlande mais les blancs viennent de Chine", mais puisque nous stockons cela au niveau du produit, nous pouvons ne modélisez pas cela et finissez par dupliquer le SKU, ce qui cause d'autres problèmes. Être flexible mais fournir l'interface utilisateur pour les scénarios communs est un conseil +1. –

+1

Merci Nicholas. Ce conseil vient d'être brûlé trop souvent en supposant que les caractéristiques "faciles" peuvent simplement être farcies dans la table principale. Je peux facilement voir que la table "Couleur" gagne finalement plus d'attributs en raison des différences d'approvisionnement. Trompez moi une fois... – Godeke

2

Juste un petit mot. Vous pouvez toujours essayer et jeter un oeil au code source de certains autres produits de commerce électronique comme Spree et Substruct ils ont probablement déjà répondu à cette question pour vous.

Questions connexes