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