SQL保存歷史表方式
建立 history 表,如order_history每次order insert同時也insert一筆到history
建立 max string json log 表,所有表insert同時也insert一筆到log,表格結構只有id,createtime,log
直接查 DB 底層 transation log
請問還有其他方式能建立數據保存表嗎?
SQL保存歷史表方式
建立 history 表,如order_history每次order insert同時也insert一筆到history
建立 max string json log 表,所有表insert同時也insert一筆到log,表格結構只有id,createtime,log
直接查 DB 底層 transation log
請問還有其他方式能建立數據保存表嗎?
詢問 GPT4
除了您提到的方法外,還有以下幾種常見的保存歷史數據的方法:
1. 使用觸發器(Triggers):
當在主表中進行插入、更新或刪除操作時,可以創建一個數據庫觸發器,自動將變更記錄到歷史表中。這種方法可以確保在任何更改發生時都會自動記錄歷史數據。
```sql
CREATE TRIGGER order_history_trigger
AFTER INSERT OR UPDATE OR DELETE ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, action, action_time, ...)
VALUES (NEW.order_id, 'INSERT/UPDATE/DELETE', NOW(), ...);
END;
使用數據庫的時間點恢復(Point-in-Time Recovery)功能:
大多數數據庫管理系統都提供時間點恢復功能,可以將數據庫恢復到過去的某個時間點。這種方法可以在需要查詢歷史數據時,將數據庫恢復到指定時間,然後查詢對應的數據。這種方法不需要額外的歷史表,但可能需要較長的恢復時間,且在恢復過程中,數據庫可能無法正常提供服務。
使用數據庫的分區表(Partitioned Tables):
對於大量歷史數據的保存,可以考慮使用數據庫的分區表功能。將數據根據時間或其他條件分區存儲,可以提高查詢效率,同時方便管理歷史數據。例如,可以根據訂單創建時間,將訂單數據分區存儲到不同的表中,如 orders_2021_q1
、orders_2021_q2
等。
CREATE TABLE orders (
order_id INT,
create_time TIMESTAMP,
...
) PARTITION BY RANGE (create_time) (
PARTITION orders_2021_q1 VALUES LESS THAN ('2021-04-01'),
PARTITION orders_2021_q2 VALUES LESS THAN ('2021-07-01'),
...
);
使用數據庫的 Change Data Capture(CDC)功能:
Change Data Capture 是一種用於捕獲數據庫表中的數據更改(如插入、更新和刪除操作)的技術。許多數據庫系統(如 SQL Server、Oracle、MySQL 等)都提供了 CDC 功能,可以將數據更改記錄到專門的更改表中,以便後續查詢和處理。
這些方法可以根據實際需求和數據庫系統的特性進行選擇,以實現高效、靈活的歷史數據保存和查詢。
主要還是要看您們建這個歷史表的目的為何?
如果只是要要記錄Table的異動是OK的,但要查詢時會好查嗎?例如我要查5年前的業務A的訂單好查嗎?
如果要好查詢,就建一個歷史資料庫(不一定要在同一台主機),Table名稱欄位和原資料庫都相同,訂單結案時(或結案多久以後)自動將訂單移至歷史資料庫,這樣主資料庫資料就不會太多,查詢的速度快,User想查歷史資料程式就導向歷史資料庫查,也不會影響主資料庫效能。
您需求是對TABLE A做動作時就會有相關的動作去TABLE B、TABLE C、TABLE D、.....是嗎?
如果是,我很直覺的想到用"TRIGGER"來解決
既單純後續修改也不會太困難
個人補充一下。
因為你可能是要記錄每一筆記錄的 建立 刪除 更新 。
你應該要多記錄 何時/誰/何地(IP) ,你會比較容易管理
但多記錄並非沒缺點。實際上因為記錄可能會造成db變慢。由其是每筆資料的長度很大時。你的db每秒可執行的 transaction 會下降這是你要考慮的。