数据库设计:如何记录捆绑产品交付

时间:2014-02-12 03:57:00

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

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

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

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

假设情况

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

交易同时包含A和B.产品(1,2,3,4)交付时具有相同的transaction_id。

在这种情况下,使用当前的DB模式无法知道以下内容:
1.产品是否作为捆绑包的一部分交付 2.与

捆绑的产品还有哪些其他产品

将BOOL“捆绑”列添加到交付表将标识交易中交付的哪些产品在捆绑中,哪些不在捆绑中,但如果事务包含多个捆绑,则无法知道哪些产品捆绑在一起。

可以创建特定于交易的捆绑包ID。捆绑A(ID 1),捆绑B(ID 2),这些捆绑对于交易是唯一的,并针对每个交付的捆绑产品进行记录。这似乎是一种奇怪的方式。然后提出了一个问题:

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

您认为解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

当多个父包包含类似的子产品时要小心。

实施例。客户订单产品1,2,3。捆绑A在产品1 + 2上。捆绑C在产品1 + 3上。你让这个客户获得两个捆绑包吗?或者只有一个?

另一个选项是商品表,它会在您的产品表上成为FKey,但最终会以相同的名称吹出产品,只有不同的相应商品ID。