【问题标题】:Database Design: How to record bundle product deliveries数据库设计:如何记录捆绑产品交付
【发布时间】:2014-03-10 05:02:59
【问题描述】:

我将捆绑功能添加到结帐中,用户可以在其中以折扣价选择自己的自定义产品捆绑包。因此,捆绑中的产品数量是动态的。

我有以下现有的数据库架构:

产品(ID (PK)、名称、价格等……)
交易(id (PK)、金额、日期时间等……)
Delivery(id(PK),transaction_id(FK transaction.id),product_id(FK product.id),折扣等......)

假设情况

Bundle A - 产品 (1,2)
Bundle B - 产品 (3,4)

一笔交易同时包含捆绑包 A 和 B。产品 (1,2,3,4) 使用相同的 transaction_id 交付。

在这种情况下,使用当前的数据库架构无法知道以下内容:
1. 产品是否作为捆绑包的一部分交付
2. 捆绑了哪些其他产品

在交付表中添加一个 BOOL 'bundle' 列将识别交易中交付的哪些产品是捆绑的,哪些不是,但如果交易包含多个捆绑,则无法知道哪些产品捆绑在一起。

可以创建特定于交易的捆绑 ID。 Bundle A (ID 1)、Bundle B (ID 2) 对交易是唯一的,并针对交付的每个捆绑产品进行记录。不过,这似乎是一种奇怪的做法。这就提出了一个问题:

捆绑 ID 在所有交易中都应该是唯一的吗?如果是这样,您是否只是为了创建唯一的捆绑 ID 而创建一个捆绑表?

你认为解决这个问题最好的方法是什么?

【问题讨论】:

    标签: php mysql sql database-design database-schema


    【解决方案1】:

    从设计的角度来看,我会考虑产品层次结构。

    dbo.ProductHierarchy 
    ProductHierarchyID INT (PK), ParentProductID INT (FK), ChildProductID INT (FK)
    

    通过这种方式,您可以将 Bundle A 添加为产品(父级),并将其链接到其包含的产品 1 和 2 作为子级。

    您可以扩展此架构以包含捆绑价格,当捆绑产品添加到订单/交易时,您可以使用它来覆盖产品 1 和 2 的价格点。您还可以包含促销的开始/结束日期,以控制前端显示的内容。

    但是,当多个父捆绑包包含类似的子产品时要小心。

    例如。客户订购产品 1、2、3。 Bundle A 在产品 1+2 上。 Bundle C 在产品 1+3 上。你让这个客户得到两个捆绑包吗?还是只有一个?

    另一个选项是 offer 表,它会成为您 products 表上的 FKey,但您最终会淘汰所有具有相同名称的产品,只是对应的商品 ID 不同。

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2013-06-16
      • 2014-02-12
      • 2019-03-05
      相关资源
      最近更新 更多