如何根据形式化规则在 MySQL 中存储行的状态?

How to store status of rows in MySQL according formalization rules?

我有一个 table order_executors:

id | order_id | user_id | status

其中 order_iduser_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.

的历史记录

如何解决这个设计问题?

我的想法是创建一个新的 table order_executors_history 来存储状态变化:

id | user_id | order_id | status

并在 order_executors 中使用 UPDATE 命令存储当前状态。

您已经给出了解决方案。

只需更新 table order_executors 上的状态(或删除并插入新行),每个 只保留一行order_id | user_id 键;

创建另一个 table order_executors_history 并且当您 insert/update 在 table order_executors 你应该插入到 order_executors_history.

两个table具有相同的结构。 您将在 table order_executors_history.

中获得已按您的 ID 排序的状态

我更喜欢将历史记录保存在另一个 table 中,其中有一列指示更改的日期和时间。

但如果你想让它们保持相同 table,我想你可以添加一个类型为 int(11) 且默认值为“unix_timestamp 的列(current_timestamp())”。然后可以通过选择timestamp_field的最大值或将查询结果按“where子句”降序排序并限制在一行中来查询订单的最后状态。