向瑜
一 、概述
在關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)中,數(shù)據(jù)完整性約束、數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作是組成其數(shù)據(jù)模型的三個(gè)基本要素。其中的數(shù)據(jù)完整性約束是一組完整性規(guī)則的集合,它規(guī)定數(shù)據(jù)庫(kù)狀態(tài)及狀態(tài)變化所應(yīng)滿足的條件,以保證數(shù)據(jù)的正確性、有效性和相容性。完整性規(guī)則是給定的數(shù)據(jù)模型中數(shù)據(jù)及其聯(lián)系所具有的制約和存儲(chǔ)規(guī)則,用以限定符合數(shù)據(jù)模型的數(shù)據(jù)庫(kù)狀態(tài)及狀態(tài)的變化,以保證當(dāng)授權(quán)用戶對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改時(shí)保證數(shù)據(jù)的正確、有效和相容,不會(huì)破壞數(shù)據(jù)的一致性,防止對(duì)數(shù)據(jù)的意外損壞。
在數(shù)據(jù)庫(kù)課程中,完整性約束的設(shè)計(jì)與實(shí)現(xiàn)是教學(xué)中非常重要的一部分,在教學(xué)中要讓學(xué)生充分理解并掌握完整性約束的重要性和實(shí)現(xiàn)方法。為了幫助學(xué)生理解和掌握,本文通過(guò)一個(gè)他們較熟悉的選課系統(tǒng)來(lái)介紹基于SQL Server的數(shù)據(jù)完整性案例。
二、數(shù)據(jù)庫(kù)完整性案例
在學(xué)生選課系統(tǒng)中,一個(gè)學(xué)校有多名學(xué)生,每個(gè)學(xué)生有唯一的學(xué)號(hào);學(xué)校的課程有若干門,每一門課程均有各自的課程編號(hào),有些課程如“計(jì)算機(jī)應(yīng)用基礎(chǔ)”選修的人較多,相同的課程成績(jī)有多個(gè),它們具有相同的課程編號(hào),數(shù)據(jù)庫(kù)要記錄相同編號(hào)的課程有多少個(gè)選修成績(jī),未被選修的課程有哪些;每個(gè)選修的信息和未選修的信息均要記錄在數(shù)據(jù)庫(kù)中。
根據(jù)以上語(yǔ)義,進(jìn)行相應(yīng)的概念模型設(shè)計(jì),得到如圖1所示的系統(tǒng)E-R圖,從圖中可以看出,系統(tǒng)有兩個(gè)實(shí)體:學(xué)生和課程,由于一個(gè)學(xué)生可以選修多門課程,一門課程也可以被多個(gè)學(xué)生選修,因此兩個(gè)實(shí)體間的關(guān)系是多對(duì)多(m:n)。E-R模型主要是面向用戶的,需要將其轉(zhuǎn)換為具體數(shù)據(jù)庫(kù)管理系統(tǒng)支持的數(shù)據(jù)模型。將這個(gè)概念模型轉(zhuǎn)換為關(guān)系數(shù)據(jù)庫(kù)模型時(shí),可轉(zhuǎn)換為如下的3個(gè)表:學(xué)生實(shí)體對(duì)應(yīng)student表,課程實(shí)體對(duì)應(yīng)course表,表示學(xué)生實(shí)體和課程實(shí)體多對(duì)多關(guān)系的score表。三個(gè)表的結(jié)構(gòu)如表1~表3所示。
1.實(shí)體完整性
一個(gè)實(shí)體在數(shù)據(jù)庫(kù)中表現(xiàn)為表中的一條記錄,實(shí)體完整性保證表中每條記錄必須是唯一的,可通過(guò)主鍵或唯一碼、唯一索引和標(biāo)識(shí)列等方式來(lái)實(shí)現(xiàn)。
在student表和course表中,可分別采用studentno和courseno作主鍵,保證了記錄的唯一與實(shí)體的完整性。在score表中,由于一個(gè)學(xué)生可以選修多門課程,一門課程可以被多個(gè)學(xué)生同時(shí)選修,因此studentno和courseno分別作主鍵都不合適,此時(shí)在score表中可以將studentno和courseno兩個(gè)字段作復(fù)合主鍵。在數(shù)據(jù)庫(kù)設(shè)計(jì)中,當(dāng)復(fù)合主鍵的元素大于等于3時(shí),通常還可增加一個(gè)沒有實(shí)際意義的編號(hào)字段作為主鍵,該字段無(wú)其他含義,只是用來(lái)標(biāo)注記錄的唯一性。在教學(xué)過(guò)程中,可以通過(guò)設(shè)置score表的主鍵來(lái)講解復(fù)合主鍵的概念,強(qiáng)調(diào)復(fù)合主鍵不是指有多個(gè)主鍵,而是指將多個(gè)字段組成一個(gè)整體來(lái)共同構(gòu)成主鍵,標(biāo)識(shí)記錄的唯一性。
2.參照完整性
參照完整性又稱引用完整性,是指兩個(gè)表的主鍵與外鍵之間定義的數(shù)據(jù)完整性,表明了兩個(gè)表之間的關(guān)系。參照完整性可以保證兩個(gè)引用表間數(shù)據(jù)的一致性,可以通過(guò)外鍵、檢查、觸發(fā)器和存儲(chǔ)過(guò)程等方式實(shí)現(xiàn)。
在score表中的studentno要求必須是student表中已經(jīng)存在的studentno,因此score表中的studentno字段作為外鍵,引用了student表的studentno字段值。同理score表中的courseno也是外鍵,引用了course表的courseno字段值。
在教學(xué)過(guò)程中,為了讓學(xué)生更好地體會(huì)并掌握外鍵的概念,可采取以下辦法:
(1)在score表中添加一條記錄,該記錄中的studentno值在student表中不存在。將返回錯(cuò)誤信息。測(cè)試結(jié)果:記錄將無(wú)法添加到score表中。
(2)同理如果刪除student表中的一個(gè)學(xué)生信息,該學(xué)生在score表中有成績(jī)信息。
測(cè)試結(jié)果:無(wú)法刪除。原因是如果刪除了,score表中對(duì)應(yīng)的記錄就將失去意義,無(wú)法確定這條信息是那個(gè)學(xué)生的成績(jī)信息,因?yàn)樵搶W(xué)生的信息已經(jīng)在student表中刪除。
設(shè)定參照完整性之后,student表、course表和score表之間的關(guān)系如圖2所示:
從圖中可見:student表和score表, course表和score表都是一對(duì)多的關(guān)系。
3.域完整性
域就是指表中的列,域完整性要求列的數(shù)值具有正確的類型、格式和有效值范圍,并確定是否允許有空值。通常使用有效性檢查強(qiáng)制域完整性,也可以通過(guò)限定列中允許的數(shù)據(jù)類型、格式或有效值范圍來(lái)強(qiáng)制數(shù)據(jù)完整性。默認(rèn)值、檢查、外鍵、數(shù)據(jù)類型和規(guī)則也可用來(lái)實(shí)現(xiàn)域完整性。
如在student表中,email表示學(xué)生的郵箱地址,輸入數(shù)據(jù)時(shí)應(yīng)當(dāng)包含一個(gè)“@”符號(hào),如果不滿足此要求,則會(huì)判斷其是不合法的數(shù)據(jù),并禁止輸入。此時(shí)需在student表中添加一條check約束,“email like ‘%@%”。
4.用戶自定義完整性
用戶還可以根據(jù)其應(yīng)用環(huán)境的不同,對(duì)數(shù)據(jù)庫(kù)設(shè)置一些特殊的約束條件(自定義完整性),反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語(yǔ)句要求。用戶自定義完整性涵蓋的內(nèi)容比較多,例如:字段的數(shù)據(jù)類型、字段的約束、觸發(fā)器,等等。
(1)字段的數(shù)據(jù)類型。在course表中,period字段表示課程的學(xué)時(shí)數(shù),數(shù)據(jù)類型為tinyint,credit字段則表示該門課所占的學(xué)分,數(shù)據(jù)類型為numeric,限定了數(shù)據(jù)類型就可以確保對(duì)應(yīng)的字段值只能是數(shù)值類型的數(shù)據(jù),避免由于操作錯(cuò)誤輸入一些非數(shù)字字符。score表中的usually和final字段,數(shù)據(jù)類型都是numeric,不僅避免了非數(shù)字型數(shù)據(jù)的存儲(chǔ),另外針對(duì)兩個(gè)數(shù)值型字段,還可以利用表達(dá)式進(jìn)行簡(jiǎn)單計(jì)算,如令二者各占一定百分值,求出綜合成績(jī)。
在教學(xué)中,要給學(xué)生強(qiáng)調(diào)選擇數(shù)據(jù)類型的重要性,不能將所有字段的數(shù)據(jù)類型都定義為char類型,應(yīng)該根據(jù)語(yǔ)義為字段選擇合適的數(shù)據(jù)類型,SQL Server有許多內(nèi)置的函數(shù)可以用于不同數(shù)據(jù)類型的數(shù)據(jù)上。
(2)字段的約束。字段的約束是為了保證語(yǔ)義的正確性,定義關(guān)于列中允許值的規(guī)則,是強(qiáng)制實(shí)施完整性的標(biāo)準(zhǔn)機(jī)制。如本例中的usually和final項(xiàng),數(shù)值均要求為0~100,即score表中應(yīng)該添加兩條check約束,“usually>=0 and usually<=100”和“final between 0 and 100”。另外在本例中,student表中的sex字段的取值只能是“男”或“女”,也應(yīng)該添加對(duì)應(yīng)的check約束:“sex in(‘男‘女)”。
在教學(xué)中要特別強(qiáng)調(diào)數(shù)據(jù)庫(kù)設(shè)計(jì)中字段約束的重要性,這是對(duì)其語(yǔ)義的保障,這一工作最好能在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)就完成,將會(huì)極大程度地減少工作量且更符合規(guī)范化設(shè)計(jì)的流程。
(3)觸發(fā)器。觸發(fā)器是一種響應(yīng)數(shù)據(jù)操作或數(shù)據(jù)定義語(yǔ)言事件而執(zhí)行的特殊類型的存儲(chǔ)過(guò)程,是在用戶對(duì)某一表中的數(shù)據(jù)進(jìn)行更新、插入和刪除操作時(shí)被觸發(fā)執(zhí)行的一段程序。觸發(fā)器功能強(qiáng)大,能夠?yàn)閿?shù)據(jù)完整性和系統(tǒng)的總體操作增加極大的靈活性。觸發(fā)器在功能上類似于CHECK約束,但是使用更靈活,可以跨表、數(shù)據(jù)庫(kù)或觸發(fā)器工作。通常用觸發(fā)器來(lái)滿足業(yè)務(wù)邏輯,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的參照完整性。
觸發(fā)器是教學(xué)過(guò)程中的一個(gè)難點(diǎn),在教學(xué)中要注意兩點(diǎn):第一,要強(qiáng)調(diào)觸發(fā)器的作用和執(zhí)行過(guò)程,觸發(fā)器常用來(lái)實(shí)現(xiàn)自定義完整性,觸發(fā)器的執(zhí)行不是用戶直接調(diào)用,而是在對(duì)某個(gè)表執(zhí)行特定的操作,如增加刪除修改后自動(dòng)的觸發(fā)。可以通過(guò)以上案例分析觸發(fā)器是如何實(shí)現(xiàn)特定的業(yè)務(wù)邏輯。第二,在編寫觸發(fā)器中,通常會(huì)用到系統(tǒng)的兩個(gè)臨時(shí)表deleted和inserted,如在本例triUpdatescore觸發(fā)器中,修改前記錄信息放在deleted表中,修改后的記錄則放在了inserted表中。
三、結(jié)論
本文通過(guò)一個(gè)完整的案例介紹了數(shù)據(jù)庫(kù)課程中的數(shù)據(jù)完整性實(shí)現(xiàn)的過(guò)程。在實(shí)際教學(xué)中,教師也可通過(guò)理論講解、案例分析、設(shè)計(jì)和實(shí)現(xiàn)等多個(gè)環(huán)節(jié)相結(jié)合的方式來(lái)讓學(xué)生來(lái)理解數(shù)據(jù)庫(kù)完整性的作用和實(shí)現(xiàn)方法,為學(xué)生今后從事相關(guān)數(shù)據(jù)庫(kù)開發(fā)工作奠定一定的基礎(chǔ)。
參考文獻(xiàn):
[1]姜桂洪.SQL Server 2008數(shù)據(jù)庫(kù)應(yīng)用與開發(fā)[M].北京:清華大學(xué)出版社,2015.
[2](美)Abraham Silberschatz ,(美)Henry F.Korth,(美)S.Sudarshan.數(shù)據(jù)庫(kù)系統(tǒng)概念(原書第6版)[M].楊冬青,李紅燕,唐世渭,譯.機(jī)械工業(yè)出版社,2012.
[3]何玉潔,劉福剛.數(shù)據(jù)庫(kù)原理及應(yīng)用[M].北京:人民郵電出版社,2012.
[4]韓 雪.教學(xué)管理系統(tǒng)的研究與設(shè)計(jì)[D].長(zhǎng)春:吉林大學(xué),2008.
[5]陳永強(qiáng),張志強(qiáng).SQL Server 2005 Web應(yīng)用開發(fā)[M].北京:清華大學(xué)出版社,2008.
[6]金玉明.PB與SQL Server的連接技術(shù)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2007(24).
[7]閆 旭.淺談SQL Server數(shù)據(jù)庫(kù)的特點(diǎn)和基本功能[J].價(jià)值工程,2012(22):229-231.