【问题标题】:How does one store 'packages' of multiple products within a database一个人如何在数据库中存储多个产品的“包”
【发布时间】:2012-05-09 12:56:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql database


    【解决方案1】:

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

    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) 允许可能有数千个用户将记录添加到 product_info(本质上是一个 corecord 表)是一个好主意吗? 2) 我在 order_line 上添加或修改什么字段以引用回包,然后引用单个项目。每个产品都是定制的,所以它必须有自己的 order_line 记录与唯一的数据相关联。再次感谢。 :)
    • @NicholasBostaph 如果您允许用户添加到 product_info,您还应该在其中有一列指示添加它的用户,因此他们“拥有”它。在order_line 中,您只需使用作为包装产品的Product_Info.ID(而不是作为包装一部分的物品)。
    【解决方案2】:

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

    Michael 的设计是一种很好的方式来存储产品的分层特性。

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 2016-06-12
      相关资源
      最近更新 更多