mysql - 如何在数据库中存储已付款和未付款的订单?

标签 mysql database database-design relational-database

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

我想出了两个设计:

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

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

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

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


我的问题是:

  • 考虑到用户众多且应用程序繁重,哪种设计在性能方面更好?
  • 有什么好的替代方案可以满足我的要求吗?

最佳答案

另一种意见....

不需要额外的规范化表(UnpaidOrderDeliveryAddress、UnpaidOrderCreditCard,...用于与 UnpaidOrder 和 PaidOrderDeliveryAddress 的关系,PaidOrderCreditCard,...用于 PaidOrder)。如果你认为 FOREIGN KEYs 需要这样,我会反对在这种情况下使用 FOREIGN KEYs。简单的索引就足够了。

由于您最终会拥有比“未付费”条目更多的“付费”条目,而付费条目本质上是您很少需要接触的“历史”,因此我倾向于 2 个表格。

我可能不会使用触发器——我宁愿在我有更多控制权的应用程序代码中使用它。

您是否期望每秒执行超过 100 条 SQL 语句?如果不是,我不会称之为“重”。

一定要小心地用 BEGIN..COMMIT 包围适当的语句组。此外,对导致 UPDATE 的 SELECT 使用 FOR UPDATE

关于mysql - 如何在数据库中存储已付款和未付款的订单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29350481/

相关文章:

Java 和 MySql。哪个异常真正需要 "rollback"

php - 我想从我的数据库中从一个 ID 号中选择一些具有相同 photograph_id 的图像或变量

mysql - 抽象表格设计问题

java - 我们数据库设计的最佳方法

php - PHP 检查两个表是否唯一

mysql - 当我想要存储此类数据时,应该如何建立数据库?

java - mvn Spring 启动 :run results in Access denied for user 'root' @'localhost' (using password: YES)

php - CodeIgniter GROUP_CONCAT 并加入

sql-server - 更新 Excel 后,我无法再使用 SQL 查询获取数据

java - 如何将phpmyadmin数据库与android应用程序连接