數據完整性

數據完整性

存儲在資料庫中的所有數據值均正確的狀態。如果資料庫中存儲有不正確的數據值,則該資料庫稱為已喪失數據完整性。

詳細釋義

資料庫中的數據是從外界輸入的,而數據的輸入由於種種原因,會發生輸入無效或錯誤信息。保證輸入的數據符合規定,成為了資料庫系統,尤其是多用戶的關係資料庫系統首要關注的問題。數據完整性因此而提出。本章將講述數據完整性的概念及其在SQL Server 中的實現方法。

數據完整性(Data Integrity)是指數據的精確性(Accuracy) 和可靠性(Reliability)。它是應防止資料庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。數據完整性分為四類:實體完整性(Entity Integrity)、域完整性(Domain Integrity)、參照完整性(Referential Integrity)、用戶自定義完整性(User-definedIntegrity)。

資料庫採用多種方法來保證數據完整性,包括外鍵、約束、規則和觸發器。系統很好地處理了這四者的關係,並針對不同的具體情況用不同的方法進行,相互交叉使用,相補缺點。

分類

數據完整性分為以下3類。

(1)域完整性:是指一個列的輸入有效性,是否允許為空值。強制域完整性的方法有:限制類型(通過設定列的數據類型)、格式(通過CHECK約束和規則)或可能值的範圍(通過FOREIGN KEY約束、CHECK約束、DEFAULT定義、NOT NULL定義和規則)。如:學生的考試成績必須在0~100之間,性別只能是“男”或“女”。 (2)實體完整性:是指保證表中所有的行唯一。實體完整性要求表中的所有行都有一個唯一標識符。這個唯一標識符可能是一列,也可能是幾列的組合,稱為主鍵。也就是說,表中的主鍵在所有行上必須取唯一值。強制實體完整性的方法有:索引、UNIQUE約束、PRIMARY KEY約束或IDENTITY屬性。如:student表中sno(學號)的取值必須唯一,它唯一標識了相應記錄所代表的學生,學號重複是非法的。學生的姓名不能作為主鍵,因為完全可能存在兩個學生同名同姓的情況。

(3)參照完整性:是指保證主關鍵字(被引用表)和外部關鍵字(引用表)之間的參照關係。它涉及兩個或兩個以上表數據的一致性維護。外鍵值將引用表中包含此外鍵的記錄和被引用表中主鍵與外鍵相匹配的記錄關聯起來。在輸入、更改或刪除記錄時,參照完整性保持表之間已定義的關係,確保鍵值在所有表中一致。這樣的一致性要求確保不會引用不存在的值,如果鍵值更改了,那么在整個資料庫中,對該鍵值的所有引用要進行一致的更改。參照完整性是基於外鍵與主鍵之間的關係。例如學生學習課程的課程號必須是有效的課程號,score表(成績表)的外鍵cno(課程號)將參考course表(課程表)中主鍵cno(課程號)以實現數據完整性。

域完整性、實體完整性及參照完整性分別在列、行、表上實施。數據完整性任何時候都可以實施,但對已有數據的表實施數據完整性時,系統要先檢查表中的數據是否滿足所實施的完整性,只有表中的數據滿足了所實施的完整性,數據完整性才能實施成功。

完整性的約束

完整性約束主要有實體完整性約束、參照完整性約束、函式依賴約束、統計約束四類。

實體完整性 實體完整性是指一個關係中所有主屬性(即主碼的屬性)不能取空值。所謂“空值”就是“不知道”或“無意義”的值。如主屬性取空值,就說明某個不可標識的實體,這與現實世界的套用環境相矛盾,因此這個實體一定不是完整的實體。

參照完整性約束 參照完整性約束是指參照關係中外碼的取值或者是空值(外碼的每個屬性均為空值)或者是取被參照關係中某個元組的主碼值。下面舉例說明。現有兩個關係模式:學生(學號,姓名,性別,專業號,年齡)和專業(專業號,專業名)。在實現參照完整性時要注意以下幾個問題:①外碼是否可以接受空值。因為外碼能否為空是依賴於套用環境的,如有兩個關係模式分別為選修(學號,課程好,成績)學生(學號,姓名,性別,年齡,所在系),選修關係中的外碼“學號”不能為空,如果為空,說明某個不知學號的學生選修了某門課程,這與學校的套用環境不符。②刪除被參照關係的原組時的考慮。有時需要刪除被參照關係的某個原組,而參照關係中又有若干原組的外碼值與被刪除的被參照關係中的主碼值相對應,這時要進行級聯刪除,即將參照關係中的所有外碼值與被參照關係中要刪除元組主碼值相對應的元組一起刪除,如果參照關係同時又是另一個關係的被參照關係則這種級聯刪除應該級聯刪除應該級聯下去。③修改被參照關係中主碼時的考慮。遇到這種情況時,做法同刪除被參照關係的元組類似,要做級聯修改,既修改被參照關係中主碼值的同時,用相同的方法修改參照關係中相應的外碼值。

函式依賴約束 大部分函式依賴約束都是隱含在關係模式結構中,特別是規範化程度較高的關係模式(如3NF或BCNS)都由模式來保持函式依賴。在實際套用中,為了不使信息過於分離,一般不能過分地追求規範化。這樣在關係的欄位間就可以存在一些函式要顯式地表示出來。

系統約束 即某個欄位值與一個關係多個元組的統計值之間的約束關係。如,本部門經理的工資不得高於本部門職工的平均工資的5倍。其中職工的平均工資值是一個統計計算值。在許多場合,統計數據往往可以公開,而個別數據卻是保密的,但是個別數據值可以從統計數據推斷出來,所以要採取一定的防範措施防止數據泄密。

完整性約束的實施

實現完整性約束的方法依類別不同而不同。完整性約束可以分為兩大類:靜態約束和動態約束。

靜態約束 靜態約束是對資料庫狀態的約束,有可分為固定約束、隱含約束和顯示約束。

固定約束 是數據模型固有的約束,如關係的屬性是原子的,即滿足INF的約束。固有約束在DBMS實現時已經考慮。

隱含約束 指隱含於數據模式中的約束,一般用數據定義語言(DDL)語句說明,並存於數據目錄中。例如,域完整性約束、實體完整性以及參照完整性約束,都由相應的DDL語句說明。

顯示約束 固有約束、隱含約束是最基本的約束,但概括不了所有的約束。數據完整性是多種多樣的,且依賴於數據的語義與套用,這些約束只有顯式地說明,故稱顯式約束。顯式約束的說明一般有三種方法:①用過程說明約束。這種方法不約束的說明和檢驗交給應用程式,應用程式中可以插入一些過程,以檢驗資料庫更新是否違反給定的約束,如果違反約束,則回滾事務。檢驗約束的過程一般用通用高級程式語言編寫,可以表達各式各樣的約束。這是一種普遍方法。②用語言說明約束。斷言指資料庫狀態必須滿足的邏輯條件。資料庫完整性約束可以看成一系列斷言的集合。為了表示約束,DBMS須提供斷言說明語言。③用觸發子表示約束。觸發子是一個軟體機制,其功能相當於WHENEVERTHEN,即一旦給定條件成立,系統就引發相應的動作。利用觸發子可以表示約束,以違反約束作為條件,以違反約束的處理作為動作。動作不限於回滾事務,也可以給用戶一個訊息或過程。在系統中定義一批觸發之後,就會監督資料庫狀態,一旦出現違反約束的更新,就會引發相應的動作。

動態約束 動態約束不是對資料庫狀態的約束,而是資料庫從一個狀態變為另一個狀態時應遵守的約束,例如在更新職工表時,工資、工齡這些屬性值一般只會增加,不會減少。動態約束一般也是顯式說明的。在上述約束中,固有約束必然實施,隱含約束在大部分現代DBMS中基本實施或部分實施,顯式和動態約束只在個別DBMS中實施。

相關詞條

相關搜尋

熱門詞條

聯絡我們