官术网_书友最值得收藏!

2.2 關(guān)系模型與關(guān)系數(shù)據(jù)庫

關(guān)系數(shù)據(jù)庫是以關(guān)系模型為基礎(chǔ)的數(shù)據(jù)庫,是目前最成熟、應(yīng)用最廣泛的數(shù)據(jù)庫。本節(jié)以如圖2.6所示的一個簡化的“e學(xué)習(xí)”系統(tǒng)數(shù)據(jù)庫為例講解關(guān)系數(shù)據(jù)庫的有關(guān)概念。

2.2.1 關(guān)系數(shù)據(jù)結(jié)構(gòu)

1.表結(jié)構(gòu)

關(guān)系表結(jié)構(gòu)涉及以下概念。

(1)表。關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)單一,它采用二維表結(jié)構(gòu)來表示實體及實體之間的聯(lián)系。一個關(guān)系對應(yīng)一個二維表,也可稱為關(guān)系表,簡稱為表,例如,學(xué)生表、課程表等。

(2)屬性。表中每列描述實體的一個特征,稱為屬性(也稱字段或列)。每個屬性都有相應(yīng)的取值范圍,稱為值域。例如,學(xué)生表中的“姓名”取值為長度不大于16的字符串。

(3)記錄。表中的每行由一個實體成員的屬性取值構(gòu)成,稱為記錄(或元組)。例如,學(xué)生表中的(1102,王洋,男,1999-11-09)是一條記錄,它完整地描述了一個實體成員。記錄中的一個屬性值稱為分量。例如,“王洋”是一個分量。

需要注意的是,關(guān)系是二維表,但這種表有以下限制。

① 表中的每個屬性必須有唯一的名字,屬性在表中的順序可以任意交換。

【例2.1】通訊錄表中多個聯(lián)系電話的正確描述。

在圖2.7(a)中,每個學(xué)生可有兩個聯(lián)系電話,但屬性名相同是不合法的。修改兩個屬性名分別為“手機電話”和“座機電話”,如圖2.7(b)所示。另外,屬性的位置可隨意調(diào)換。例如,可以將“姓名”移到最后一列。

img

圖2.7 通訊錄表

② 表中每個屬性的取值都是基本數(shù)據(jù)類型,例如,整型、實型、字符型等,數(shù)組或結(jié)構(gòu)等不能作為屬性的類型。屬性必須在所規(guī)定的值域內(nèi)取值,不同屬性的值域可以相同。

【例2.2】學(xué)生表中性別和出生日期的取值。

圖2.8(a)中,如果規(guī)定“性別”字段的值域為一個字符,那么第二條記錄的取值Male是不合法的;如果規(guī)定“出生日期”字段為日期型,那么,第二條記錄的取值“1999年”是字符串,也是不合法的。圖2.8(b)中各數(shù)據(jù)取值合法,其中的“出生日期”和“注冊日期”字段的值域都是日期類型。

img

圖2.8 學(xué)生表

③ 表中任意兩條記錄不能完全相同,即不允許有重復(fù)的行。記錄在表中的順序可以交換。

【例2.3】學(xué)生表中的重復(fù)記錄。

在圖2.9(a)中,第一條和第三條記錄完全相同,這是不合法的。在圖2.9(b)中,第一條和第二條記錄雖然多數(shù)字段值相同,但學(xué)號值不同,這是合法的。另外,記錄的順序可以交換,這里將第二條記錄移到最后也是可以的。

img

圖2.9 學(xué)生表

(4)主鍵,也稱主關(guān)鍵字(Primary Key)。主鍵是保證表中記錄具有唯一性的一種機制。

① 候選碼,也稱候選關(guān)鍵字(Candidate Key),是關(guān)系表中按語義能唯一標識記錄的最小屬性的集合。在最簡單的情況下,候選碼只包含一個屬性。在極端情況下,關(guān)系表的所有屬性的集合是這個關(guān)系表的候選碼,稱為全碼。

② 主鍵,用來指定在關(guān)系表中唯一標識記錄的一個候選碼。一個關(guān)系表可能有多個候選碼,但只能選定其中一個為主鍵。主鍵的值不能為空且不能重復(fù)。

在一般情況下,為每個關(guān)系表都要定義主鍵,以保證任意兩行數(shù)據(jù)記錄不完全相同。

【例2.4】學(xué)生表的主鍵。

對于學(xué)生表,如果不允許表中出現(xiàn)姓名相同的學(xué)生,則該表中“學(xué)號”和“姓名”都具有唯一性語義,都是候選碼,主鍵可以選定“學(xué)號”或“姓名”;如果允許表中出現(xiàn)姓名相同的學(xué)生,則“姓名”不能作為候選碼,主鍵只能是“學(xué)號”。

主鍵應(yīng)根據(jù)語義定義,可以是一個屬性,也可以是多個屬性組成的屬性組。

【例2.5】選課表的主鍵。

選課表存放所有學(xué)生選修所有課程的信息。如果將“學(xué)號”定義為主鍵,那么每個學(xué)號只能在表中出現(xiàn)一次,即:每個學(xué)生只能選修一門課程,這顯然與實際選課情況不符合。同理,“課程號”和“學(xué)分”都不適合作為主鍵。這時可以定義一組屬性來作為主鍵,選擇(學(xué)號,課程號)很合適。由此例可以看出,主鍵應(yīng)根據(jù)現(xiàn)實世界中實體的實際情況確定。

2.表之間的關(guān)系

現(xiàn)實世界中的事物是相互聯(lián)系的,這種聯(lián)系需要通過數(shù)據(jù)模型體現(xiàn)出來。聯(lián)系可以分為兩種:一種是實體內(nèi)部的聯(lián)系,它反映了不同屬性之間的聯(lián)系,這種聯(lián)系已經(jīng)在表的結(jié)構(gòu)中體現(xiàn)出來;另一種是實體之間的聯(lián)系,在概念模型中采用E-R圖描述,反映到關(guān)系模型中就是表和表之間的關(guān)系。

在關(guān)系模型中,表和表之間的關(guān)系通過表的公共屬性來實現(xiàn)。在圖2.6中,盡管學(xué)科數(shù)據(jù)與課程數(shù)據(jù)分別存放在不同的表中,但是通過學(xué)科表和課程表中的公共屬性“學(xué)科號”就可以建立兩個表之間的關(guān)聯(lián)。例如,要查詢有哪些“文學(xué)”類的課程,可以先從學(xué)科表中查出它的學(xué)科號是S07,然后根據(jù)學(xué)科號S07在課程表中查出對應(yīng)的所有課程。反之,要查詢“唐詩經(jīng)典”課程屬于哪個學(xué)科,也可以通過它的學(xué)科號在學(xué)科表中查詢到“文學(xué)”。

兩個表的公共屬性之間的關(guān)聯(lián)定義實現(xiàn)了兩個表的連接運算,它不僅支持對數(shù)據(jù)庫的多表連接數(shù)據(jù)操作,而且可以實現(xiàn)相關(guān)聯(lián)數(shù)據(jù)表中數(shù)據(jù)的互相約束,從而保證數(shù)據(jù)的完整性,并減少數(shù)據(jù)冗余。因此,在設(shè)計數(shù)據(jù)庫時,可以把復(fù)雜的事物分解,用多個表進行描述,利用表之間的關(guān)系使信息仍保持整體的邏輯結(jié)構(gòu)。

為了描述表之間的關(guān)系,關(guān)系數(shù)據(jù)模型使用了外關(guān)鍵字、主表和外表等概念。

(1)外關(guān)鍵字(Foreign Key),簡稱外鍵。如果一個表中的主鍵與另一個表中的某個屬性相同或相容(數(shù)據(jù)類型相同、語義相同、描述實體相同),可使用這個相同或相容的公共屬性建立兩個表之間的聯(lián)系,這個起聯(lián)系作用的屬性在另一個表中被稱為外鍵。

提示:公共屬性在兩個表中名稱可以不同。但為了設(shè)計和開發(fā)方便,在數(shù)據(jù)庫設(shè)計時,最好為不同表中的公共屬性定義相同的屬性名。

(2)主表和外表。當(dāng)兩個表關(guān)聯(lián)后,兩個表就有了角色之分。公共屬性作為主鍵的表稱為主表,另一個表稱為外表。

分析以上定義,可以得到在兩個表之間建立關(guān)系的一般原則:

① 兩個表具有能體現(xiàn)實體存在聯(lián)系的相同或相容的公共屬性;

② 該公共屬性至少在其中一個表中是主鍵。

圖2.6中用連線指示了各個表之間的關(guān)系,連線箭頭指向主表,主表中用于建立關(guān)系的屬性是主鍵;連線另一端是外表,外表中用于建立關(guān)系的屬性是外鍵。下面通過幾個小例子詳細說明如何通過外鍵定義表之間的關(guān)系。

【例2.6】學(xué)科表和課程表之間的一對多關(guān)系。

學(xué)科實體和課程實體存在歸屬關(guān)系,一個學(xué)科開設(shè)多門課程,任何一門課程都屬于且僅屬于某個學(xué)科。學(xué)科表和課程表有相同屬性“學(xué)科號”,可以用“學(xué)科號”建立二者之間一對多的關(guān)系(見圖2.10),在學(xué)科表中的“學(xué)科號”是主鍵,而在課程表中的“學(xué)科號”就是外鍵。在這個關(guān)系中,學(xué)科表是主表,課程表是外表。

img

圖2.10 學(xué)科表和課程表之間的一對多關(guān)系

提示:當(dāng)建立關(guān)系的公共屬性只是其中一個表的主鍵時,建立的是一對多關(guān)系。

【例2.7】學(xué)生表和畢業(yè)證表之間的一對一關(guān)系。

學(xué)生實體和畢業(yè)證實體存在獲得關(guān)系,可以用它們的共同屬性“學(xué)號”建立關(guān)系。“學(xué)號”作為主鍵所在的學(xué)生表是主表,畢業(yè)證表是外表,如圖2.11(a)所示。為保證這是一對一關(guān)系,需要在外表(畢業(yè)證表)中限定“學(xué)號”取值唯一,可通過為“學(xué)號”字段建立唯一索引實現(xiàn)。

還可以采用另外一種設(shè)計方案,如圖2.11(b)所示:將“學(xué)號”也設(shè)為畢業(yè)證表的主鍵,利用它們的共同屬性“學(xué)號”建立在學(xué)生表和畢業(yè)證表之間的一對一關(guān)系。在這個由兩個主鍵建立的關(guān)系中,哪個是主表,哪個是外表呢?理論上,可以任選一個作為主表,另一個作為外表。但在關(guān)系中,主表約束外表,要根據(jù)實際的關(guān)系分析,選擇一般性、主導(dǎo)性信息所在的表作為主表。因此,在該關(guān)系中,定義學(xué)生表為主表,畢業(yè)證表為外表。這樣,畢業(yè)證表中的“學(xué)號”既是該表的主鍵,也是用于關(guān)聯(lián)學(xué)生表的外鍵。

提示:當(dāng)建立關(guān)系的公共屬性在一個表中是主鍵,在另一個表中也是主鍵或唯一索引時,建立的是一對一關(guān)系。

img

圖2.11 學(xué)生表和畢業(yè)證表之間的一對一關(guān)系

【例2.8】教師表和課程表之間的一對多關(guān)系。

教師實體和課程實體之間存在講授關(guān)系(見圖2.6)。它們沒有名字相同的屬性,但教師表中的屬性“工號”和課程表中的屬性“教師工號”,數(shù)據(jù)類型和含義相同,且“工號”在教師表中是主鍵,可以用這對屬性建立一個一對多關(guān)系,教師表是主表,課程表是外表。

【例2.9】學(xué)生表和教師表之間的關(guān)系。

教師實體和學(xué)生實體之間可能存在多種關(guān)系,如任課、指導(dǎo)等。但在圖2.6的各個表中,沒有體現(xiàn)這種關(guān)系的公共屬性。雖然學(xué)生表和教師表都有屬性“姓名”和“性別”,但是它們分別描述不同的實體,并不是公共屬性。如果需要表達以上某種師生關(guān)系,則可以選擇以下設(shè)計。

① 任課關(guān)系。圖2.6可以表達任課關(guān)系,不需要額外設(shè)計,因為通過學(xué)生表和選課表、選課表和課程表、課程表和教師表之間的關(guān)系,可以找到任課教師信息。

② 指導(dǎo)關(guān)系。可以在學(xué)生表中增加一個屬性“工號”,用來記錄該學(xué)生的指導(dǎo)教師,然后利用“工號”來建立教師表和學(xué)生表之間的一對多關(guān)系。

從圖2.6可以看出,盡管數(shù)據(jù)庫中的各個表是獨立的,但是表與表之間可以通過外鍵建立相互聯(lián)系,從而構(gòu)成一個整體的邏輯結(jié)構(gòu)。而且除了外鍵和一些必需的屬性,這些表中盡可能地減少了數(shù)據(jù)冗余。

3.關(guān)系模式

表中的行定義(即表頭)是實體所有相關(guān)屬性的集合,稱為該表的關(guān)系模式,通常記為:

img

為一個數(shù)據(jù)庫定義的所有關(guān)系模式的集合構(gòu)成該關(guān)系數(shù)據(jù)庫的邏輯結(jié)構(gòu)模型。“e學(xué)習(xí)”系統(tǒng)數(shù)據(jù)庫由9個關(guān)系模式構(gòu)成(見圖2.12),其中帶下畫線的屬性為主鍵,帶星號(*)的屬性是外鍵。

img

圖2.12 “e學(xué)習(xí)”系統(tǒng)數(shù)據(jù)庫的關(guān)系模型

關(guān)系模式確定后,在數(shù)據(jù)庫物理設(shè)計階段可以用表格詳細地描述關(guān)系模式的定義。

【例2.10】選課表關(guān)系模式的物理結(jié)構(gòu)設(shè)計。

圖2.13采用表格描述選課表關(guān)系模式的物理結(jié)構(gòu)設(shè)計,包括屬性名稱、屬性說明、類型定義、屬性限定和關(guān)系(外鍵)。“學(xué)號”的類型是長度為4的整數(shù),“課程號”是長度為4的字符串,“成績”是總長為5且保留1位小數(shù)的數(shù)值型。該表的主鍵為(學(xué)號,課程號)。該表通過“學(xué)號”與學(xué)生表建立關(guān)系,是學(xué)生表的外表;該表通過“課程號”與課程表建立關(guān)系,是課程表的外表。

img

圖2.13 選課表關(guān)系模式的物理結(jié)構(gòu)設(shè)計

除了用表格詳細描述關(guān)系模式,還可以用關(guān)系數(shù)據(jù)庫的結(jié)構(gòu)化查詢語言(Structured Query Language,SQL)中的數(shù)據(jù)定義語句來定義關(guān)系模式(參見4.1.2節(jié)),數(shù)據(jù)庫管理系統(tǒng)執(zhí)行這些描述命令后就可以在數(shù)據(jù)庫中建立數(shù)據(jù)表對象。

4.E-R圖向關(guān)系模型轉(zhuǎn)換

關(guān)系模型的邏輯結(jié)構(gòu)是一組關(guān)系模式的集合。將我們前面建立起來的概念模型E-R圖進行轉(zhuǎn)換就可以得到這些關(guān)系模式,即:將E-R圖中的實體及實體間的聯(lián)系轉(zhuǎn)換為關(guān)系模式,并確定這些關(guān)系模式的屬性和主鍵。主要轉(zhuǎn)換規(guī)則如下。

(1)實體到關(guān)系模式的轉(zhuǎn)換。一般來說,E-R圖中的一個實體轉(zhuǎn)換為一個關(guān)系模式,實體名就是關(guān)系名,實體的屬性就是關(guān)系模式的屬性,實體的關(guān)鍵字就是關(guān)系模式的主鍵。

(2)聯(lián)系到關(guān)系模式的轉(zhuǎn)換。聯(lián)系可以單獨轉(zhuǎn)換為一個關(guān)系模式,但根據(jù)聯(lián)系類型不同,通常采用以下不同的轉(zhuǎn)換規(guī)則。

① 一對一聯(lián)系的屬性與一個實體的主鍵一起合并到另一個實體對應(yīng)的關(guān)系模式中。

【例2.11】“學(xué)生”和“畢業(yè)證”實體之間聯(lián)系的轉(zhuǎn)換。

圖2.2(a)中的E-R圖可轉(zhuǎn)換為兩個關(guān)系模式,有兩種方案(見圖2.14)。

img

圖2.14 一對一聯(lián)系轉(zhuǎn)換為關(guān)系模式

分析可知,方案2優(yōu)于方案1。因為畢業(yè)生只占學(xué)生的一部分,方案1中學(xué)生關(guān)系模式的“證書號”和“發(fā)證時間”數(shù)據(jù)項有一部分為空,浪費存儲空間。進一步分析方案2中的畢業(yè)證關(guān)系模式,可以選擇“學(xué)號”和“證書號”中的一個作為主鍵,另一個建立唯一索引,保證其唯一性。這里我們選擇“證書號”作為主鍵。

② 一對多聯(lián)系的屬性與一端實體的主鍵一起合并到多端實體所對應(yīng)的關(guān)系模式中。

【例2.12】“課程”和“課件”實體之間聯(lián)系的轉(zhuǎn)換方法。

圖2.2(b)中的E-R圖轉(zhuǎn)換為兩個關(guān)系模式“課程”和“課件”(見圖2.15)。

img

圖2.15 一對多聯(lián)系轉(zhuǎn)換為關(guān)系模式

③ 一個多對多聯(lián)系必須轉(zhuǎn)換為一個獨立的關(guān)系模式。該關(guān)系模式的屬性包括聯(lián)系本身的屬性及兩端實體的主鍵,其主鍵由兩個實體的主鍵構(gòu)成。

【例2.13】“學(xué)生”和“課程”實體之間聯(lián)系的轉(zhuǎn)換方法。

圖2.2(c)中的E-R圖轉(zhuǎn)換為三個關(guān)系模式“學(xué)生”“課程”和“選課”(見圖2.16)。

img

圖2.16 一對一聯(lián)系轉(zhuǎn)換為關(guān)系模式

④ 三個或三個以上實體間的一個多元聯(lián)系可以轉(zhuǎn)化為一個關(guān)系模式。與該多元聯(lián)系相連的各個實體的主鍵及聯(lián)系本身的屬性均轉(zhuǎn)換為此關(guān)系模式的屬性,而此關(guān)系模式的主鍵包含各個實體的主鍵。

⑤ 具有相同主鍵的關(guān)系模式可以合并,但是否合并取決于實際設(shè)計需求。

2.2.2 關(guān)系操作

關(guān)系數(shù)據(jù)結(jié)構(gòu)描述了關(guān)系模型的靜態(tài)特性,實現(xiàn)了信息的結(jié)構(gòu)化存儲。關(guān)系操作則說明了其動態(tài)特性,描述關(guān)系模型中的數(shù)據(jù)允許執(zhí)行的操作及其操作規(guī)則的集合,實現(xiàn)了數(shù)據(jù)訪問支持。

關(guān)系操作以關(guān)系代數(shù)為理論基礎(chǔ)。關(guān)系表可以看作記錄的集合。傳統(tǒng)的集合操作包括并、交、差、笛卡兒積等,這些集合操作對應(yīng)數(shù)據(jù)庫針對行的基本操作。另外,關(guān)系模型還專門定義了針對列的操作,包括選擇、投影、連接等。上述所有操作的結(jié)果仍然是記錄的集合,即關(guān)系表。本書將在2.3.2節(jié)中介紹關(guān)系操作的有關(guān)理論基礎(chǔ)。

根據(jù)關(guān)系模型支持的各種操作運算,關(guān)系數(shù)據(jù)庫主要支持以下針對關(guān)系表的操作。

① 插入。在一個表中插入一條或多條新記錄。

② 刪除。從一個表刪除一條或多條滿足條件的記錄。

③ 修改。在一個表中修改滿足條件的記錄的某些字段的值。

④ 查找。從一個或多個表中提取滿足條件的數(shù)據(jù)記錄,生成計算列或匯總數(shù)據(jù)。

關(guān)系數(shù)據(jù)庫的基本操作語言是SQL,它以簡潔的語法支持上述各類操作。本書將在第4章中詳細講解SQL語言。

2.2.3 關(guān)系完整性約束

對關(guān)系表進行關(guān)系操作可能會使表中的數(shù)據(jù)發(fā)生變化。關(guān)系完整性約束是對關(guān)系模型中的數(shù)據(jù)取值及數(shù)據(jù)取值變化時的制約關(guān)系的描述,用于保證關(guān)系操作后表中的數(shù)據(jù)仍能有效地反映所描述實體的實際狀態(tài),保證多個表中相關(guān)數(shù)據(jù)的一致。

完整性約束規(guī)則是在表和屬性上定義的約束條件。數(shù)據(jù)庫管理系統(tǒng)依據(jù)這些約束條件對數(shù)據(jù)取值進行檢查,使不合法數(shù)據(jù)不能進入數(shù)據(jù)庫。關(guān)系模型的完整性約束規(guī)則主要包括域完整性規(guī)則、實體完整性規(guī)則和參照完整性規(guī)則。

1.域完整性規(guī)則

域完整性規(guī)則規(guī)定:屬性的取值必須是屬性值域中的值。

域完整性規(guī)則是針對屬性實施的。它在關(guān)系模型定義時,對屬性的數(shù)據(jù)類型、長度、單位、精度、格式、值域、是否允許為“空值”等進行限定。

【例2.14】學(xué)生表的域完整性規(guī)則應(yīng)用。

對學(xué)生表進行物理結(jié)構(gòu)設(shè)計,根據(jù)實際情況定義各字段的屬性(見圖2.17)。

類型定義限定了屬性的取值類型:“學(xué)號”是長度為4的整數(shù),“姓名”是長度不超過16的可變字符串,“性別”是長度為1的定長字符串,“出生日期”是日期型數(shù)據(jù)。

屬性取值的值域也可以限定。例如,“姓名”和“性別”不允許為空值(記為“Not Null”),“性別”的默認值是“男”,“出生日期”的值應(yīng)“>=1990-01-01”等。

img

圖2.17 學(xué)生表的域完整性規(guī)則應(yīng)用

提示:空值表示“不知道”或“未定義”。數(shù)值零、空字符或空字符串都不是空值。例如,沒有成績與成績?yōu)榱惴诛@然是不同的。“允許空”表示該屬性可以不填寫任何值,“不允許為空”要求任何記錄在該屬性處必須有值。默認值表示如果該字段不輸入值,則自動填入該值。

應(yīng)根據(jù)實體特點和應(yīng)用語義進行屬性限定,建立域完整性規(guī)則。

2.實體完整性規(guī)則

實體完整性規(guī)則規(guī)定:主鍵的取值不能為空且不能重復(fù)。

實體完整性規(guī)則是針對關(guān)系表而言的,目的是保證表中記錄的唯一性。如果表中定義了主鍵,關(guān)系數(shù)據(jù)庫管理系統(tǒng)就會強制檢查數(shù)據(jù)以保證實體完整性。

【例2.15】學(xué)生表的實體完整性規(guī)則應(yīng)用。

按照圖2.17(a)對學(xué)生表關(guān)系模式的定義,“學(xué)號”是主鍵,那么圖2.17(b)中的數(shù)據(jù)符合實體完整性規(guī)則。假定有一條新記錄(1103,王秋水,女,2000-03-04)需要插入學(xué)生表,系統(tǒng)會拒絕該請求,因為它違反了實體完整性規(guī)則,表中已存在一條主鍵值為1103的記錄。

3.參照完整性規(guī)則

參照完整性規(guī)則規(guī)定:表的外鍵的取值必須是其對應(yīng)的主表中主鍵的已有值或空值。

因為數(shù)據(jù)庫的表之間存在關(guān)聯(lián)關(guān)系,而且有些屬性在多個表中重復(fù)出現(xiàn),所以,為了保證數(shù)據(jù)完整性,需要對表之間重復(fù)出現(xiàn)的數(shù)據(jù)進行約束。參照完整性是在表間關(guān)系的基礎(chǔ)上實施的表之間的數(shù)據(jù)約束。

【例2.16】學(xué)科表和課程表之間的參照完整性規(guī)則應(yīng)用。

如圖2.10所示,學(xué)科表和課程表之間建立了一對多的關(guān)系,課程表中的“學(xué)科號”是外鍵。如果在這個關(guān)系上實施參照完整性約束,那么課程表中“學(xué)科號”的取值必須是空值或在學(xué)科表中“學(xué)科號”屬性出現(xiàn)過的值。也就是說,先有學(xué)科再有學(xué)科下的課程,如果課程表的“學(xué)科號”屬性取值允許為空,則表示該課程還沒有確定屬于哪個學(xué)科。

對數(shù)據(jù)表進行更新操作時,可能會破壞表之間的參照完整性。數(shù)據(jù)庫管理系統(tǒng)支持進一步根據(jù)操作類型設(shè)置限制細節(jié),這些限制包括插入約束、刪除約束和更新約束。

(1)插入約束。設(shè)置插入約束,可以在外表中插入新記錄時,要求外鍵值在主表中已存在或為空值(如果允許為空)。

例如,向圖2.10所示的課程表中添加一條記錄(C065,明史,2,T001,S11),操作會被拒絕,因為學(xué)科表中不存在S11學(xué)科,該記錄違反了參照完整性規(guī)則。

(2)刪除約束。設(shè)置刪除約束,可以保證在從主表中刪除記錄時保持外表數(shù)據(jù)的完整性。刪除約束有兩種。一種是限制刪除,即:如果要刪除記錄的主鍵值在某個外表中存在,則不允許刪除;另一種是級聯(lián)刪除,即:在刪除主表中記錄之前,將外表中外鍵值與之匹配的記錄全部刪除。

例如,從圖2.10所示的學(xué)科表中刪除學(xué)科號為S06的記錄,系統(tǒng)會檢查課程表,發(fā)現(xiàn)有相關(guān)的“線性代數(shù)”等課程。如果設(shè)置了限制刪除,則系統(tǒng)會拒絕刪除操作,以免這些相關(guān)課程失去所屬學(xué)科的信息。如果設(shè)置了級聯(lián)刪除,則系統(tǒng)會在刪除學(xué)科表記錄的同時,將課程表中所有學(xué)科號是S06的記錄全部刪除。

(3)更新約束。設(shè)置更新約束,可以保證在修改主表中的主鍵值時保持外表數(shù)據(jù)的一致性。更新約束有兩種。一種是限制更新,即:如果要更新記錄的主鍵的取值在某個外表中存在,則不允許更新。另一種是級聯(lián)更新,即:在更新主表中主鍵之后,將外表中與之匹配的外鍵值全部更新。

例如,將圖2.10所示的學(xué)科表中學(xué)科號S06修改為S88,系統(tǒng)檢查課程表發(fā)現(xiàn)有相關(guān)的“線性代數(shù)”等課程。如果設(shè)置了限制更新,則系統(tǒng)會拒絕更新操作;如果設(shè)置了級聯(lián)更新,則系統(tǒng)會在修改學(xué)科表的同時,將課程表中所有學(xué)科號是S06的課程的學(xué)科號全部改為S88。

提示:本例中S88必須是學(xué)科表中不存在的學(xué)科號,否則違反實體完整性規(guī)則。

通過以上例子可以發(fā)現(xiàn),保證數(shù)據(jù)的完整性和一致性對數(shù)據(jù)庫是至關(guān)重要的。在數(shù)據(jù)庫設(shè)計時,必須充分考慮并建立關(guān)系完整性約束規(guī)則。關(guān)系完整性約束規(guī)則的用途主要體現(xiàn)在以下三個方面。

① 保證數(shù)據(jù)的有效、完整和一致,避免給應(yīng)用帶來困難或錯誤。

② 減少不合法的垃圾數(shù)據(jù)在數(shù)據(jù)庫中的堆積,保證數(shù)據(jù)質(zhì)量。

③ 簡化應(yīng)用程序開發(fā),減輕輸入有效性檢查的負擔(dān),有些數(shù)據(jù)還可以通過級聯(lián)操作由數(shù)據(jù)庫管理系統(tǒng)自動維護。

關(guān)系數(shù)據(jù)庫管理系統(tǒng)提供了比較完善的約束機制。只要在定義表結(jié)構(gòu)時考慮域完整性和實體完整性,并且在建立表之間的關(guān)系后進行參照完整性約束方式的設(shè)置,關(guān)系數(shù)據(jù)庫管理系統(tǒng)就會根據(jù)這些規(guī)則來自動實施關(guān)系完整性約束。

主站蜘蛛池模板: 平果县| 青铜峡市| 舞钢市| 岱山县| 丁青县| 普宁市| 罗平县| 武定县| 沙坪坝区| 新竹市| 科尔| 三河市| 体育| 西城区| 蓬莱市| 宣城市| 那曲县| 岳阳县| 宁城县| 榆中县| 肥东县| 靖边县| 商丘市| 西城区| 广丰县| 嵊州市| 乡城县| 漯河市| 静海县| 中牟县| 永仁县| 阳城县| 蒙阴县| 岑巩县| 桦南县| 临武县| 庆城县| 清苑县| 茌平县| 韶关市| 南部县|