如何在数据库中存储多个产品的“包”

时间:2012-05-09 12:56:50

标签: mysql database

我有一个提供电子商务服务的网站,基本上允许该行业的卖家将他们的产品出售给客户。卖家选择他们想要销售的产品并设定价格。然后他们会放手。

在简化表格中,我的数据库中有以下相关表格,用于存储产品和订单信息:

Product_Info
--------------------
ID (autonumber)
name
...


Order_Head
--------------------
ID (autonumber)
CustomerID
...


Order_Line
--------------------
ID (autonumber)
OrderHeadID
ProductID
...

这适用于简化订单,客户可以选择任意数量的产品并将其添加到购物车中。但是,我现在面临的问题是添加卖家创建和管理的“套餐”,其中卖家可以将多个产品组合成一个单独的商品,并以低于单个商品一起成本的价格出售。例如,如果橙子价格为15美元,苹果价格为20美元,则包含2个橙子和1个苹果的包装可能只需35美元。

扭曲,以及让我现在陷入困境的那部分,是我非常希望包装能够包含其他包装。例如,卖家可以制作包含3个橙子的“什锦橙子”包装。然后他们可以制作一个包含2个苹果和1个“什锦橙子”的“什锦水果”包。

当我从产品表或包表中引用ID以及如何在order_line表中记录产品时,如何管理这一点让我感到困惑的是如何列出包中的产品productID可以指向产品或包。当然,这需要以有效的方式设计,因此我们不会不必要地对数据库服务器征税。

我主要是一名网络开发人员,以前在电子商务方面做得不多。任何人都可以提供一些适当的表和表修改方法以应用于数据库吗?我不知道为什么,因为它似乎不应该那么复杂,但这个让我陷入困境。

作为参考,我使用的是MySQL 5.1,连接到ColdFusion MX 7(很快就是9)。

编辑:

感谢您的回复。我会花点时间进一步思考它们。与此同时,我想澄清订单处理的工作原理,因为它似乎比我原先假设的更有意义。

我的产品类似于Shutterfly。摄影师张贴照片,客户可以购买照片。摄影师需要工具来设置所有定价,并且如果来自专业拍摄,通常会提供套餐。实现由我的产品自动提交订单的实验室完成,但他们不了解定价,包装等。

摄影师还可以选择运行特价商品为客户提供x%折扣或BOGO优惠,但我可以单独处理。现在我更关心的是一种有效而简单的方法来存储摄影师定义的包,客户在购物时的每个产品的图像选择(当前存储在order_line镜像表中),以及最终的订单细节,这样他们就可以快速轻松地查询显示和报告。

2 个答案:

答案 0 :(得分:2)

创建一个附加表,列出每个包的成员项以及包中包含的数量。

Package_Items

CREATE TABLE Package_Items (
  package_id INT NOT NULL 
  item_id INT NOT NULL,
  item_quantity INT NOT NULL DEFAULT 1,
  FOREIGN KEY (package_id) REFERENCES Product_Info (ID),
  FOREIGN KEY (item_id) REFERENCES Product_Info (ID)
  PRIMARY KEY (package_id, item_id)
);

package_id列引用Product_Info中作为主要包项的行。 item_id指的是包成员的其他项目。可以有多个package_id, item_id组合。

使用此方法,您可以在Product_Info中创建代表包的新行。要将所有项添加到包中,只需在Package_Items中添加相应的行即可。如果添加到Package_Items的行也发生在包产品本身上,则无需执行额外的工作。

请注意不要将包添加到自身。

答案 1 :(得分:0)

这是一套棘手的要求,特别是因为您还没有告诉我们有关履行情况,或任何其他折扣计划,或当客户退回包裹中的单个商品以获得退款时会发生什么......

迈克尔的设计是存储产品分层性质的好方法。

接下来的问题是“你在哪里存储包裹的价格” - 因为它不是所有产品的总和。我建议将价格存储在“package_items”表中。

您对“order_line”表做了什么?您有三种选择:

  • 添加一个包含价格的包裹(但不包括构成包裹的商品),
  • 以零价格
  • 添加包含其价格和组成包裹的商品的包裹
  • 以正常价格添加商品,以及包装的折扣行。

如果履行订单的人知道包裹,您可以选择选项1.然而,客户将他们的运输单与他们收到的产品进行比较可能会感到困惑。

如果您想显示每个订单项,但保留“套餐价格”,则选项二允许您显示订单项;如果客户想要退货,您必须以某种离线方式计算出该商品的价值。

大多数超市收费都使用选项3 - 它也是一种很好的方式,可以向顾客展示他们只是因为订单与套餐相匹配而获得“奖励”折扣的商品。

如果订单商品无法同时发货,您必须决定在发货单上打印什么 - 这是背面的巨大痛苦,并且经常影响条款和条件,和(在欧洲)税收。

如果您打算提供其他类型的折扣(例如“花x,免费获得”或“超过x的订单10%折扣”),您需要明确定义,因为折扣的方式可以复合彼此往往会扰乱零售商 - 这就是为什么他们通常在包裹交易中提供“最便宜的免费物品”。