在C/S架構中,數據庫設計時我們喜歡用AutoInc的integer字段作為OID,也喜歡在數据庫設置一些Default值,實踐證明這個是沒有問題的。
但是在3-Tier(使用TClientDataSet)或者說BatchUpdate模式下,因爲這些資料必須在提交后才由DBMS產生,所以會有一些問題困擾我們:
1. 對Master-Detail,新增了Master記錄后,爲了保證資料完整性,需要主從同時在一個Transaction保存,所以主表還沒有保存時再新增Detail資料,Detail的外鍵填什麽?
2. 提交資料后,如果沒有看到DBMS產生的AutoInc或Default資料,是否要Merge或Requery?這個動作會使客戶端畫面閃動嗎?儅前記錄跳開嗎?
我的建議是不要在數据庫定義這些東西,就像越來越多的人不會在數据庫定義表的關聯一樣。OID用遞增的OID元件自己處理(一定要數據庫鎖),每次新增就獲得一個新的號碼。至於Default,提交前按設計文檔填滿,當然也可以連同Constraint做成數據字典統一管理,統一處理。