常見數據庫設計(2)——歷史數據問題之單記錄變更


在各種應用軟件中,客戶總是希望看到自己操作關鍵業務的歷史數據(更或者是將來的歷史數據,如本年計划明年的商品價格),並且要跟蹤變化來源於哪一個版本。歷史記錄,如果我們按某次修改時,需要新增的記錄條件的角度來看,如果只需要新增一條記錄(如商品價格的變動,一次只變動),我們稱之為單記錄變更;如果我們需要新增一條記錄,並且還需要在不同的表中新增對應的詳細記錄並且是一對多的關系時(如報價時,我們需要儲存報價流水和報價物品清單列表),我們稱之為多記錄變更。

一,單記錄變更、無儲存未來歷史記錄的需求,儲存於單表中
付款計划 PayPlan                
                
字段名          類型          是否可空    中文名       描述
id                char(36)    no           guid
...其它屬性...
num            int            no           版本號       在某個項目中遞增
is_use         int            no           是否啟用     默認0否,1是
use_date     datetime   yes    
ischeck        int             no          是否確認     默認0未確認,1確認
checker       char(36)    yes          確認人    
check_date  datetime    yes          確認日期

說明:用戶添加一條數據,未確認時,可以修改、刪除。但是當用戶確認時(當項目使用工作流時,也可以用工作流替換確認的3個字段),
更新is_use為1(是),並且更新操作人信息。在用戶確認完之后,不能添加,修改、刪除。
需要修改時,則將原有數據復制一份(除主鍵外),並設置版本號加1,設置is_use和ischeck=0,設置use_date、checker和check_date為NULL,然后修改操作在新的版本中進行,並且系統中使用的依然是前一個版本的數據。當修改流水,確認后,需要先將本類其它的is_use改為0,並且更新自己的is_use為1及其它信息。

二,單記錄變更、無儲存未來歷史記錄的需求,儲存於多表中(一個主表存儲在用記錄,另一個子表儲存歷史記錄)
    在上一個方案中,[單記錄變更、無儲存未來歷史記錄的需求,儲存於單表中],如果當變更頻率高中,表中的數據量增大,為了獲取在用的那條記錄(客戶是常用到的就是這個),查詢時間會浪費在很多無用的記錄上。為了解決無關的數據問題,我們將在用的數據儲存於主表中,而變更的歷史,儲存於子表,這樣我們在獲取在用記錄時,就去除了很多無用的數據。
付款計划 PayPlan                
                
字段名         類型          是否可空    中文名      描述
id               char(36)    no           guid
...其它屬性...
num           int            no            版本號      在某個項目中遞增
is_use        int            no            是否啟用    默認0否,1是
ischeck       int            no            是否確認    默認0未確認,1確認
checker      char(36)    yes           確認人    
check_date datetime    yes          確認日期

付款計划 PayPlanVar                
                
字段名    類型    是否可空    中文名    描述
id    char(36)    no        guid
pay_plan_Id char(36)       no    付款計划編號,主表的編號
...其它屬性...
num     int     no              版本號   在某個項目中遞增
is_use    int    no    是否啟用    默認0否,1是
ischeck    int    no    是否確認    默認0未確認,1確認
checker    char(36)    yes    確認人    
check_date    datetime    yes    確認日期

說明:用戶添加一條數據,未確認時,可以修改、刪除。但是當用戶確認時(當項目使用工作流時,也可以用工作流替換確認的3個字段),
更新is_use為1(是),並且更新操作人信息。在用戶確認完之后,不能添加,修改、刪除。
第一次修改時,將主表(PayPlan)數據復制一份到PayPlanVar中,當然也要將版本號加1以及其它狀態信息還原,在確認后,將主表再復制一份到歷史表中,用作歷史數據,然后將本次修改的數據,更新到主表中去,並更新主表的版本號等信息。
第一次修改以后,再需要修改數據,將主表數據復制到子表中,同樣版本號加其它信息還原,但在確認后只需要將版本等信息更新回主表即可。

三,單記錄變更、有儲存未來歷史記錄的需求,儲存於單表
    如,當某個供應商在今年就定出明年的商品價格,如果我們商品價格使用的第一或第二種設計方案,我們不得不在明年手工並且在確定的時間內更新價格表。
商品價格表(GoodsPrice)
字段名          類型          是否可空    中文名    描述
id                char(36)    no           guid
...其它屬性...
num     int     no              版本號  
start_time    datetime    no      開始生效日期
end_time      datetime   no      結束生效日期


今天就先總結到這,關於多記錄變更,下次再總結。歡迎大家拍磚討論。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM