用于订购填充项目的“包裹包”的数据建模

时间:2012-08-23 20:51:54

标签: database database-design data-modeling

想象一个电子商务平台,其工作原理如下:

  • Package,由Items和其他Packages混合而成。
  • OrderItemsPackages混合而成。
  • 用户可以选择一些商品和一些订购包,但也可以继续从包中删除一些商品作为订单的一部分,这不会影响原始包装。
  • Package以后可能会发生变化,但Order必须显示当时作为套装的一部分实际订购的内容。

以下是一个例子:

Package_A: [Large_Knife, Cutting_Board]
Package_B: [Cheese, Package_A]

Order_1: [Wine, Small_Knife, (Package_B - Large_Knife)]

现在让我们说Package_A更改为:

Package_A: [Large_Knife, Cork_Screw]

这意味着新的Package_B有一个Cork_Screw而不是Cutting_Board

当用户查看他的旧订单时,他应该看到他实际订购的内容。

Order_1: [Wine, Small_Knife, Package_B([Cheese, Cutting_Board])]

如果更容易建模,则无需存储/显示已移除Large_Knife

很想听听有关如何对此进行建模的想法。

感谢。

1 个答案:

答案 0 :(得分:1)

一个项目可以在许多包中。

包可以包含许多项目。

订单可以包含许多商品和包裹。

包裹或物品可以在许多订单中。

用户可以下多个订单。

订单由一位用户下达。

包的项目可能会随时间而变化,但无需跟踪此更改。

如果一个包发生变化,那么包含该包的订单不应受到影响,其内容应保持原样,直到订购时为止。

拟议模型:

用户:UserId(PK),姓氏,名字,电子邮件

项目:ItemId(PK),描述

包:PackageId(PK),描述

PackageDetail:PackageId(FK),ItemId(FK)

订单:OrderId(PK),UserId(FK),DateOrdered

OrderDetail:OrderId(FK),ItemId(FK,not null),PackageId(FK,“0”,如果它是一个项目)

如果Order包含Item,则OrderDetail表上的字段ItemId必须包含其PK,并且PackageId必须设置为“0”。

如果订单包含一个包,在放置时包含3个项目,则必须在表OrderDetails上插入3行,所有包含相同的PackageId但具有不同的ItemdId。