❶ 鏁版嵁搴撶殑瀹屾暣鎬у寘鎷鍑犱釜鏂歸潰鍟婏紵
鏁版嵁瀹屾暣鎬э紙Data
Integrity錛夋槸鎸囨暟鎹鐨勭簿紜鎬э紙Accuracy錛
鍜屽彲闈犳э紙Reliability錛夈傚畠鏄搴旈槻姝㈡暟鎹搴撲腑瀛樺湪涓嶇﹀悎璇涔夎勫畾鐨勬暟鎹鍜岄槻姝㈠洜閿欒淇℃伅鐨勮緭鍏ヨ緭鍑洪犳垚鏃犳晥鎿嶄綔鎴栭敊璇淇℃伅鑰屾彁鍑虹殑銆傛暟鎹瀹屾暣鎬у垎涓哄洓綾伙細瀹炰綋瀹屾暣鎬э紙Entity
Integrity錛夈佸煙瀹屾暣
鎬э紙Domain
Integrity錛夈佸弬鐓у畬鏁存э紙Referential
Integrity錛夈佺敤鎴峰畾涔夌殑瀹屾暣鎬э紙User-definedIntegrity錛夈
鏁版嵁搴撻噰鐢ㄥ氱嶆柟娉曟潵淇濊瘉鏁版嵁瀹屾暣鎬э紝鍖呮嫭澶栭敭銆佹潫綰︺佽勫垯鍜岃Е鍙戝櫒銆傜郴緇熷緢濂藉湴澶勭悊浜嗚繖鍥涜呯殑鍏崇郴錛屽苟閽堝逛笉鍚岀殑鍏蜂綋鎯呭喌鐢ㄤ笉鍚岀殑鏂規硶榪涜岋紝鐩鎬簰浜ゅ弶浣跨敤錛岀浉琛ョ己鐐廣
❷ 濡備綍淇濊瘉鏁版嵁搴撲腑鐨勬暟鎹瀹屾暣錛
1銆佸敮涓鎬х害鏉燂細閫氳繃涓鴻〃涓鐨勬煇浜涘瓧孌佃劇疆鍞涓緔㈠紩錛屼嬌寰楄繖浜涘瓧孌典腑鐨勫間笉鑳介噸澶嶏紝浠庤屼繚璇佹暟鎹搴撲腑鏁版嵁鐨勫敮涓鎬с
2銆佸栭敭綰︽潫錛氶氳繃鍦ㄥ氫釜琛ㄤ箣闂村緩絝嬪栭敭鍏寵仈錛屼嬌寰楄〃涓鐨勬暟鎹鑳藉熸湁鏁堝湴榪涜屼氦浜掞紝浠庤屼繚璇佹暟鎹搴撲腑鏁版嵁鐨勫畬鏁
3銆佹鏌ョ害鏉燂細閫氳繃鍦ㄨ〃涓璁劇疆媯鏌ョ害鏉燂紝鏉ユ鏌ユ煇涓鍒楃殑鍊兼槸鍚︽弧瓚充竴瀹氱殑鏉′歡錛屼粠鑰屼繚璇佹暟鎹搴撲腑鏁版嵁鐨勫畬鏁存с
4銆侀粯璁ゅ肩害鏉燂細閫氳繃涓鴻〃涓鐨勬煇浜涘瓧孌佃劇疆榛樿ゅ礆紝濡傛灉鐢ㄦ埛娌℃湁涓鴻ュ瓧孌佃緭鍏ュ礆紝灝變細鑷鍔ㄤ嬌鐢ㄩ粯璁ゅ礆紝浠庤屼繚璇佹暟鎹搴撲腑鏁版嵁鐨勫畬鏁存с
5銆佽Е鍙戝櫒錛氶氳繃璁劇疆瑙﹀彂鍣錛屽湪鏁版嵁鍙戠敓鏀瑰彉鏃惰嚜鍔ㄨ繘琛屾鏌ワ紝浠庤屼繚璇佹暟鎹搴撲腑鏁版嵁鐨勫畬鏁存с
6銆佺▼搴忕駭鐨勫畬鏁存ф牎楠岋細鍦ㄥ簲鐢ㄧ▼搴忎腑娣誨姞鐩稿簲鐨勫畬鏁存ф牎楠屼唬鐮侊紝浠庤屼繚璇佹暟鎹搴撲腑鏁版嵁鐨勫畬鏁存с
--- 6.1銆佺┖鍊兼牎楠岋細媯鏌ヨ〃涓鏌愪釜瀛楁墊槸鍚︽湁絀哄礆紝濡傛灉瀛樺湪絀哄煎垯榪斿洖閿欒淇℃伅銆
--- 6.2銆侀暱搴︽牎楠岋細媯鏌ヨ〃涓鏌愪釜瀛楁電殑闀垮害鏄鍚︾﹀悎瑕佹眰錛屽傛灉涓嶇﹀悎瑕佹眰鍒欒繑鍥為敊璇淇℃伅銆
--- 6.3銆佺被鍨嬫牎楠岋細媯鏌ヨ〃涓鏌愪釜瀛楁電殑綾誨瀷鏄鍚︾﹀悎瑕佹眰錛屽傛灉涓嶇﹀悎瑕佹眰鍒欒繑鍥為敊璇淇℃伅銆
--- 6.4銆佸艱寖鍥存牎楠岋細媯鏌ヨ〃涓鏌愪釜瀛楁電殑鍊兼槸鍚﹀湪鎸囧畾鐨勮寖鍥村唴錛屽傛灉涓嶅湪鎸囧畾鑼冨洿鍐呭垯榪斿洖閿欒淇℃伅銆
❸ 資料庫中,如何保證數據完整性
保證數據的完整性:
1. 用約束而非商務規則強制數據完整性
如果你按照商務規則來處理需求,那麼你應當檢查商務層次/用戶界面:如果商務規則以後發生變化,那麼只需要進行更新即可。
假如需求源於維護數據完整性的需要,那麼在資料庫層面上需要施加限制條件。
如果你在數據層確實採用了約束,你要保證有辦法把更新不能通過約束檢查的原因採用用戶理解的語言通知用戶界面。除非你的欄位命名很冗長,否則欄位名本身還不夠。 — Lamont Adams
只要有可能,請採用資料庫系統實現數據的完整性。這不但包括通過標准化實現的完整性而且還包括數據的功能性。在寫數據的時候還可以增加觸發器來保證數據的正確性。不要依賴於商務層保證數據完整性;它不能保證表之間(外鍵)的完整性所以不能強加於其他完整性規則之上。
— Peter Ritchie
2. 分布式數據系統
對分布式系統而言,在你決定是否在各個站點復制所有數據還是把數據保存在一個地方之前應該估計一下未來5 年或者10 年的數據量。當你把數據傳送到其他站點的時候,最好在資料庫欄位中設置一些標記。在目的站點收到你的數據之後更新你的標記。為了進行這種數據傳輸,請寫下你自己的批處理或者調度程序以特定時間間隔運行而不要讓用戶在每天的工作後傳輸數據。本地拷貝你的維護數據,比如計算常數和利息率等,設置版本號保證數據在每個站點都完全一致。
— Suhair TechRepublic
3. 強制指示完整性
沒有好辦法能在有害數據進入資料庫之後消除它,所以你應該在它進入資料庫之前將其剔除。激活資料庫系統的指示完整性特性。這樣可以保持數據的清潔而能迫使開發人員投入更多的時間處理錯誤條件。
— kol
4. 關系
如果兩個實體之間存在多對一關系,而且還有可能轉化為多對多關系,那麼你最好一開始就設置成多對多關系。從現有的多對一關系轉變為多對多關系比一開始就是多對多關系要難得多。
— CS Data Architect
5. 採用視圖
為了在你的資料庫和你的應用程序代碼之間提供另一層抽象,你可以為你的應用程序建立專門的視圖而不必非要應用程序直接訪問數據表。這樣做還等於在處理資料庫變更時給你提供了更多的自由。
— Gay Howe
6. 給數據保有和恢復制定計劃
考慮數據保有策略並包含在設計過程中,預先設計你的數據恢復過程。採用可以發布給用戶/開發人員的數據字典實現方便的數據識別同時保證對數據源文檔化。編寫在線更新來「更新查詢」供以後萬一數據丟失可以重新處理更新。
— kol
7. 用存儲過程讓系統做重活
解決了許多麻煩來產生一個具有高度完整性的資料庫解決方案之後,我所在的團隊決定封裝一些關聯表的功能組,提供一整套常規的存儲過程來訪問各組以便加快速度和簡化客戶程序代碼的開發。在此期間,我們發現3GL 編碼器設置了所有可能的錯誤條件,比如以下所示:
SELECT Cnt = COUNT (*)
FROM [<Table>]
WHERE [<primary key column>] = <new value>
IF Cnt = 0
BEGIN
INSERT INTO [<Table>]
( [< primary key column>] )
VALUES ( <New value> )
END
ELSE
BEGIN
<indicate plication error>
END
而一個非3GL 編碼器是這樣做的:
INSERT INTO [<Table>]
( [< primary key column>] )
VALUES
( <New value> )
IF @@ERROR = 2627 -- Literal error code for Primary Key Constraint
BEGIN
<indicate plication error>
END
第2 個程序簡單多了,而且事實上,利用了我們給資料庫的功能。雖然我個人不喜歡使用嵌入文字(2627)。但是那樣可以很方便地用一點預先處理來代替。資料庫不只是一個存放數據的地方,它也是簡化編碼之地。
— a-smith
8. 使用查找
控制數據完整性的最佳方式就是限制用戶的選擇。只要有可能都應該提供給用戶一個清晰的價值列表供其選擇。這樣將減少鍵入代碼的錯誤和誤解同時提供數據的一致性。某些公共數據特別適合查找:國家代碼、狀態代碼等