【发布时间】:2022-01-08 16:00:52
【问题描述】:
我有一张桌子order_executors:
id | order_id | user_id | status
其中order_id 和user_id 是外部键。
status 列表示行的状态。它接受0, 1, 2:
0 - default
1 - accepted
2 - canceled
所以,我在以下情况下发现了违反一致性:
id | order_id | user_id | status
1 1 1 1
2 1 1 2
在上述情况下,我看到第一个用户接受了一行status = 1,然后取消了这个status = 2。
因此,当业务逻辑通过查询:SELECT * from order_executors WHERE order_id = 1 AND status = 1 检索数据时,尽管用户已取消此订单,但它仍然有效。
我可以使用SELECT * from order_executors WHERE order_id = 1 AND status = 1 AND status !== 2 解决这个问题。
没错,我可以使用UPDATE 而不是INSERT 来存储status 的当前状态。
但在这种情况下,我丢失了order_executors.status 的历史记录。
如何解决这个设计问题?
我的想法是创建一个新表order_executors_history来存储状态变化:
id | user_id | order_id | status
在order_executors 内部使用 UPDATE 命令存储当前状态。
【问题讨论】:
-
所以您是说您想继续插入更改以便正确跟踪它们?
-
是的,因为我现在应该知道为什么用户首先接受了订单然后取消了它
-
不得不说,我会把订单的状态放到订单里面。因为它在任何时候只能有一种状态。如果你想创建一个变更历史,那很好,但要分开
-
最好将状态存储在
order表中。那么,也许可以在状态附近的order表中添加executor_id以了解谁接受了订单?如果订单有一些位置并且它们可以被一些执行者接受怎么办? -
就像我说的,订单在任何时候只能有一个状态。如果您想保留订单更改历史记录,请以
id | order_id | user_id | status | created_at (datetime)为例
标签: mysql mariadb mariadb-10.4