陳偉蓮
摘要: 在數(shù)據(jù)庫系統(tǒng)及應(yīng)用教學(xué)中,傳統(tǒng)教學(xué)采用數(shù)學(xué)公式對關(guān)系模型數(shù)據(jù)表范式設(shè)計進(jìn)行定義和描述,使多數(shù)學(xué)生理解得不是很透徹。就此問題,文章通過實例探討了關(guān)系數(shù)據(jù)庫SQL Server數(shù)據(jù)表范式設(shè)計的教學(xué),使得教師可以簡單教學(xué),學(xué)生易于理解,對于數(shù)據(jù)庫設(shè)計能力有進(jìn)一步的提高,對教學(xué)質(zhì)量有進(jìn)一步的提升。
關(guān)鍵詞: 數(shù)據(jù)表; 范式; 教學(xué)實例; 設(shè)計能力
中圖分類號:TP393.09? ? ? ? ? 文獻(xiàn)標(biāo)識碼:A? ? ?文章編號:1006-8228(2021)10-96-03
Research on the teaching of detailed design of SQL Server data table paradigm
Chen Weilian
(Information Technology Department of Guangdong Polytechnic College, Zhaoqing, Guangdong 526061, China)
Abstract: In the teaching of database system and application, the traditional teaching uses mathematical formulas to define and describe the design of data table paradigm of relational model, so that most students do not have a very thorough understanding of it. On this issue, this paper discusses the teaching of relational database SQL Server data table paradigm design through examples, so that teachers can simply teach, students are easy to understand, further improve their database design ability thereby the teaching quality.
Key words: data table; paradigm; teaching example; design ability
0 引言
在數(shù)據(jù)庫系統(tǒng)及應(yīng)用教學(xué)過程中,除了考慮教材因素還要考慮學(xué)生理解能力參差不齊的因素。在關(guān)系模型數(shù)據(jù)庫SQL Server數(shù)據(jù)表范式設(shè)計上,傳統(tǒng)教學(xué)采用數(shù)學(xué)公式進(jìn)行定義和描述,多數(shù)學(xué)生理解得不是很清楚明白,為了使得老師可以簡單教學(xué),學(xué)生易于理解,對數(shù)據(jù)庫設(shè)計能力有進(jìn)一步的提高,本文就此問題,擬對關(guān)系數(shù)據(jù)庫SQL Server數(shù)據(jù)表范式細(xì)化設(shè)計教學(xué)進(jìn)行一些實例探討。
本文在闡述關(guān)系數(shù)據(jù)庫范式定義基礎(chǔ)上,結(jié)合具體數(shù)據(jù)表結(jié)構(gòu),因SQL語言進(jìn)行表述,并生成具體數(shù)據(jù)表。通過這些實例,教師會更容易傳授模塊知識,讓學(xué)生擺脫數(shù)學(xué)公式的抽象感,用更接近實際應(yīng)用的數(shù)據(jù)表進(jìn)行理解,從而更好學(xué)習(xí)數(shù)據(jù)庫基本原理。
1 關(guān)系數(shù)據(jù)庫范式定義
根據(jù)通用教材定義,關(guān)系數(shù)據(jù)庫范式一般被定義為,在關(guān)系數(shù)據(jù)庫中的關(guān)系是需要滿足一定條件的,滿足這些不同程度的規(guī)范化就叫做范式,范式是關(guān)系數(shù)據(jù)庫理論的基礎(chǔ),也是我們在設(shè)計數(shù)據(jù)庫結(jié)構(gòu)過程中所要遵循的規(guī)則和指導(dǎo)方法[1]。目前有跡可尋的共有八種范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三個范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF),本文就探討此三范式。
第一范式(1NF)是指如果一個關(guān)系的每一屬性都是不可再分的,則該關(guān)系屬于第一范式。也就是說,數(shù)據(jù)庫表中的每一列都是不可分割的基本數(shù)據(jù)項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或不能有重復(fù)的屬性[2]。如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個新的實體,新的實體由重復(fù)的屬性構(gòu)成,新實體與原實體之間為一對多關(guān)系。
第二范式(2NF)是指如果關(guān)系模型為第一范式,并且關(guān)系中的每一個非主屬性完全函數(shù)依賴于此關(guān)系的某個候選鍵,則稱該關(guān)系為第二范式,第二范式是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF) [3]。第二范式(2NF)要求數(shù)據(jù)庫表中的每個實例或行必須可以被唯一地區(qū)分,為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標(biāo)識。
第三范式(3NF)是指如果關(guān)系模型是屬于第二范式,并且它的每個非主屬性都不傳遞依賴于此關(guān)系的主屬性,則稱該關(guān)系是第三范式[4]。由此可見,第二范式(2NF)可從第一范式(1NF)消除非主屬性對主屬性的部分函數(shù)依賴后獲得,而第三范式(3NF)可從第二范式(2NF)消除非主屬性對主屬性的傳遞函數(shù)依賴后獲得。
2 數(shù)據(jù)表范式細(xì)化設(shè)計教學(xué)實例
2.1 第一范式(1NF)教學(xué)實例
根據(jù)定義可知,第一范式就是無重復(fù)的列。先列舉一個實例,設(shè)有一個簡明學(xué)生數(shù)據(jù)表stu1,由學(xué)號、姓名、性別、年齡、通訊方式組成的表,如表1。
由于表1中通訊方式列包括微信號或QQ號,有嵌套列,沒有達(dá)到第一范式的基本要求見,在SQLSERVER無法實現(xiàn)數(shù)據(jù)表表述,此時需要將其規(guī)范化為第一范式??梢詫⑼ㄓ嵎绞椒譃椤拔⑿盘枴焙汀癚Q號”兩個屬性,即學(xué)生(學(xué)號,姓名,性別,年齡,微信號,QQ號),SQL語言描述如下:
create table stu2(學(xué)號 int,姓名 varchar(10),
性別 char(2),年齡 int, 微信號 int,QQ號 int)
insert into stu2 values
(202001,'小陳','男',16,1350103,3964531)
insert into stu2 values
(202002,'小李','男',15,1340203,4561326)
insert into stu2 values
(202003,'小黃','女',16,223583,4789561)
insert into stu2 values
(202004,'小何','女',17,1369874,6969583)
在SQL Server中實現(xiàn)數(shù)據(jù)表如表2,達(dá)到第一范式的基本要求。其中,在任何一個關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對關(guān)系模式的基本要求,不滿足第一范式(1NF)的數(shù)據(jù)庫就不是關(guān)系數(shù)據(jù)庫。
2.2 第二范式(2NF)教學(xué)實例
根據(jù)定義,第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,數(shù)據(jù)庫表中非關(guān)鍵字段對任一候選關(guān)鍵字段的都不存在部分函數(shù)依賴[5]。即是認(rèn)為,第二范式(2NF)要求數(shù)據(jù)庫表中的每個實例或行必須可以被唯一地區(qū)分,為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標(biāo)識,這個唯一屬性列被稱為主關(guān)鍵字或主鍵、主碼。因此,當(dāng)?shù)谝环妒剑?NF)設(shè)計中當(dāng)主鍵為組合關(guān)鍵字時,必須將其規(guī)范化為第二范式(2NF),否則會導(dǎo)致數(shù)據(jù)表數(shù)據(jù)冗余及更新異常等問題。
列舉一個實例,設(shè)定一個學(xué)生課程成績表sci1,由學(xué)號、姓名、課程號、課程名稱、成績等項組成,關(guān)鍵字為組合關(guān)鍵字(學(xué)號,課程號),SQL語言描述如下:
create table sci1(學(xué)號 int,姓名 char(10), 課程號 int,
課程名稱 char(10),成績 int, primary key(學(xué)號,課程號))
insert into sci1 values(202001,'小陳',101,'中文',76)
insert into sci1 values(202002,'小李',101,'中文',80)
insert into sci1 values(202003,'小黃',101,'中文',91)
insert into sci1 values(202001,'小陳',102,'數(shù)學(xué)',66)
在SQL Server中實現(xiàn)數(shù)據(jù)表如表3,該表符合第一范式(1NF)定義,但是存在如下決定關(guān)系:(課程號)→(課程名稱);(學(xué)號)→(姓名)。存在組合關(guān)鍵字中的字段決定非關(guān)鍵字的情況,由于非主屬性課程名稱僅依賴于課程號,對關(guān)鍵字(學(xué)號,課程號)只是部分的依賴,而不是完全依賴,不符合2NF的基本要求。
要將上述數(shù)據(jù)表規(guī)范為第二范式(2NF),可以根據(jù)定義,為數(shù)據(jù)表增加一列ID,作為各個實例的唯一主鍵,ID為自增序列數(shù),SQL語言描述如下:
create table sci2(ID int identity(1,1) primary key,
學(xué)號int,姓名 char(10), 課程號 int, 課程名稱 char(10),
成績 int)
insert into sci2 values(202001,'小陳',101,'中文',76)
insert into sci2 values(202002,'小李',101,'中文',80)
insert into sci2 values(202003,'小黃',101,'中文',91)
insert into sci2 values(202001,'小陳',102,'數(shù)學(xué)',66)
上述設(shè)計的數(shù)據(jù)庫表是符合第二范式的,部分消除了更新異常、插入異常和刪除異常。但是如此設(shè)計的學(xué)生課程成績表會導(dǎo)致數(shù)據(jù)冗余:同一門課程號由多個學(xué)生選修,課程名稱就重復(fù)學(xué)生數(shù)減1次;同一個學(xué)號選修了多門課程,姓名就重復(fù)學(xué)生數(shù)減1次,所以有必要進(jìn)一步優(yōu)化。
2.3 第三范式(3NF)教學(xué)實例
在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。所謂傳遞函數(shù)依賴,指的是如果存在"A→B→C"的決定關(guān)系,則C傳遞函數(shù)依賴于A。因此,滿足第三范式的數(shù)據(jù)庫表應(yīng)不存在如下依賴關(guān)系:關(guān)鍵字段→非關(guān)鍵字段x→非關(guān)鍵字段y。簡單來說,就是非主鍵字段不能相互依賴[6]。
基于上述表4學(xué)生課程成績表(ID,學(xué)號,姓名,課程號,課程名稱,成績)關(guān)系分析,關(guān)鍵字為單一關(guān)鍵字“ID”,存在如下決定關(guān)系:
(ID)→(學(xué)號)→(姓名)
(ID)→(課程號)→(課程名稱)
即存在非關(guān)鍵字段“姓名”、“課程名稱”對關(guān)鍵字段“ID”的傳遞函數(shù)依賴,以不屬于第三范式,會存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況。
在細(xì)化教學(xué)案例中,要把表4學(xué)生課程成績表sci2改為如下三個表:學(xué)生表:stu(學(xué)號,姓名);課程表:cou(課程號,課程名稱);成績表:rep(學(xué)號,課程號,成績)。
細(xì)化后的學(xué)生表見表5,SQL語言描述如下:
create table stu(學(xué)號 int,姓名 char(10),primary key(學(xué)號))
insert into stu values(202001,'小陳')
insert into stu values(202002,'小李')
insert into stu values(202003,'小黃')
細(xì)化后的課程表見表6,SQL語言描述如下:
create table cou(課程號 int, 課程名稱 char(10),
primary key (課程號))
insert into cou values(101,'中文')
insert into cou values(102,'數(shù)學(xué)')
細(xì)化后的成績表見表7,SQL語言描述如下:
create table rep(學(xué)號 int,課程號 int, 成績 int,
primary key (學(xué)號,課程號))
insert into rep values(202001,101,76)
insert into rep values(202002,101,80)
insert into rep values(202003,101,91)
insert into rep values(202001,102,66)
如此設(shè)計的數(shù)據(jù)庫表是符合第三范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常,但是實際應(yīng)用中太過細(xì)化的設(shè)計會造成查詢連接的復(fù)雜度。
3 結(jié)束語
通過對關(guān)系數(shù)據(jù)庫SQL Server數(shù)據(jù)表范式實例化細(xì)化教學(xué),讓教師在教學(xué)上有具體應(yīng)用例子,易于將理論融入實踐教學(xué),易將數(shù)學(xué)公式用實際數(shù)據(jù)庫表呈現(xiàn);而學(xué)生由于有實際應(yīng)用例子作為參照物,容易理解幾種關(guān)系數(shù)據(jù)庫范式,在數(shù)據(jù)庫實際應(yīng)用中有一定直觀的認(rèn)識,在此認(rèn)識基礎(chǔ)上獲得一定的設(shè)計經(jīng)驗,能更好的投入到符合實際需要的設(shè)計,對數(shù)據(jù)表設(shè)計的能力會有進(jìn)一步的提高。將數(shù)據(jù)表范式設(shè)計實例化模式取得了一定的實際教學(xué)效果,獲得了大多數(shù)學(xué)生的肯定,希望這對同類高校數(shù)據(jù)庫原理及應(yīng)用課程教學(xué)改革有一定的參考意義。
參考文獻(xiàn)(References):
[1] 史嘉權(quán).數(shù)據(jù)庫系統(tǒng)教程[M].清華大學(xué)出版社,2001.
[2] 劉世峰.數(shù)據(jù)庫基礎(chǔ)與應(yīng)用[M].中央開放大學(xué)出版社,2004.
[3] 王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論[M].高等教育出版社,2006.
[4] 孫俊吾.淺析關(guān)系數(shù)據(jù)庫中關(guān)系模式的規(guī)范化理論[J].職業(yè)技術(shù),2009.7.
[5] 馬雪英.基于函數(shù)依賴的模式分解方法[J].計算機(jī)應(yīng)用與軟件,2004.4:31-33
[6] 季飛.關(guān)系數(shù)據(jù)庫規(guī)范化應(yīng)用研究[J].科技資訊,2007.36.