这里是关于购物车的简单而略带异端的建议。
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)是时候删除数据了.
当客户进行结帐并完成订单时,您可以创建真实的订单和订单行(产品),包括订单日期,不一定与客户开始将商品放入购物车的日期相同。 (我在亚马逊上购买的书通常需要一周时间才能完成,因为我一直在寻找有趣的书,而且我必须先阅读一些评论 :)
至于你的订单/订单表应该有什么键,它实际上取决于很多事情,例如:
- 是否可以删除有订单的产品?
- 您是否需要准确表示购买时的产品信息(价格、名称)?
- 我是否使用订单行表来表示其他内容,例如折扣/活动代码等
- 我是否需要准确报告购买时的客户送货地址? (客户搬到了另一个国家,但你把物品寄到了他的老地方)
上述设计使用自然键,在这种情况下恰好提供了出色的性能。