在本系統開發中,遇到了與其他系統資料互動的情況,包括資料下載和資料回寫。(後者本文不做介紹)。資料下載即本系統需要從其他系統的資料庫下載基本業務資料,並且當資料來源更新後,本系統的業務基礎資料也需要更新(不要求即時),資料來源有幾個表的基礎業務資料將近100萬條.
為了便於描述,下面只討論一個表,資料來源表記為A表,下載到本系統的表記為B表
思路:
從A表下載資料到B表的處理可分為2步:
1.第一次下載
第一次下載應是把A表相應的資料全部插入到B表(系統初始化時完成)
此處理比較好辦,一條sql就能搞定。
2.第二次(及以後)下載
分2種情況考慮:A表新增資料和原有資料更新。
為了判斷哪些資料需要處理,可根據A表中記錄的最後更新時間(作為資料來源的系統一般有記錄最後更新時間欄位,以下記為LastUpdateTime)做判斷:
即如果A表中各記錄的LastUpdateTime的值大於B表資料的LastUpdateTime值視為需要處理的資料:
a.當此類記錄在本系統不存在則為新增業務資料
b.當此類記錄在本系統存在則為本系統需要更新的資料
當然,如果A表中那些LastUpdateTime的值不大於B表資料的LastUpdateTime值則不需要處理。
因此,在此情況下下載資料可分2步進行:
第一步把屬於新增的記錄下載到本系統
第二步對需要更新的資料進行更新
需要注意的是,無論是資料插入還是資料更新,在本系統中都需要記錄或更新其LastUpdateDate,否則將無法在以後下載時和A表中的記錄的LastUpdateTime值進行比較
更新B表中的LastUpdateTime可將所有記錄的LastUpdateTime全部更新,但這樣一來,資料量較大時更新起來也會耗費一定時間。為此,可單獨建一個表C並利用一條記錄儲存B表的最後更新時間,這樣更新時只要更新表C,也就只需要更新一條記錄,可獲得效能提升。
根據以上分析,我們採取了如下方案:
1.在本系統中建立和資料來源內各基礎資料表結構類似(只取需要的資料)的表
2.建立一個表C,專門用來記錄本系統中各業務資料表最後更新記錄日期,表結構如下所示:
Create Table C
(
tableName,varchar(50),
LastUpdateDate Date
)
3.完成資料插入或更新資料時,根據處理的資料每次更新C表中相應記錄的LastUpdateTime
需要注意的是:
1.更新每個表的LastUpdateTime時,其時間不能採用本系統的時間,而應該取資料來源所在系統的時間。
2.當基礎資料表小(業務資料量少)的時候,可在每次執行下載時刪除目的表中的資料並重新下載,則不需要利用本文中採用的方法。