Database-Design

數據更改時如何對關係數據庫進行快照或版本控制?

  • February 9, 2022

我的系統接收數據饋送。每個數據饋送最終都會為(關係)數據庫中的大多數表創建插入和/或更新。

在收到每個數據饋送後,我需要擷取整個數據庫的快照。基本上,每次通過系統執行數據饋送時,我都需要一種方法來對數據庫進行版本控制。

請注意,通過擷取快照,我並不是指從字面上獲取數據庫的快照,而是寫入歷史記錄或某種此類機制,以便我可以跨“版本”查詢數據庫以查看版本之間的變化(以及其他案例)

是否存在可以擷取這樣的數據庫版本快照的已知數據模型設計?

NHydrate會為您執行此操作,我相當肯定許多其他 ORM 工具也提供此功能。

作為你自己的努力,有很多方法可以做到這一點,但這裡有一個簡單的例子:https ://stackoverflow.com/questions/3719180/sql-server-2005-history-tables-using-triggers 。

然後,您只需要一組查詢來檢索數據饋送更新之前的最後一條記錄。

您正在尋找的是緩慢變化的尺寸設計。表中的每一行數據都將保存該記錄的開始日期和結束日期。此設計使您能夠像過去任何時間點一樣查詢表。

例子

create table scd (
   id          number , 
   open_date   date, 
   close_date  date, 
   data        varchar2(10), 
   primary key (id , open_date)
)

alter session set nls_date_format='dd/mm/yyyy';    

insert into scd values (1,'01/01/2013','03/01/2013','D1');
insert into scd values (1,'03/01/2013','04/01/2013','D1.1');
insert into scd values (1,'04/01/2013','31/12/9999','D1.3'); // this is the current occurrence

insert into scd values (2,'01/01/2012','31/12/9999','D2'); 

insert into scd values (3,'01/01/2012','31/12/9999','D3'); 
insert into scd values (3,'01/01/2012','03/01/2012','D3.closed'); // this is a closed occurrence

// querying the data as of 02/01/2013
select * from scd where '02/01/2013' => open_date and '02/01/2013' < close_date

// querying currently open occurrences
select * from scd where sysdate between open_date and close_date

希望這可以幫助

引用自:https://dba.stackexchange.com/questions/40760