有兩個表: orders, orders_history。
orders
________
id | status
orders_history
id | order_id | status | user_id
在orders_history包含所有用戶的行為歷史。同時orders.status包含來自的最后狀態orders_history.status。
我在翻譯中提出這些查詢:
transaction start
insert into orders_history...
$status = select status from order_history order by id desc limit 1;
update orders set status = $status where orders.id = id
我的問題是:
我應該使用交易嗎?這樣做是否正確?如果多個事務嘗試insert, update orders_history相同的order_id.
uj5u.com熱心網友回復:
正如上面評論中所建議的,您可以使用觸發器來更新訂單表 -
DELIMITER $$
CREATE TRIGGER `update_order_status` AFTER INSERT ON `orders_history`
FOR EACH ROW
UPDATE `orders` SET `status` = NEW.status WHERE id = NEW.order_id;
$$
DELIMITER ;
更好的選擇是不在訂單中存盤冗余狀態,而只在 orders_history 中查詢最新狀態。
SELECT orders.id, (SELECT status FROM orders_history oh WHERE orders.id = oh.order_id ORDER BY id DESC LIMIT 1) AS status
FROM orders
uj5u.com熱心網友回復:
在這種情況下我可能使用的設計模式是......
表 1:歷史——這是對已發生的一切的審計跟蹤。(想一想:所有開出的支票和存入支票賬戶的存款。)
表 2:當前 - 這是資訊的當前狀態。(思考、當前賬戶余額、狀態等)
每當發生某些事情時(例如,檢查清除):
START TRANSACTION;
INSERT INTO History ...;
UPDATE Current ...;
COMMIT;
在支票賬戶的情況下,如果您的賬戶透支,則需要一些不同的東西,所以讓我們讓交易更復雜:
START TRANSACTION;
SELECT balance FROM Current WHERE acct = 123 FOR UPDATE;
if would be overdrawn then
email user
UPDATE Current SET status = 'overdrawn' acct = 123;
...
else
INSERT INTO History ...;
UPDATE Current ...;
endif
COMMIT;
我更喜歡將“業務邏輯”清晰地放在一個地方,而不是隱藏在觸發器中。(我可能會使用觸發器來監控或記錄,但不是用于表格的主要目的。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/406932.html
標籤:
