如何在数据库中存储付费和未付订单?

时间:2015-03-30 15:42:29

标签: mysql database database-design relational-database

我正在设计一个数据库,我需要存储客户的付费订单未付订单这两类订单都有< 相同的属性和关系与其他表格。

我想出了两个设计:

1。两类订单的单独表格: enter image description here 优点:此设计可帮助我快速区分购物车中的订单和付款的订单。每当客户重新访问我的网站时,我只需要查找该特定客户的UnpaidOrder表,我的购物车已准备就绪。

缺点:每当在UnpaidOrder表中支付订单时,我需要将相应的行(UnpaidOrder和与其链接的其他表)移动到PaidOrder表及其相应的表。此设计还需要2x个表:例如。 UnpaidOrderDeliveryAddress,UnpaidOrderCreditCard,...用于与UnpaidOrder和PaidOrderDeliveryAddress,PaidOrderCreditCard,...用于PaidOrder的关系。

2。两个类别的公用表和一个额外的状态属性: enter image description here 优点:我不需要在支付未付款订单时移动多行。此外,对应关系的表数量减半。

缺点:我正在为每一行存储额外的状态属性。每当客户重新访问我的网站时,我需要查找Order表,我需要检查该特定客户的每行的Status属性(付费/未付款)。因此,购物车将需要更长的时间来装载。


我的问题是:

  • 在性能方面哪个设计更好,请记住有很多用户,这是一个繁重的应用程序?
  • 我的要求有什么好的选择吗?

2 个答案:

答案 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;