iT邦幫忙

0

SQL保存歷史表方式研究【100$】

sql
  • 分享至 

  • xImage

SQL保存歷史表方式
建立 history 表,如order_history每次order insert同時也insert一筆到history
建立 max string json log 表,所有表insert同時也insert一筆到log,表格結構只有id,createtime,log
直接查 DB 底層 transation log
請問還有其他方式能建立數據保存表嗎?


詢問 GPT4

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;
  1. 使用數據庫的時間點恢復(Point-in-Time Recovery)功能:

    大多數數據庫管理系統都提供時間點恢復功能,可以將數據庫恢復到過去的某個時間點。這種方法可以在需要查詢歷史數據時,將數據庫恢復到指定時間,然後查詢對應的數據。這種方法不需要額外的歷史表,但可能需要較長的恢復時間,且在恢復過程中,數據庫可能無法正常提供服務。

  2. 使用數據庫的分區表(Partitioned Tables):

    對於大量歷史數據的保存,可以考慮使用數據庫的分區表功能。將數據根據時間或其他條件分區存儲,可以提高查詢效率,同時方便管理歷史數據。例如,可以根據訂單創建時間,將訂單數據分區存儲到不同的表中,如 orders_2021_q1orders_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'),
   ...
);
  1. 使用數據庫的 Change Data Capture(CDC)功能:

    Change Data Capture 是一種用於捕獲數據庫表中的數據更改(如插入、更新和刪除操作)的技術。許多數據庫系統(如 SQL Server、Oracle、MySQL 等)都提供了 CDC 功能,可以將數據更改記錄到專門的更改表中,以便後續查詢和處理。

這些方法可以根據實際需求和數據庫系統的特性進行選擇,以實現高效、靈活的歷史數據保存和查詢。

疑...... 這次沒有報酬了??
sam0407 iT邦大師 1 級 ‧ 2023-11-22 09:55:11 檢舉
我不要報酬,我只要最佳解答....
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
sam0407
iT邦大師 1 級 ‧ 2023-11-22 10:39:51
最佳解答

  主要還是要看您們建這個歷史表的目的為何?

  如果只是要要記錄Table的異動是OK的,但要查詢時會好查嗎?例如我要查5年前的業務A的訂單好查嗎?

  如果要好查詢,就建一個歷史資料庫(不一定要在同一台主機),Table名稱欄位和原資料庫都相同,訂單結案時(或結案多久以後)自動將訂單移至歷史資料庫,這樣主資料庫資料就不會太多,查詢的速度快,User想查歷史資料程式就導向歷史資料庫查,也不會影響主資料庫效能。

小MIS iT邦研究生 1 級 ‧ 2023-11-22 16:51:19 檢舉

謝謝您,請問有付款方式嗎?

sam0407 iT邦大師 1 級 ‧ 2023-11-23 09:34:05 檢舉

不用啦!!我有最佳解答就好了~~

Albert iT邦高手 1 級 ‧ 2023-11-27 08:48:29 檢舉

  如果要好查詢,就建一個歷史資料庫...
:: 是否資料一Table 超過好幾千萬筆 ?
分割資料庫在整合報表會"不好弄"

1
WUcheap
iT邦研究生 5 級 ‧ 2023-11-22 13:42:54

您需求是對TABLE A做動作時就會有相關的動作去TABLE B、TABLE C、TABLE D、.....是嗎?
如果是,我很直覺的想到用"TRIGGER"來解決
既單純後續修改也不會太困難

小MIS iT邦研究生 1 級 ‧ 2023-11-22 16:51:54 檢舉

謝謝您,Trigger + history 或是 log 表方式嗎?

WUcheap iT邦研究生 5 級 ‧ 2023-11-22 16:55:33 檢舉

能用Trigger,那就能對你想要處理的資料或放到哪進行客製化

1
MatthewWangUS
iT邦新手 3 級 ‧ 2023-11-24 09:12:57

個人補充一下。
因為你可能是要記錄每一筆記錄的 建立 刪除 更新 。
你應該要多記錄 何時/誰/何地(IP) ,你會比較容易管理
但多記錄並非沒缺點。實際上因為記錄可能會造成db變慢。由其是每筆資料的長度很大時。你的db每秒可執行的 transaction 會下降這是你要考慮的。

我要發表回答

立即登入回答