我正在设计一个数据库,我需要存储客户的付费订单和未付订单。这两类订单都有< 相同的属性和关系与其他表格。
我想出了两个设计:
1。两类订单的单独表格: 优点:此设计可帮助我快速区分购物车中的订单和付款的订单。每当客户重新访问我的网站时,我只需要查找该特定客户的UnpaidOrder表,我的购物车已准备就绪。
缺点:每当在UnpaidOrder表中支付订单时,我需要将相应的行(UnpaidOrder和与其链接的其他表)移动到PaidOrder表及其相应的表。此设计还需要2x个表:例如。 UnpaidOrderDeliveryAddress,UnpaidOrderCreditCard,...用于与UnpaidOrder和PaidOrderDeliveryAddress,PaidOrderCreditCard,...用于PaidOrder的关系。
2。两个类别的公用表和一个额外的状态属性: 优点:我不需要在支付未付款订单时移动多行。此外,对应关系的表数量减半。
缺点:我正在为每一行存储额外的状态属性。每当客户重新访问我的网站时,我需要查找Order表,我需要检查该特定客户的每行的Status属性(付费/未付款)。因此,购物车将需要更长的时间来装载。
我的问题是:
答案 0 :(得分:2)
另一个意见......
不需要额外的规范化表(UnpaidOrderDeliveryAddress,UnpaidOrderCreditCard,...用于与UnpaidOrder和PaidOrderDeliveryAddress,PaidOrderCreditCard,...用于PaidOrder的关系)。如果你认为FOREIGN KEYs
需要这样做,我会反对在这种情况下使用FOREIGN KEYs
。简单的索引就足够了。
因为你最终将获得更多&#34;付费&#34;条目比&#34;未支付&#34;条目和付费条目基本上是历史记录&#39;你很少需要触摸,我倾向于2个桌子。
我可能不会使用触发器 - 我宁愿在我有更多控制权的应用程序代码中执行此操作。
您是否希望每秒执行100多条SQL语句?如果没有,我就不会称之为“#34;沉重的&#34;。
请务必使用BEGIN..COMMIT
小心地围绕适当的语句组。另外,在导致UPDATE的SELECT上使用FOR UPDATE
。
答案 1 :(得分:0)
如果您担心性能,一个可能的建议是您可以执行类似于版本2的操作,但是当项目被标记为“已付款”时触发器会运行单独的查询(例如,您可以将付费指示符保留为在它被支付之前为NULL)然后当它被填充时,将它移动到一个单独的表中,就像在版本1中一样。
换句话说,所有项目都在表1中,直到付款为止,当它们自动移动到表2然后从表1中删除时。
CREATE TRIGGER trigger_name
AFTER UPDATE
ON `UnpaidOrder`.`paid` FOR EACH ROW
BEGIN
DECLARE vOrder varchar(50);
SELECT order_number() INTO vOrder;
INSERT INTO PaidOrder
//code here from the first table
DELETE from `UnpaidOrder` //if you choose to do so, or you could leave it on the table; up to you
//criteria that you wish to delete
END;