關鍵字:數據庫設計 完整性
誰需要它?
解決了正規化、主鍵和關系問題后,一些人可能會忽視引用完整性。假定你負責維護一個重要數據庫,其中存儲著產品和訂單數據。同時,假定你為主鍵使用了自然數據,并在某天更新了一位特定用戶的主鍵值。不久,客戶氣沖沖地打來電話,因為發票出錯,或是因為承諾的時間并沒有發貨。另外,也可能是因為客戶獲得了訂單,但一直沒有拿到發票。錯誤可能要等到系統審計時才會發現——而且即便在審計時,也有可能檢測不到任何錯誤。
到底發生了什么?當你更改客戶的主鍵值時,你實際忽略了為那個客戶的相關記錄更新外鍵值。換言之,你創建了“孤兒”——也就是不和主鍵值匹配的外鍵記錄。在這種情況下,系統沒辦法將訂單的細節與客戶對應起來。
沒有引用完整性的保障,就可能輸入不匹配的外鍵值。關系模型不允許這些“孤兒”記錄。盡管你的數據庫系統可能允許創建“孤兒”,但開發者必須主動地防止它們。要防止“孤兒”,最簡單的辦法就是實現引用完整性。
什么是引用完整性?
關系模型強制引用完整性。你必須啟用系統的引用完整性特性來滿足關系規則。雖然在表和表之間啟用引用完整性是一個簡單的操作,但你必須理解這樣做(和不這樣做)的后果。從技術上說,完整性規則負責維護關系(也因此維護著數據)。有3種類型的完整性:
Entity(實體)——必須不重復地標識每一條記錄。
Referential(引用)——每個外鍵值都必須在相關的表中有一個匹配的主鍵值(或者為Null)。
Business(業務)——這些規則是業務特有的,與關系數據庫理論無關。
如果禁用引用完整性,你在任何時候都可輸入數據,只要數據不會違反其他表或字段屬性的要求,例如驗證規則和數據類型等。相反,引用完整性會強制規則,限制你在什么時候能修改、添加或刪除數據。啟用引用完整性后,除非在相關的表中存在一個匹配的主鍵值,否則不能輸入一個新的外鍵值。如果相關的表中有一個匹配的外鍵值,就不能更改主鍵值。另外,如果在相關的表中有匹配的外鍵值,就不能刪除一個主鍵值。在這種情況下刪除主鍵記錄會造成“孤兒”。
決定何時啟用引用完整性
除非你有非常特別的理由,否則在每個數據庫中都應啟用引用完整性。但在啟用引用完整性之前,必須滿足幾方面的條件:
要強制引用完整性的關系必須基于一個主鍵或者一個惟一性的索引。
不可在不同數據庫的表之間強制引用完整性。所有表都必須在同一個數據庫內。
關系必須基于數據類型相同的字段(有的系統允許在自動編號字段和一個編號字段之間建立關系)。
一個例子
只有親身體驗,才能完全掌握引用完整性。以一個書籍數據庫為基礎,使用你的系統在Books和Publishers表之間啟用引用完整性。圖A展示了Microsoft Access中的對話框和Relationships窗口(請查閱文檔,了解如何在自己系統中啟用引用完整性)。

文章來源于領測軟件測試網 http://www.kjueaiud.com/