1

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

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

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 镜像表中)以及最终的订单详细信息,以便可以快速轻松地查询它们以进行显示和报告。

4

2 回答 2

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恰好也是一个包装产品本身,则不需要做额外的工作。

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

于 2012-05-09T13:01:38.907 回答
0

这是一组棘手的要求,特别是因为您还没有告诉我们关于履行、或任何其他折扣方案,或者当客户从包裹中退回单件商品以获得退款时会发生什么......

Michael 的设计是一种很好的方式来存储您的产品提供的层次结构。

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

然后你如何处理“order_line”表?你有三个选择:

  • 添加带有价格的包裹(但不是构成包裹的物品),
  • 以零价格添加包裹及其价格和构成包裹的物品,
  • 添加具有正常价格的商品,以及包裹的折扣线。

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

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

大多数超市收银台都使用选项 3——这也是一种向刚刚购买商品的顾客展示他们获得“奖励”折扣的好方法,因为他们的订单与包裹匹配。

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

如果您计划提供其他类型的折扣(例如“消费 x,免费获得 y”,或“超过 x 的订单 10% 折扣”),您需要非常明确地定义这一点,因为折扣相互叠加的方式经常会令人不安零售商——这就是为什么他们通常在打包交易中提供“最便宜的免费商品”。

于 2012-05-09T13:32:22.433 回答