王希鋒
摘要:數(shù)據(jù)完整性是指數(shù)據(jù)的正確性、完備性和一致性,是衡量數(shù)據(jù)庫質(zhì)量好壞的標(biāo)準(zhǔn)。本文從以下三個方面分析了數(shù)據(jù)的完整性。即實體完整性、參照完整性和用戶自定義完整性。
關(guān)鍵詞:實體完整性 用戶定義完整性 參照完整性
數(shù)據(jù)庫完整性(Database Integrity)是指數(shù)據(jù)庫中數(shù)據(jù)的正確性和相容性。數(shù)據(jù)庫完整性由各種各樣的完整性約束來保證,因此可以說數(shù)據(jù)庫完整性設(shè)計就是數(shù)據(jù)庫完整性約束的設(shè)計。數(shù)據(jù)庫完整性約束可以通過DBMS或應(yīng)用程序來實現(xiàn),基于DBMS的完整性約束作為模式的一部分存入數(shù)據(jù)庫中。通過DBMS實現(xiàn)的數(shù)據(jù)庫完整性按照數(shù)據(jù)庫設(shè)計步驟進(jìn)行設(shè)計,而由應(yīng)用軟件實現(xiàn)的數(shù)據(jù)庫完整性則納入應(yīng)用軟件設(shè)計。
約束是用來確保數(shù)據(jù)的準(zhǔn)確性和一致性。數(shù)據(jù)的完整性就是對數(shù)據(jù)的準(zhǔn)確性和一致性的一種保證。數(shù)據(jù)完整性(Data Integrity)是指數(shù)據(jù)的精確(Accuracy)和可靠性(Reliability)。它是應(yīng)防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。數(shù)據(jù)完整性分為三類:實體完整性(Entity Integrity)、參照完整性(Referential Integrity)、用戶定義的完整性(User-definedIntegrity)。關(guān)系的完整性提供了一種手段,用于保證授權(quán)用戶對數(shù)據(jù)庫修改時不會破壞數(shù)據(jù)的一直性。實體完整性和參照完整性是關(guān)系模型必須滿足的完整性約束條件,被稱作是關(guān)系的兩個不變性,應(yīng)該由關(guān)系系統(tǒng)自動支持。
關(guān)系模型的完整性規(guī)則是對關(guān)系的某種約束條件。關(guān)系模型中三類完整性約束:實體完整性、參照完整性、用戶定義的完整性。
實體完整性和參照完整性是關(guān)系模型必須滿足的完整性約束條件,被稱作是關(guān)系的兩個不變性,應(yīng)該由關(guān)系系統(tǒng)自動支持。
實體完整性規(guī)則(Entity Integrity):若屬性A是基本關(guān)系R的主屬性,則屬性A不能取空值。
關(guān)系模型必須遵守實體完整性規(guī)則的原因:(1)實體完整性規(guī)則是針對基本關(guān)系而言的。一個基本表通常對應(yīng)現(xiàn)實世界的一個實體集或多對多聯(lián)系。(2)現(xiàn)實世界中的實體和實體間的聯(lián)系都是可區(qū)分的,即它們具有某種唯一性標(biāo)識。(3)相應(yīng)地,關(guān)系模型中以候選碼作為唯一性標(biāo)識。(4)候選碼中的屬性即主屬性不能取空值。所謂空值就是“不知道”或“無意義”的值。如果主屬性取空值,就說明存在某個不可標(biāo)識的實體,即存在不可區(qū)分的實體,這與第(2)點(diǎn)相矛盾,因此這個規(guī)則稱為實體完整性。實體完整性規(guī)則規(guī)定基本關(guān)系的所有主屬性都不能取空值,而不僅是主碼整體不能取空值。
例:選修(學(xué)號,課程號,成績)
“學(xué)號、課程號”為主碼,
則學(xué)號和課程號兩個屬性都不能取空值
參照完整性:在關(guān)系模型中實體及實體間的聯(lián)系都是用關(guān)系來描述的,因此可能存在著關(guān)系與關(guān)系間的引用。
外碼:設(shè)F是基本關(guān)系R的一個或一組屬性,但不是關(guān)系R的碼。如果F與基本關(guān)系S的主碼Ks相對應(yīng),則稱F是基本關(guān)系R的外碼(Foreign Key),基本關(guān)系R稱為參照關(guān)系(Referencing Relation),基本關(guān)系S稱為被參照關(guān)系(Referenced Relation)或目標(biāo)關(guān)系(Target Relation)。
說明:關(guān)系R和S不一定是不同的關(guān)系。目標(biāo)關(guān)系S的主碼Ks和參照關(guān)系的外碼F必須定義在同一個(或一組)域上。外碼并不一定要與相應(yīng)的主碼同名。當(dāng)外碼與相應(yīng)的主碼屬于不同關(guān)系時,往往取相同的名字,以便于識別。
參照完整性規(guī)則就是定義外碼與主碼之間的引用規(guī)則。
參照完整性規(guī)則:若屬性(或?qū)傩越M)F是基本關(guān)系R的外碼,它與基本關(guān)系S的主碼Ks相對應(yīng)(基本關(guān)系R和S不一定是不同的關(guān)系),則對于R中每個元組在F上的值必須為:
或者取空值(F的每個屬性值均為空值)
或者等于S中某個元組的主碼值。
用戶定義的完整性:用戶定義的完整性是針對某一具體關(guān)系數(shù)據(jù)庫的約束條件,反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語義要求。
關(guān)系模型應(yīng)提供定義和檢驗這類完整性的機(jī)制,以便用統(tǒng)一的系統(tǒng)的方法處理它們,而不要由應(yīng)用程序承擔(dān)這一功能。
例:課程(課程號,課程名,學(xué)分)
“課程名”屬性必須取唯一值
非主屬性“課程名”也不能取空值
“學(xué)分”屬性只能取值{1,2,3,4}
與表有關(guān)的約束是表中定義的一種約束。可在列定義時定義該約束,此時稱為列約束,列約束有(表約束 NOT NULL)。也可以在表定義時定義約束,此時稱為表約束,表約束有(PRIMARY KEY、foreign key、check、UNIQUE)。
not null(非空)約束:只用于定義列約束。(2)unique(惟一)約束:用于指明創(chuàng)建惟一約束的列上的取值必須惟一。(3)primary key(主鍵)約束:用于定義基本表的主鍵,起惟一標(biāo)識作用,其值不能為null,也不能重復(fù),以此來保證實體的完整性。(4)foreign key(外鍵)約束:定義了一個表中數(shù)據(jù)與另一個表中的數(shù)據(jù)的聯(lián)系。
foreign key約束指定某一個列或一組列作為外部鍵,其中包含外部鍵的表稱為子表,包含外部鍵所引用的主鍵的表稱為父表。系統(tǒng)保證,表在外部鍵上的取值要么是父表中某一主鍵,要么取空值,以此保證兩個表之間的連接,確保了實體的參照完整性。
以上通過實體完整性、參照完整性、用戶自定義完整性三個方面進(jìn)行分析了數(shù)據(jù)庫中的完整性約束,并且通過實際的例子更容易清晰的理解和掌握完整性約束。