我正在建立一个网上商店来销售"绿色超大号T恤"等产品.即,同样的衬衫可以有很多尺寸/颜色,不同的组合可以卖光,不同的组合可能有不同的价格等.
我的问题是我应该如何在我的Rails应用程序中建模这些产品(或者实际上如何在任何应用程序中进行建模).
我目前的想法是:
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
因此,每个产品将具有一个或多个特征(例如,"颜色","尺寸"等),并且每个特征将具有一个或多个变体(例如,"红色","蓝色"等).
这种方法的问题是我在哪里存储价格和库存?即,给定产品的价格和库存由其特征所采用的变体决定.(绿色可能比红色更贵,大可能缺货等).
我有一个想法是给产品"base_price",并让变体修改它,但这看起来过于复杂(并且可能不起作用).
我已经看到了解决这种困境的两种方法.第一种是尝试使用特征来定义"主要"产品的从属产品.这里面临的挑战是,除了您的想法之外,在大多数情况下,产品将随着新的制造商的发展而发展,这些制造商将新的方面带到了桌面上.例如,一个制造商可以制造更便宜的产品,但是具有可能足以跟踪的标志或缝合的不同应用方法.
我认为每个产品带有一个不重要的产品编号,然后将这些特征作为属性附加起来效果最好.它易于搜索和扩展.如果一组产品密切相关,则各个产品附加的ProductGroup效果很好.
在表格中:
ProductGroup -------------------- ProductGroupID ProductGroupName ProductGroupDescription Product -------------------- ProductID ProductGroupID QtyOnHand BasePrice ProductColorID ProductSizeID ProductColor ------------ ProductColorID ProductColorName ProductSize -------------- ProductSizeID ProductSizeName ...more attributes...
这里的优点是你可以轻松查询特定的属性,属性是"灵活的",因为可以添加更多(和旧的调整:如果你开始使用"红色",但后来又添加了另一个"红色"到颜色池,你可以将它们改为"栗色"和"鲜红色".
您可以在详细的产品级别控制价格和库存(尽管可能需要更多的表来计算采购成本).
这一切都假设您的特征是普遍共享的. 如果不是,则可以通过在特征和产品详细信息表之间创建连接表并根据需要填充来实现特征子表方法.这将需要更多的业务逻辑.以确保每个产品类别都具备必要的所有特征.在后一种情况下,我会在基本产品表中使用"原型"产品(数量和成本为0),我将从中克隆特征,然后在输入每个新产品时进行调整.随着您的前进,当出现新的变化时,拥有"克隆此产品"功能,只允许您调整与基础产品的差异将是有价值的.
最后,就管理库存和定价而言,这将发生在UI层.能够为相关产品(产品组)生成查询并管理相关产品的所有定价将大大有助于实现这一目标.