天天看點

《資料庫原理與應用(第3版)》——3.4 關系模型的完整性限制

本節書摘來自華章出版社《資料庫原理與應用(第3版)》一 書中的第3章,第3.4節,作者:何玉潔,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

資料完整性是指資料庫中存儲的資料是有意義的或正确的。關系模型中的資料完整性規則是對關系的某種限制條件。它的資料完整性限制主要包括三大類:實體完整性、參照完整性和使用者定義的完整性。

實體完整性是保證關系中的每個元組都是可識别的和唯一的。

實體完整性是指關系資料庫中所有的表都必須有主鍵,而且表中不允許存在無主鍵值的記錄和主鍵值相同的記錄。

因為若記錄沒有主鍵值,則此記錄在表中一定是無意義的。由于關系模型中的每一行記錄都對應客觀存在的一個執行個體或一個事實。比如,表3-1中的第一行資料描述的就是“李勇”這個學生。如果将表3-1中的資料改為表3-6所示的資料,可以看到,第1行和第3行資料沒有主鍵值,檢視其他列的值發現這兩行資料的其他各列的值都是一樣的,這會産生這樣的疑問:到底是在計算機系中存在名字、年齡、性别完全相同的兩個學生,還是重複存儲了李勇學生的資訊?這就是缺少主鍵值時造成的情況。如果為其添加主鍵值為表3-7所示資料,則可以判定在計算機系有兩個姓名、年齡、性别完全相同的學生。如果為其添加主鍵值為表3-8所示資料,則可以判定在這個表中有重複存儲的記錄,而在資料庫中存儲重複的資料是沒有意義的。

《資料庫原理與應用(第3版)》——3.4 關系模型的完整性限制

當在表中定義了主鍵時,資料庫管理系統會自動保證資料的實體完整性,即保證不允許存在主鍵值為空的記錄以及主鍵值重複的記錄。

關系模型中使用主鍵作為記錄的唯一辨別,在關系資料庫中主屬性不能取空值。關系資料庫中的空值是特殊的标量常數,它代表未定義的(不适用的)或者有意義但目前還處于未知狀态的值。比如當向表3-2所示的“選課”關系中插入一行記錄時,在學生還沒有考試之前,其成績是不确定的,是以,我們希望此列上的值為空。空值用“null”表示。

3.4.2 參照完整性

參照完整性也稱為引用完整性。現實世界中的實體之間往往存在着某種聯系,在關系模型中,實體以及實體之間的聯系都是用關系來表示的,這樣就自然存在着關系與關系之間的引用。參照完整性就是描述實體之間的聯系的。

參照完整性一般是指多個實體或表之間的關聯關系。

例3-1 學生實體和班實體可以用下面的關系模式表示,其中主鍵用下劃線辨別:

學生(學号,姓名,性别,班号,年齡)

班(班号,所屬專業,人數)

這兩個關系模式之間存在着屬性的引用,即“學生”關系中的“班号”引用了“班”關系的主鍵“班号”。顯然,“學生”關系中的“班号”的值必須是确實存在的班的班号的值,即在“班”關系中有該班号的記錄。也就是說,“學生”關系中的“班号”的取值參照了“班”關系中的“班号”的取值。這種限制一個關系中某列的取值受另一個關系中某列的取值範圍限制的特點就稱為參照完整性。

例3-2 學生、課程以及學生與課程之間的選課關系可以用如下三個關系模式表示,其中主鍵用下劃線辨別:

學生(學号,姓名,性别,專業,年齡)

課程(課程号,課程名,學分)

選課(學号,課程号,成績)

這三個關系模式間也存在着屬性的引用。“選課”關系中的“學号”引用了“學生”關系中的主鍵“學号”,即“選課”關系中的“學号”的值必須是确實存在的學生的學号,也就是在“學生”關系中有這個學生的記錄。同樣,“選課”關系中的“課程号”引用了“課程”關系中的主鍵“課程号”,即“選課”中的“課程号”也必須是“課程”中存在的課程号。

與實體間的聯系類似,不僅兩個或兩個以上的關系間可以存在引用關系,同一個關系的内部屬性之間也可以存在引用關系。

例3-3 有關系模式:職工(職工号,姓名,性别,直接上司職工号)

在這個關系模式中,“職工号”是主鍵,“直接上司職工号”屬性表示該職工的直接上司的職工号,這個屬性的取值就參照了該關系中“職工号”屬性的取值,即“直接上司職工号”必須是确實存在的一個職工。

進一步定義外鍵:設f是關系r的一個或一組屬性,如果f與關系s的主鍵相對應,則稱f是關系r的外鍵(foreign key,也稱為外碼),并稱關系r為參照關系(referencing relation),關系s為被參照關系(referenced relation)或目的關系(target relation)。關系r和關系s不一定是不同的關系。

顯然,目标關系s的主鍵ks和參照關系r的外鍵f必須定義在同一個域上。

在例3-1中,“學生”關系中的“班号”屬性與“班”關系中的主鍵“班号”對應,是以,“學生”關系中的“班号”是外鍵,引用了“班”關系中的“班号”(主鍵)。這裡,“班”關系是被參照關系,學生關系是參照關系。

可以用圖3-3所示的圖形化方法形象地表達參照和被參照關系。“班”和“學生”的參照與被參照關系的圖形化表示如圖3-4a所示。

在例3-2中,“選課”關系中的“學号”屬性與“學生”關系中的主鍵“學号”對應,“課程号”屬性與“課程”關系的主鍵“課程号”對應,是以,“選課”關系中的“學号”屬性和“課程号”屬性均是外鍵。這裡“學生”關系和“課程”關系均為被參照關系,“選課”關系為參照關系,其參照關系圖如圖3-4b所示。

在例3-3中,職工關系中的“直接上司職工号”屬性與本身所在關系的主鍵“職工号”屬性對應,是以,“直接上司職工号”是外鍵。這裡,“職工”關系即是參照關系也是被參照關系,其參照關系圖如圖3-4c所示。

《資料庫原理與應用(第3版)》——3.4 關系模型的完整性限制

需要說明的是,外鍵并不一定要與相對應的主鍵同名(如例3-3)。但在實際應用中,為了便于識别,當外鍵與相應的主鍵屬于不同的關系時,一般給它們取相同的名字。

參照完整性規則就是定義外鍵與被參照的主鍵之間的引用規則。

對于外鍵,一般應符合如下要求:

1)或者值為空。

2)或者等于其所參照的關系中的某個元組的主鍵值。

例如,對于職工與其所在的部門可以用如下兩個關系模式表示,主鍵用下畫線辨別:

職工(職工号,職工名,部門号,工資級别)

部門(部門号,部門名)

其中,“職工”關系的“部門号”是外鍵,它參照了“部門”關系的“部門号”。如果某新來職工還沒有被配置設定到具體的部門,則其“部門号”就為空值;如果職工已經被配置設定到了某個部門,則其部門号就有了确定的值(非空值)。

主鍵要求必須是非空且不重的,但外鍵無此要求。外鍵可以有重複值,這點我們從表3-2可以看出。

使用者定義的完整性也稱為域完整性或語義完整性。任何關系資料庫系統都應該支援實體完整性和參照完整性,除此之外,不同的資料庫應用系統根據其應用環境的不同,往往還需要一些特殊的限制條件。使用者定義的完整性就是針對某一具體應用領域定義的資料庫限制條件,它反映某一具體應用所涉及的資料必須滿足應用語義的要求。

使用者定義的完整性實際上就是指明關系中屬性的取值範圍,也就是屬性的域,即限制關系中的屬性的取值類型及取值範圍,防止屬性的值與應用語義沖突。例如,學生的考試成績的取值範圍為0~100,或取{優、良、中、及格、不及格}。