在各種應用軟件中,客戶總是希望看到自己操作關鍵業務的歷史數據(更或者是將來的歷史數據,如本年計划明年的商品價格),並且要跟蹤變化來源於哪一個版本。歷史記錄,如果我們按某次修改時,需要新增的記錄條件的角度來看,如果只需要新增一條記錄(如商品價格的變動,一次只變動),我們稱之為單記錄變更;如果我們需要新增一條記錄,並且還需要在不同的表中新增對應的詳細記錄並且是一對多的關系時(如報價時,我們需要儲存報價流水和報價物品清單列表),我們稱之為多記錄變更。
一,單記錄變更、無儲存未來歷史記錄的需求,儲存於單表中
付款計划 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 結束生效日期
今天就先總結到這,關於多記錄變更,下次再總結。歡迎大家拍磚討論。。。