如何根据形式化规则在 MySQL 中存储行的状态?
How to store status of rows in MySQL according formalization rules?
我有一个 table 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
.
的历史记录
如何解决这个设计问题?
我的想法是创建一个新的 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子句”降序排序并限制在一行中来查询订单的最后状态。
我有一个 table 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
.
如何解决这个设计问题?
我的想法是创建一个新的 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子句”降序排序并限制在一行中来查询订单的最后状态。