我正在制作一个ERD,以便我可以建立我的购物车。
我对订单与客户之间的关系感到困惑。
如果我没弄错,客户可以订购许多产品,
订单可由1位客户
发出所以
Create Table OrderProduct(
orderProductId int PRIMARY KEY,
productID int,
Quantity int
)
Create Table Orders(
OrderId int PRIMARY KEY,
orderProductId int, //foregin key
CustomerId int,
date
)
我是正确的,还是mu表结构错误?
答案 0 :(得分:4)
Order
表格中有一列orderProductId
- 这没有任何意义;如果您认为这意味着Order
会有一个OrderProduct
。
OrderProduct
表应该有一列OrderId
- 与Order
表的主键相关的外键。这样,您可以为同一订单生成10条OrderProduct
条记录(通常称为订单行)。
有了这些问题,我发现模拟一些测试数据会有所帮助 - 如果能够解决的话,你会很快看到它。
答案 1 :(得分:2)
这是购物车的简单而略带异端的建议。
table cart(
customer_id not null
,create_date not null
,primary key(customer_id)
,foreign key references customers(customer_id) on delete cascade
);
table cart_item(
customer_id not null
,product_id not null
,quantity not null
,modified_date not null
,primary key(customer_id, product_id)
,foreign key(customer_id) references cart(customer_id) on delete cascade
,foreign key(product_id) references products(product_id) on delete cascade
);
以下是设计背后的理由:
如果你正在建造的东西看起来像大多数购物网站,每个客户一次只有0-1个活跃的购物车。因此,购物车可以继承客户密钥
通常,一个人不买2次产品。取而代之的是购买2件相同的产品,所以我在Cart Item表中将产品密钥作为主键的一部分。
客户决定不继续购物车中的东西。在这种情况下,购物车和物品将保留在表中,直到他回来并决定继续付款,或直到您决定(例如基于cart.create_date)是时候删除数据
当客户继续结帐并完成订单时,您可以创建真实的订单和订单(产品),包括订单日期,该日期不一定与客户开始在购物车中粘贴商品的日期相同。 (我在亚马逊购买的书通常需要一周时间才能完成,因为我一直在寻找有趣的书籍,我必须首先阅读一些评论:)
至于您的订单/订单行表应该具有哪些键,它实际上取决于很多事情,例如:
上述设计使用自然键,在这种情况下恰好提供了出色的性能。
答案 2 :(得分:1)
这对我来说似乎没问题,但您需要在OrderProduct表中使用OrderId才能将订单详细信息与订单相关联 - 从订单中删除OrderProductId。
当然,像ProductId和CustomerId这样的其他一些列也应该是外键。
“订单”是最终订单还是稍后开具发票的步骤?因为您通常可能希望锁定订单中的单价(从订单时的产品文件中,或者可能来自签名/批准的报价)。
答案 3 :(得分:1)
订单可以包含多个产品。您可以从OrderProuct表中删除orderProductId并将productId作为主键。还可以将OrderId作为OrderProduct表中的foriegn键,以便您可以在Order和各产品的订单。