我有一張桌子order_executors:
id | order_id | user_id | status
Whereorder_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 命令存盤當前狀態。
uj5u.com熱心網友回復:
你已經給出了解決方案。
只需更新表order_executors上的狀態(或洗掉并插入新行),每個order_id只保留一行| user_id鍵;
創建另一個表order_executors_history,當您在表order_executors上插入/更新時,您應該插入order_executors_history。
兩個表具有相同的結構。您將在表order_executors_history 中擁有已按您的 ID 排序的狀態。
uj5u.com熱心網友回復:
我更喜歡將歷史記錄保存在另一個表中,其中有一列指示更改的日期和時間。
但是如果您想將它們保留在同一個表中,我認為您可以添加一個型別為 int(11) 且默認值為“ unix_timestamp(current_timestamp()) ”的列。那么您可以通過選擇timestamp_field的最大值或在“where子句”之后將查詢結果按降序排序并限制為一行來查詢訂單的最后狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/406046.html
標籤:
