想象一个电子商务平台,其工作原理如下:
Package
,由Items
和其他Packages
混合而成。Order
由Items
和Packages
混合而成。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
。
很想听听有关如何对此进行建模的想法。
感谢。
答案 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。