《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第3章_第1頁
《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第3章_第2頁
《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第3章_第3頁
《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第3章_第4頁
《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第3章_第5頁
已閱讀5頁,還剩149頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

3.1數(shù)據(jù)庫設(shè)計(jì)方法

3.2數(shù)據(jù)庫設(shè)計(jì)過程

3.3SQLServer數(shù)據(jù)庫系統(tǒng)

3.4創(chuàng)建SQLServer數(shù)據(jù)庫

實(shí)驗(yàn)3創(chuàng)建數(shù)據(jù)庫

第3章數(shù)據(jù)庫設(shè)計(jì)與創(chuàng)建

1.傳統(tǒng)數(shù)據(jù)庫設(shè)計(jì)方法

1)需求分析階段

數(shù)據(jù)庫設(shè)計(jì)的首要任務(wù)是準(zhǔn)確地了解和分析用戶需求(包括數(shù)據(jù)與處理)和現(xiàn)有條件,確定創(chuàng)建數(shù)據(jù)庫的目的和要求以及數(shù)據(jù)庫的使用方法。為了完成這個任務(wù),數(shù)據(jù)庫設(shè)計(jì)者應(yīng)該同應(yīng)用領(lǐng)域的專家和用戶進(jìn)行充分的溝通和交流,系統(tǒng)調(diào)查和分析用戶的真實(shí)需求以及現(xiàn)有的應(yīng)用環(huán)境和技術(shù)條件,盡可能搜集足夠的數(shù)據(jù)庫設(shè)計(jì)的依據(jù)。3.1數(shù)據(jù)庫設(shè)計(jì)方法

2)概念結(jié)構(gòu)設(shè)計(jì)階段

概念結(jié)構(gòu)設(shè)計(jì)是整個數(shù)據(jù)庫設(shè)計(jì)的關(guān)鍵,它通過對用戶需求進(jìn)行綜合、歸納與抽象,形成一個獨(dú)立于具體DBMS的數(shù)據(jù)庫系統(tǒng)的概念模型:E-R模型或面向?qū)ο竽P汀F淠康氖巧梢环N簡單的數(shù)據(jù)描述方法,使得所描述的數(shù)據(jù)的組織和處理符合用戶和開發(fā)者的意圖。概念結(jié)構(gòu)設(shè)計(jì)一般分為如下三步(以E-R模型為例)。

(1)設(shè)計(jì)局部E-R圖:用E-R圖描述單個實(shí)體或部分實(shí)體之間的聯(lián)系。

(2)設(shè)計(jì)全局E-R圖:將局部E-R圖合并在一起,得到初步的全局E-R圖。合并過程中,可能會出現(xiàn)屬性命名不一致或冗余的聯(lián)系等,都需要解決。

(3)評審:即由數(shù)據(jù)庫管理員和用戶對數(shù)據(jù)庫全局概念結(jié)構(gòu)進(jìn)行評審,使得描述準(zhǔn)確、結(jié)構(gòu)完整和文檔齊備。

3)邏輯結(jié)構(gòu)設(shè)計(jì)階段

邏輯結(jié)構(gòu)設(shè)計(jì)是將概念數(shù)據(jù)模型轉(zhuǎn)換為具體DBMS所支持的數(shù)據(jù)模型,對其進(jìn)行優(yōu)化。例如,將用E-R圖表示的概念模型轉(zhuǎn)換為SQLServer支持的關(guān)系數(shù)據(jù)模型,然后根據(jù)用戶的處理需求以及安全性的考慮等,在基本表的基礎(chǔ)上建立必要的視圖,形成適用于不同用戶的外模式。一般來說,要經(jīng)歷初始模式設(shè)計(jì)、子模式設(shè)計(jì)、模式評價和修正等階段,最后才能導(dǎo)出數(shù)據(jù)庫的邏輯結(jié)構(gòu)。

4)物理結(jié)構(gòu)設(shè)計(jì)階段

數(shù)據(jù)庫物理設(shè)計(jì)是根據(jù)DBMS的特點(diǎn)和處理的需要,為邏輯數(shù)據(jù)模型選取一個適合于應(yīng)用環(huán)境的物理結(jié)構(gòu)(內(nèi)模式),包括數(shù)據(jù)庫文件的組織格式、內(nèi)部存儲結(jié)構(gòu)、建立索引和表的聚集等。

5)數(shù)據(jù)庫實(shí)施階段

在數(shù)據(jù)庫實(shí)施階段,設(shè)計(jì)人員運(yùn)用DBMS提供的數(shù)據(jù)庫語言以及軟件開發(fā)工具,根據(jù)邏輯設(shè)計(jì)和物理設(shè)計(jì)的結(jié)果建立數(shù)據(jù)庫,編制與調(diào)試應(yīng)用程序,組織數(shù)據(jù)入庫,并進(jìn)行數(shù)據(jù)庫系統(tǒng)的功能測試。

6)數(shù)據(jù)庫運(yùn)行和維護(hù)階段

數(shù)據(jù)庫應(yīng)用系統(tǒng)經(jīng)過試運(yùn)行后即可投入正式運(yùn)行。在數(shù)據(jù)庫系統(tǒng)運(yùn)行過程中必須不斷地對其進(jìn)行評價、調(diào)整與修改。

需要指出的是,上述設(shè)計(jì)步驟既是數(shù)據(jù)庫設(shè)計(jì)的過程,也包括了數(shù)據(jù)庫應(yīng)用系統(tǒng)的設(shè)計(jì)過程。在數(shù)據(jù)庫設(shè)計(jì)過程中,應(yīng)將數(shù)據(jù)庫本身的設(shè)計(jì)與數(shù)據(jù)庫中數(shù)據(jù)處理的設(shè)計(jì)結(jié)合起來,使得兩個方面的需求分析、抽象、設(shè)計(jì)和實(shí)現(xiàn)同時進(jìn)行,相互參照,相互補(bǔ)充,從而提高設(shè)計(jì)質(zhì)量。如果所設(shè)計(jì)的系統(tǒng)比較復(fù)雜,還應(yīng)該考慮使用專門的數(shù)據(jù)庫設(shè)計(jì)工具和軟件開發(fā)工具,進(jìn)行規(guī)范設(shè)計(jì)并減少設(shè)計(jì)工作量。

2.數(shù)據(jù)庫設(shè)計(jì)的特征

1)反復(fù)性

一般來說,數(shù)據(jù)庫設(shè)計(jì)是需要經(jīng)過反復(fù)推敲和修改才能完成而不大可能是一氣呵成的。一個設(shè)計(jì)階段總是在前一階段的基礎(chǔ)上開展工作的,但也可以向前一階段反饋要求改進(jìn)的信息并在改進(jìn)之后重新設(shè)計(jì)。有時候可能還要多次地互為參照并反復(fù)調(diào)整,以求保證設(shè)計(jì)效果。

2)試探性

數(shù)據(jù)庫設(shè)計(jì)過程中,往往既要構(gòu)思對于種類繁多且規(guī)模宏大的數(shù)據(jù)本身的存儲和處理,又要考慮眾多用戶對數(shù)據(jù)操縱的多種需求,還必須綜合平衡影響系統(tǒng)性能的各種工程因素,因而,不同的設(shè)計(jì)者甚至同一設(shè)計(jì)者在不同的時間段所給出的設(shè)計(jì)結(jié)果都可能有很大差別。為了達(dá)到較好的設(shè)計(jì)效果,實(shí)際的設(shè)計(jì)過程往往是逐步試探的過程,可能會先給出初步方案、權(quán)衡各種因素并調(diào)整后定案,發(fā)現(xiàn)問題再進(jìn)行調(diào)整定案……

3)逐步進(jìn)行

實(shí)際的數(shù)據(jù)庫設(shè)計(jì)工作往往是由各類人員分階段進(jìn)行的。這樣做既有技術(shù)分工上的必要性,又可以分階段把關(guān)、逐級審查、保證設(shè)計(jì)的質(zhì)量和進(jìn)度。這種工作方式不利于對后一階段反饋到前一階段的需求的處理,這就要求每一階段都考慮周全,盡可能地減少這種反饋。

3.面向?qū)ο髷?shù)據(jù)庫設(shè)計(jì)

傳統(tǒng)的數(shù)據(jù)庫設(shè)計(jì)過程中,往往用數(shù)據(jù)流圖來進(jìn)行需求分析,用E-R圖來構(gòu)建數(shù)據(jù)庫的概念模型,這兩種方法本身沒有必然的聯(lián)系,不能在需求分析階段和數(shù)據(jù)庫設(shè)計(jì)階段形成自然的溝通。如果采用面向?qū)ο蠓治龇椒ㄟM(jìn)行需求分析,采用面向?qū)ο笤O(shè)計(jì)方法進(jìn)行數(shù)據(jù)庫設(shè)計(jì),則在進(jìn)行需求分析時構(gòu)建的對象模型可以自然地轉(zhuǎn)換為適用的數(shù)據(jù)庫模式。

面向?qū)ο蟮挠^點(diǎn)認(rèn)為,任何一個系統(tǒng)都是由若干個對象和這些對象之間的相互作用構(gòu)成的。其中對象由數(shù)據(jù)和相應(yīng)的操作兩部分構(gòu)成的。對象具有自主性、封裝性和動態(tài)性。將面向?qū)ο笞鳛榉椒▽W(xué)應(yīng)用到軟件工程的各個階段,其實(shí)質(zhì)就是尋找對象以及對象之間的相互關(guān)系。面向?qū)ο蠓治鍪菍φ鎸?shí)世界的對象進(jìn)行建模,其根本出發(fā)點(diǎn)是站在應(yīng)用的角度對問題域進(jìn)行刻畫和描述,這樣有利于對問題的理解。需求分析階段的結(jié)果是“問題陳述?+?對象模型?+?動態(tài)模型?+?功能模型”。設(shè)計(jì)階段是對原對象模型的進(jìn)一步描述,此階段可用面向?qū)ο蠓椒▽?shí)現(xiàn)數(shù)據(jù)庫的設(shè)計(jì)。

【例3-1】“教學(xué)”數(shù)據(jù)庫的規(guī)劃。

本例將構(gòu)建一個用于教學(xué)管理的簡易數(shù)據(jù)庫,初步規(guī)劃的功能如下:

(1)存儲以下原始數(shù)據(jù)。

●與教學(xué)相關(guān)的實(shí)體描述,如“學(xué)生”基本情況、“教師”基本情況和“課程”基本情況。

●與學(xué)生相關(guān)的“班級”和“專業(yè)”情況;與教師和專業(yè)相關(guān)的“學(xué)院”情況。3.2數(shù)據(jù)庫設(shè)計(jì)過程

(2)教務(wù)員可以“排課”或查看開課計(jì)劃。

●教務(wù)員可以排課,即為各專業(yè)安排開課計(jì)劃。排一次課之后,就會生成一個包括專業(yè)標(biāo)識、課程標(biāo)識、教師標(biāo)識和開課學(xué)期的“開課”表中的一條記錄。

●教務(wù)員可以輸出課表,即按專業(yè)輸出開課計(jì)劃,一次輸出排課表中的一條記錄。

(3)學(xué)生可以“選課”或查看考試成績。

●學(xué)生可以查看自己專業(yè)的開課計(jì)劃,一次輸出排課表中的一條記錄。

●學(xué)生可以選課,選一門課之后,生成一個包括學(xué)號、課程標(biāo)識和分?jǐn)?shù)(此時為空值)的“成績”表中的一條記錄。

●學(xué)生在考試過后,還可以查看并輸出自己的考試成績,即“選課”表中的自己的標(biāo)識(學(xué)號)所對應(yīng)的一條或多條記錄。

(4)教務(wù)員可以“登錄成績”或查看學(xué)生考試成績。

●教務(wù)員可以登錄學(xué)生的考試成績,登錄一次將會充實(shí)“成績”表中的一條記錄中的“分?jǐn)?shù)”字段。

●教務(wù)員可以查看并輸出學(xué)生的考試成績,即“成績”表中的一條或多條記錄。

(5)日常的查詢、更新和數(shù)據(jù)統(tǒng)計(jì)操作。例如,教務(wù)員或者其他教師可以查看或輸出學(xué)生的姓名、班級和電話;查詢某個專業(yè)的開課計(jì)劃,輸出學(xué)生成績清單等。3.2.1數(shù)據(jù)庫設(shè)計(jì)的需求分析

1.需求分析階段的任務(wù)

需求分析階段的任務(wù)是,通過詳細(xì)調(diào)查現(xiàn)實(shí)世界中要處理的對象(組織、部門、企業(yè)等),充分了解原系統(tǒng)的工作情況,明確用戶的各種需求,然后在這個基礎(chǔ)上確定新系統(tǒng)的功能。新系統(tǒng)必須充分考慮今后可能的擴(kuò)充和改變,不能僅按照當(dāng)前的應(yīng)用需求來設(shè)計(jì)數(shù)據(jù)庫。調(diào)查的重點(diǎn)是“數(shù)據(jù)”和“處理”,通過調(diào)查,要從中獲得每個用戶對數(shù)據(jù)庫的要求,包括以下幾個方面:

(1)信息要求。這一要求是指用戶需要從數(shù)據(jù)庫中獲得的信息的內(nèi)容和性質(zhì)。由信息要求可以導(dǎo)出數(shù)據(jù)要求,也就是說,搞清楚數(shù)據(jù)庫中需要存放哪些數(shù)據(jù)。

(2)處理要求。這一要求是指用戶要完成什么處理功能,對處理的響應(yīng)時間有什么要求,處理的方法是批處理還是聯(lián)機(jī)處理。

(3)安全性和完整性要求。

2.?dāng)?shù)據(jù)流圖

數(shù)據(jù)流圖是結(jié)構(gòu)化分析方法中用于表示系統(tǒng)邏輯模型的一種工具。它以圖形的方式描繪數(shù)據(jù)在系統(tǒng)中流動和處理的過程,是需求理解的邏輯模型的圖形表示。由于它只反映系統(tǒng)必須完成的邏輯功能,所以是一種功能模型,直接支持系統(tǒng)的功能建模。

數(shù)據(jù)流圖從數(shù)據(jù)傳遞和加工的角度來刻畫數(shù)據(jù)流從輸入到輸出的移動變換過程。數(shù)據(jù)流圖中的主要圖形元素如圖3-1所示。圖3-1數(shù)據(jù)流圖中的主要圖形元素

3.?dāng)?shù)據(jù)字典

需求分析之后,得到一個數(shù)據(jù)字典。數(shù)據(jù)字典是系統(tǒng)中各類數(shù)據(jù)描述的集合,是進(jìn)行詳細(xì)的數(shù)據(jù)收集和數(shù)據(jù)分析所獲得的主要成果。數(shù)據(jù)字典通常包括5個部分。

(1)數(shù)據(jù)項(xiàng):數(shù)據(jù)的最小單位。描述的內(nèi)容為

數(shù)據(jù)項(xiàng)描述?=?{數(shù)據(jù)項(xiàng)名,數(shù)據(jù)項(xiàng)含義說明,別名,數(shù)據(jù)類型,長度,取值范圍,取值含義,與其他數(shù)據(jù)項(xiàng)的邏輯關(guān)系,數(shù)據(jù)項(xiàng)之間的聯(lián)系}

其中,“取值范圍”、“與其他數(shù)據(jù)項(xiàng)的邏輯關(guān)系”定義了數(shù)據(jù)的完整性約束條件,是設(shè)計(jì)數(shù)據(jù)檢驗(yàn)功能的依據(jù)。

(2)數(shù)據(jù)結(jié)構(gòu):若干個數(shù)據(jù)項(xiàng)的有意義的集合。描述的內(nèi)容為

數(shù)據(jù)結(jié)構(gòu)描述?=?{數(shù)據(jù)結(jié)構(gòu)名,含義說明,組成,{數(shù)據(jù)項(xiàng)或數(shù)據(jù)結(jié)構(gòu)}}

可以看出,數(shù)據(jù)結(jié)構(gòu)既可以由若干個數(shù)據(jù)項(xiàng)組成,也可以由若干個數(shù)據(jù)結(jié)構(gòu)組成。

(3)數(shù)據(jù)流:可以是數(shù)據(jù)項(xiàng),也可以是數(shù)據(jù)結(jié)構(gòu),表示某個數(shù)據(jù)處理的輸入或輸出,即數(shù)據(jù)結(jié)構(gòu)在系統(tǒng)內(nèi)的傳輸路徑。描述的內(nèi)容為

數(shù)據(jù)流描述?=?{數(shù)據(jù)流名,說明,數(shù)據(jù)流來源,數(shù)據(jù)流去向,組成;{數(shù)據(jù)結(jié)構(gòu)},平均流量,高峰期流量}

其中,“平均流量”指的是每天、每周或每月等的傳輸次數(shù)。

(4)數(shù)據(jù)存儲:處理過程中存取的數(shù)據(jù),可作為數(shù)據(jù)流的來源或去向。常常是手工憑證、手工文檔或計(jì)算機(jī)文件。描述的內(nèi)容為

數(shù)據(jù)存儲描述?=?{數(shù)據(jù)存儲名,說明,編號,流入的數(shù)據(jù)流,流出的數(shù)據(jù)流,組成;{數(shù)據(jù)結(jié)構(gòu)},數(shù)據(jù)量,存取方式}

其中,“存取方式”有批處理/聯(lián)機(jī)處理、檢索更新、順序檢索/隨機(jī)檢索。

(5)處理過程:具體處理邏輯一般用判定表或判定樹來描述,數(shù)據(jù)字典中只需要描述處理過程的說明性信息。描述的內(nèi)容為

處理過程描述?=?{處理過程名,說明,輸入;{數(shù)據(jù)流},輸出;{數(shù)據(jù)流},處理;{簡要說明}}

其中,“簡要說明”主要說明該處理過程的功能及處理要求。

數(shù)據(jù)字典是在需求分析階段建立,在數(shù)據(jù)庫設(shè)計(jì)過程中不斷修改、充實(shí)和完善的。

【例3-2】“教學(xué)”數(shù)據(jù)庫的需求分析。

不妨將例3-1中“教學(xué)”數(shù)據(jù)庫的初步規(guī)劃看做用戶的實(shí)際需求,據(jù)此進(jìn)行“教學(xué)”數(shù)據(jù)庫的需求分析。

(1)確定實(shí)體。

●該數(shù)據(jù)庫需要存儲和處理有關(guān)學(xué)生、課程和教師基本情況的數(shù)據(jù),因而,學(xué)生、課程和教師都是系統(tǒng)中的實(shí)體,定義它們的屬性如下:

教師:工號、姓名、職稱、性別、出生年月、住址、電話

學(xué)生:學(xué)號、姓名、性別,出生年月、籍貫、宿舍、電話

課程:課程號、課程名、學(xué)分、學(xué)時●教務(wù)員雖為系統(tǒng)用戶,但其信息與系統(tǒng)處理無關(guān),故不作為實(shí)體。

●為了準(zhǔn)確地描述學(xué)生的情況,需要添加對于學(xué)生所屬的班級、班級所屬的專業(yè)以及專業(yè)所屬的學(xué)院(也與教師的描述相關(guān))的描述,因而,班級、專業(yè)和學(xué)院也成為系統(tǒng)中的實(shí)體,定義它們的屬性如下:

班級:班號、班名、人數(shù)

專業(yè):專業(yè)號、專業(yè)名

學(xué)院:學(xué)院號、學(xué)院名、地址、電話

(2)作數(shù)據(jù)流圖。

通常,數(shù)據(jù)流圖是分層作出的,作數(shù)據(jù)流圖的過程反映了自頂向下進(jìn)行功能分解和細(xì)化的分析過程。頂層(第0層)表示系統(tǒng)的開發(fā)范圍以及系統(tǒng)與周圍環(huán)境的數(shù)據(jù)交換關(guān)系;底層代表了那些不可進(jìn)一步細(xì)分的“原子加工”;中間各層分別是對其上一層父圖的細(xì)化,其中的每個加工可以繼續(xù)細(xì)化,中間層次的多少由系統(tǒng)的復(fù)雜程度來決定。

本例中,描述教務(wù)員排課(包括查看成績)以及教務(wù)員和學(xué)生查看并輸出開課計(jì)劃的數(shù)據(jù)流圖如圖3-2(a)所示。幾個存儲文件中,“開課”是“排課”活動所產(chǎn)生的數(shù)據(jù)存儲,其余幾個都是系統(tǒng)中已經(jīng)確定的實(shí)體。

描述學(xué)生選課、教師登錄考試成績以及學(xué)生和教師查看并輸出考試成績的數(shù)據(jù)流圖如圖3-2(b)所示。幾個存儲文件中,“成績”是“選課”活動所產(chǎn)生的數(shù)據(jù)存儲,其余幾個都是系統(tǒng)中已經(jīng)確定的實(shí)體。圖3-2“選課”及“排課”的數(shù)據(jù)流圖

(3)數(shù)據(jù)字典。

概括地說,數(shù)據(jù)字典就是用來定義數(shù)據(jù)流圖中各個成分的具體含義的,它以一種準(zhǔn)確的、無二義性的說明方式為系統(tǒng)的分析、設(shè)計(jì)及維護(hù)提供了有關(guān)元素的一致的定義和詳細(xì)的描述。它和數(shù)據(jù)流圖共同構(gòu)成了系統(tǒng)的邏輯模型,是需求規(guī)格說明書的主要組成部分。例如,對于數(shù)據(jù)項(xiàng)“學(xué)號”可以定義為對于數(shù)據(jù)結(jié)構(gòu)“學(xué)生”可以定義為對于數(shù)據(jù)流“選課信息”可以定義為對于因登錄成績而產(chǎn)生的數(shù)據(jù)存儲“成績”可以定義為對于處理過程“成績查詢”可定義為3.2.2數(shù)據(jù)庫概念設(shè)計(jì)

數(shù)據(jù)庫概念設(shè)計(jì)的方法有如下兩種。

(1)集中式模式設(shè)計(jì)法。這是一種統(tǒng)一的模式設(shè)計(jì)方法,它按照需求,由統(tǒng)一的機(jī)構(gòu)或人員設(shè)計(jì)一個綜合的全局模式。這種設(shè)計(jì)方法簡單方便,強(qiáng)調(diào)統(tǒng)一與一致,適用于小型或不算復(fù)雜的單位或部門,而對大型的或語義關(guān)聯(lián)較為復(fù)雜的單位則不適合。

(2)視圖集成設(shè)計(jì)法。這種方法將一個單位分解為若干個部分,先分別對每部分進(jìn)行局部模式設(shè)計(jì),建立它們的視圖,然后以各視圖為基礎(chǔ)進(jìn)行集成。在集成過程中,由于視圖設(shè)計(jì)的分散性,可能會導(dǎo)致不一致,從而出現(xiàn)某些沖突,因而需要對視圖進(jìn)行修正,最終形成全局模式。

1.選擇局部應(yīng)用

按系統(tǒng)具體情況,在多層數(shù)據(jù)流圖中選擇一個適當(dāng)層次的數(shù)據(jù)流圖,使這組圖中每部分對應(yīng)一個局部應(yīng)用,從這一層次的數(shù)據(jù)流圖出發(fā),設(shè)計(jì)出分E-R圖。

2.視圖設(shè)計(jì)

視圖設(shè)計(jì)一般有三種設(shè)計(jì)次序:自頂向下、由底向上、由內(nèi)向外。

(1)自頂向下:先從抽象級別高且普遍性強(qiáng)的對象開始逐步細(xì)化、具體化與特殊化。例如,在進(jìn)行“職工”視圖設(shè)計(jì)時,可先將職工分為“干部”與“一般職工”,進(jìn)一步地,還可再將一般職工細(xì)分為“辦公室人員”、“銷售部人員”、“研發(fā)部人員”、“一廠人員”、“二廠人員”等。

(2)由底向上:先從具體的對象著手,逐步抽象、普遍化和一般化,最終形成一個完整的視圖設(shè)計(jì)。

(3)由內(nèi)向外:先從最基本與最明顯的對象著手,逐步擴(kuò)充至非基本、不明顯的其他對象。例如,在進(jìn)行“職工”視圖設(shè)計(jì)時,從最基本的職工開始,逐步擴(kuò)展至職工所在的部門,是“一般職工”還是“干部”等。

3.視圖集成

(1)命名沖突:有同名異義和同義異名兩種情況。例如,假定“圖書館”數(shù)據(jù)庫中有一個讀者關(guān)系,則“借書證號”與可能命名的“讀者編號”,屬于同義異名。

(2)概念沖突:同一事物在一處為實(shí)體而在另一處為屬性或聯(lián)系。例如,學(xué)校中的“學(xué)院”可以作為一個具有“名稱”、“教工數(shù)”、“學(xué)生數(shù)”、“電話”等各種屬性的實(shí)體,也可以作為學(xué)生實(shí)體的一個屬性,表明學(xué)生所在的學(xué)院。

(3)域沖突:相同屬性在不同視圖中有不同的域,例如,“借書證號”在某個視圖中為字符串,而在另一個視圖中可能為整數(shù)。如果一個屬性在不同的視圖中采用了不同的度量單位,也屬于域沖突。

(4)約束沖突:不同的視圖可能有不同的約束。視圖經(jīng)過合并,生成的是初步的E-R圖,其中可能存在冗余的實(shí)體間聯(lián)系。冗余數(shù)據(jù)和冗余聯(lián)系容易破壞數(shù)據(jù)庫的完整性,給數(shù)據(jù)庫的維護(hù)增加困難。因此,對于視圖集成后所形成的整體的數(shù)據(jù)庫概念結(jié)構(gòu)還必須進(jìn)一步驗(yàn)證,以確保它滿足以下條件:

●整體概念結(jié)構(gòu)內(nèi)部必須具有一致性,即不能存在互相矛盾的表達(dá);

●整體概念結(jié)構(gòu)能準(zhǔn)確地反映每個原有的視圖結(jié)構(gòu),包括屬性、實(shí)體及實(shí)體間的聯(lián)系;

●整體概念結(jié)構(gòu)能滿足需求分析階段所確定的所有要求;

●整體概念結(jié)構(gòu)最終還應(yīng)該提交給用戶,征求用戶與有關(guān)人員的意見,進(jìn)行評審、修改和優(yōu)化,然后確定下來,作為數(shù)據(jù)庫的概念結(jié)構(gòu)和進(jìn)一步設(shè)計(jì)數(shù)據(jù)庫的依據(jù)。

【例3-3】“教學(xué)”數(shù)據(jù)庫的概念設(shè)計(jì)。

(1)分E-R圖設(shè)計(jì)。根據(jù)例3-2中對于“教學(xué)”數(shù)據(jù)庫進(jìn)行需求分析的結(jié)果,可以設(shè)計(jì)出如圖3-3所示的幾個實(shí)體的E-R圖。圖3-3“教學(xué)”數(shù)據(jù)庫的分E-R圖(2)“教學(xué)”數(shù)據(jù)庫中實(shí)體之間的聯(lián)系如圖3-4所示。圖3-4“教學(xué)”數(shù)據(jù)庫中實(shí)體之間的聯(lián)系

(3)將分E-R圖設(shè)計(jì)得到的結(jié)果合并,得到如圖3-5所示的“教學(xué)”數(shù)據(jù)庫的總E-R圖。圖3-5“教學(xué)”數(shù)據(jù)庫的總E-R圖3.2.3數(shù)據(jù)庫的邏輯設(shè)計(jì)

1.轉(zhuǎn)換時會遇到的一些問題

(1)命名及屬性域的處理。關(guān)系模式中可沿用E-R圖中的原有命名,也可另行命名。當(dāng)然,應(yīng)該避免重名。由于關(guān)系數(shù)據(jù)庫管理系統(tǒng)一般只支持幾種數(shù)據(jù)類型,而E-R圖中的屬性域則不受限制,故遇到不支持的數(shù)據(jù)類型時要進(jìn)行類型轉(zhuǎn)換。

(2)可再分的非原子屬性的處理。E-R圖中允許有非原子屬性而關(guān)系模式中不允許出現(xiàn),故要進(jìn)行轉(zhuǎn)換。非原子屬性主要有元組型和集合型。例如,如圖3-6所示的兩個關(guān)系中,分別包含元組型的非原子屬性和集合型的非原子屬性。其主要轉(zhuǎn)換方法是將元組屬性橫向展開而集合屬性縱向展開。

(3)聯(lián)系的轉(zhuǎn)換。聯(lián)系可以用關(guān)系來表示,也可以歸并到相關(guān)聯(lián)的實(shí)體中。圖3-6包含非原子屬性的表

2.邏輯模式規(guī)范化及其調(diào)整和實(shí)現(xiàn)

(1)關(guān)系規(guī)范化。關(guān)系規(guī)范化理論研究的是關(guān)系模式中各屬性之間的依賴關(guān)系及其對關(guān)系模式的影響,探討“好”的關(guān)系模式應(yīng)該具備的性質(zhì),以及達(dá)到“好”的關(guān)系模式的設(shè)計(jì)算法。規(guī)范化理論給出了判斷關(guān)系模式優(yōu)劣的理論標(biāo)準(zhǔn),幫助設(shè)計(jì)者預(yù)測可能出現(xiàn)的問題,提供自動產(chǎn)生各種模式的算法工具,因此,是設(shè)計(jì)人員應(yīng)該掌握的有力工具。

(2)關(guān)系數(shù)據(jù)庫管理系統(tǒng)。有時,需要對邏輯模式進(jìn)行調(diào)整,以滿足關(guān)系數(shù)據(jù)庫管理系統(tǒng)的性能、存儲空間等要求,同時對模式進(jìn)行適應(yīng)關(guān)系DBMS限制條件的修改,其目

的是:

①調(diào)整性能,以減少連接運(yùn)算。

②調(diào)整關(guān)系大小,使每個關(guān)系數(shù)量保持在合理水平,從而提高存取效率。

③盡量采用快照(snapshot),因?yàn)閼?yīng)用中需要的往往只是某個固定時刻的值,這時可使用快照固定這個時刻的值,并定期更換。這種方式可以顯著提高查詢速度。

3.關(guān)系視圖設(shè)計(jì)

關(guān)系視圖主要有以下作用:

(1)提供數(shù)據(jù)的邏輯獨(dú)立性。其目的是保證應(yīng)用程序不受邏輯模式變化的影響。數(shù)據(jù)的邏輯模式會隨著應(yīng)用的發(fā)展而不斷變化,邏輯模式的變化必然會影響到應(yīng)用程序,這會給維護(hù)工作帶來困難。有了關(guān)系視圖之后,建立在其上的應(yīng)用程序就不會隨邏輯模式的修改而變化,這時變動的只是關(guān)系視圖的定義。

(2)適應(yīng)用戶對數(shù)據(jù)的不同需求。數(shù)據(jù)庫一般都有較大的結(jié)構(gòu),而數(shù)據(jù)庫用戶一般只希望了解其中與自己相關(guān)的一部分。這時,可以使用關(guān)系視圖屏蔽用戶不需要的模式,而只將用戶需要了解的部分呈現(xiàn)出來。

(3)有一定的數(shù)據(jù)保密功能。關(guān)系視圖為每個用戶劃定了訪問數(shù)據(jù)的范圍,從而在使用數(shù)據(jù)庫系統(tǒng)的各個用戶之間起到一定的隔離作用。

【例3-4】將例3-3中設(shè)計(jì)的“教學(xué)”數(shù)據(jù)庫的概念模型轉(zhuǎn)換為關(guān)系模型。

(1)一個實(shí)體型轉(zhuǎn)換為一個關(guān)系模式。實(shí)體的屬性就是關(guān)系的屬性,實(shí)體的關(guān)鍵字就是關(guān)系的關(guān)鍵字。“教學(xué)”數(shù)據(jù)庫中的幾個實(shí)體可以轉(zhuǎn)換為以下關(guān)系模式,每個關(guān)系模式中帶下劃線的字段都可以作為相應(yīng)關(guān)系中的主鍵:

學(xué)生(學(xué)號,姓名,性別,出生年月,籍貫,宿舍,電話)

班級(班號,班名,人數(shù))

專業(yè)(專業(yè)號,專業(yè)名)

教師(工號,姓名,職稱,性別,出生年月,住址,電話)

學(xué)院(學(xué)院號,學(xué)院名,地址,電話)

課程(課程號,課程名,學(xué)分,學(xué)時)

(2)一個m?:?n聯(lián)系轉(zhuǎn)換為一個關(guān)系模式。該聯(lián)系兩端兩個實(shí)體的鍵以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性,而該關(guān)系的鍵為各實(shí)體的鍵的組合?!敖虒W(xué)”數(shù)據(jù)庫中的m?:?n聯(lián)系“開課”可以轉(zhuǎn)換為以下關(guān)系模式:

開課(工號,課程號,學(xué)期)

(3)一個1?:?n聯(lián)系可以轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,也可以與n端對應(yīng)的關(guān)系模式合并。如果轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,則與該聯(lián)系相連的各實(shí)體的關(guān)鍵字以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性,而關(guān)系的關(guān)鍵字為n端實(shí)體的關(guān)鍵字。例如,“教學(xué)”數(shù)據(jù)庫中的“歸屬”是一個1?:?n聯(lián)系,可以轉(zhuǎn)換為獨(dú)立的關(guān)系模式:

歸屬(學(xué)院號,專業(yè)號)

也可以與“專業(yè)”關(guān)系模式合并,這時“專業(yè)”關(guān)系模式為

專業(yè)(專業(yè)號,專業(yè)名,學(xué)院號)

本例中所有1?:?n聯(lián)系均按后一種方式處理。

(4)一個1?:?1聯(lián)系可以轉(zhuǎn)換為一個獨(dú)立的關(guān)系模式,也可以與任意一端對應(yīng)的關(guān)系模式合并。如果轉(zhuǎn)換為獨(dú)立的關(guān)系模式,則相關(guān)聯(lián)的各實(shí)體的關(guān)鍵字以及聯(lián)系本身的屬性均轉(zhuǎn)換為關(guān)系的屬性,每個實(shí)體的關(guān)鍵字均為該關(guān)系的候選關(guān)鍵字。如果與某一端對應(yīng)的關(guān)系模式合并,則需要在該關(guān)系模式的屬性中加入另一個關(guān)系模式的關(guān)鍵字和聯(lián)系本身的屬性。例如,假定“教學(xué)”數(shù)據(jù)庫中要添加一個“家長”實(shí)體,相應(yīng)的關(guān)系模式為

家長(家長名,地址,電話)

“家長”與“學(xué)生”兩個實(shí)體之間是一個1?:?1聯(lián)系,則可將其這個聯(lián)系合并到“家長”關(guān)系模式中,使其變?yōu)?/p>

家長(家長名,學(xué)號,地址,電話)

(5)三個或三個以上實(shí)體間的一個多元聯(lián)系轉(zhuǎn)換為一個關(guān)系模式,與該多元聯(lián)系相連的各實(shí)體的鍵以及聯(lián)系本身的屬性轉(zhuǎn)換為關(guān)系的屬性,而關(guān)系的鍵為各實(shí)體的組合。例如,“上課”聯(lián)系是一個三元聯(lián)系,可以轉(zhuǎn)換為如下關(guān)系模式:

上課(學(xué)號,課程號,專業(yè)號,分?jǐn)?shù))

(6)對于自聯(lián)系,即同一實(shí)體集的實(shí)體之間的聯(lián)系,也可按上述1?:?1、1?:?n和m?:?n分別處理。例如,如果教師實(shí)體集內(nèi)部存在課程組長與其他雇員之間的領(lǐng)導(dǎo)與被領(lǐng)導(dǎo)的1?:?n自聯(lián)系,可以將該聯(lián)系與教師實(shí)體合并,形成關(guān)系模式:

教師(工號,姓名,組長,…)

其中增加了一個“組長”屬性,存放相應(yīng)組長的工號。

(7)具有相同鍵的關(guān)系模式可以合并。合并可以減少數(shù)據(jù)庫中的關(guān)系個數(shù),如果兩個關(guān)系模式具有相同的主鍵,可將其中一個關(guān)系模式的全部屬性加入到另一個關(guān)系模式中,然后去掉其中的同義屬性,并適當(dāng)調(diào)整屬性的次序。

按照上述原則,如圖3-5所示E-R圖可以轉(zhuǎn)換為下列關(guān)系模型:

學(xué)生(學(xué)號,姓名,班號,性別,出生年月,籍貫,宿舍,電話)

班級(班號,班名,專業(yè)號,人數(shù))

專業(yè)(專業(yè)號,專業(yè)名,學(xué)院號)

教師(工號,姓名,學(xué)院號,職稱,性別,出生年月,住址,電話)

學(xué)院(學(xué)院號,學(xué)院名,地址,電話)

課程(課程號,課程名,學(xué)分,學(xué)時)

上課(學(xué)號,課程號,專業(yè)號,分?jǐn)?shù))

開課(工號,課程號,學(xué)期)

(1)通過SQLServer的可視化用戶界面,使用各種菜單、工具欄以及向?qū)?、模板等,?chuàng)建數(shù)據(jù)庫和數(shù)據(jù)庫中的表并實(shí)現(xiàn)數(shù)據(jù)的輸入、查詢、更新和報(bào)表輸出等各種功能。

(2)在已有數(shù)據(jù)庫中創(chuàng)建視圖、索引、存儲過程和觸發(fā)器等各種對象,進(jìn)一步豐富數(shù)據(jù)庫的內(nèi)涵,以便實(shí)現(xiàn)更為深入、更加復(fù)雜或者規(guī)模更大的操作。

(3)編寫數(shù)據(jù)庫應(yīng)用程序(往往要與其他軟件結(jié)合才能完成),進(jìn)一步提高操作的等級、規(guī)模和適用范圍。3.3

SQLServer數(shù)據(jù)庫系統(tǒng)3.3.1SQLServer中的數(shù)據(jù)庫管理

1.系統(tǒng)數(shù)據(jù)庫與用戶數(shù)據(jù)庫

打開SQLServerManagementStudio,并在左側(cè)“對象資源管理器”窗格中展開數(shù)據(jù)庫實(shí)例下的“數(shù)據(jù)庫”結(jié)點(diǎn),可以看到當(dāng)前數(shù)據(jù)庫實(shí)例下管理的所有數(shù)據(jù)庫,如圖3-7所示。圖3-7“對象資源管理器”中的系統(tǒng)數(shù)據(jù)庫與用戶數(shù)據(jù)庫列表從中可以看到,SQLServer中的數(shù)據(jù)庫主要分為兩類:系統(tǒng)數(shù)據(jù)庫和用戶數(shù)據(jù)庫。系統(tǒng)數(shù)據(jù)庫主要用于記錄系統(tǒng)級的數(shù)據(jù)和對象,各數(shù)據(jù)庫的主要功能如下。

(1)?master數(shù)據(jù)庫:記錄SQLServer的系統(tǒng)級信息,包括實(shí)例管理下的所有元數(shù)據(jù)(如登錄賬戶)、端點(diǎn)、鏈接服務(wù)器和系統(tǒng)配置設(shè)置。同時,master數(shù)據(jù)庫還記錄了所有其他數(shù)據(jù)庫的存在、數(shù)據(jù)庫文件的位置以及SQLServer的初始化信息。因此,在master數(shù)據(jù)庫中不能創(chuàng)建任何用戶對象,如果它不可用,也就無法啟動SQLServer了。

(2)?model數(shù)據(jù)庫:用作為SQLServer實(shí)例上創(chuàng)建的所有數(shù)據(jù)庫的模板。由于每次啟動SQLServer時都會重新創(chuàng)建tempdb數(shù)據(jù)庫,故model數(shù)據(jù)庫始終都在SQLServer系統(tǒng)中。

(3)?msdb數(shù)據(jù)庫:SQLServer代理用于進(jìn)行復(fù)制、作業(yè)調(diào)度以及管理警報(bào)等活動。msdb數(shù)據(jù)庫通常在調(diào)度任務(wù)或排除故障時使用。

(4)?tempdb數(shù)據(jù)庫:一個工作空間,用于保存臨時對象或中間結(jié)果集,是所有用戶都可用的全局資源。

2.?dāng)?shù)據(jù)文件和日志文件

SQLServer將數(shù)據(jù)庫映射為一組操作系統(tǒng)文件。數(shù)據(jù)和日志信息分別存儲在不同的文件中。因此,SQLServer數(shù)據(jù)庫的文件有兩種類型:數(shù)據(jù)文件和日志文件。這兩種文件的結(jié)構(gòu)不同。數(shù)據(jù)文件還可以再分為主要文件和次要文件兩類。為了便于分配和管理,可以將數(shù)據(jù)文件集合起來,放到文件組中。

(1)主要文件:主要數(shù)據(jù)文件包含數(shù)據(jù)庫的啟動信息,并指向數(shù)據(jù)庫中的其他文件。用戶數(shù)據(jù)和對象可存儲在該文件中,也可以存儲在次要數(shù)據(jù)文件中。每個數(shù)據(jù)庫有一個主要數(shù)據(jù)文件。主要數(shù)據(jù)文件的建議文件擴(kuò)展名為“.mdf”。

(2)次要文件:次要數(shù)據(jù)文件是可選的,由用戶定義并存儲用戶數(shù)據(jù)。通過將每個文件放在不同的磁盤驅(qū)動器上,次要文件可用于將數(shù)據(jù)分散到多個磁盤上。另外,如果數(shù)據(jù)庫超過了單個Windows文件的最大容量,可以使用次要數(shù)據(jù)文件,這樣數(shù)據(jù)庫就能繼續(xù)增長。次要數(shù)據(jù)文件的建議文件擴(kuò)展名為“.ndf”。

(3)事務(wù)日志文件:事務(wù)日志文件保存用于恢復(fù)數(shù)據(jù)庫的日志信息。每個數(shù)據(jù)庫必須至少有一個日志文件。事務(wù)日志文件的建議文件擴(kuò)展名為“.ldf”。

注:并不強(qiáng)制使用文件擴(kuò)展名“.mdf”和“.ndf”,用之則有助于標(biāo)識文件的類型和用途。例如,可以創(chuàng)建一個簡單的數(shù)據(jù)庫Sales,其中一個是包含所有數(shù)據(jù)和對象的主要文件,另一個是包含事務(wù)日志信息的日志文件,也可以創(chuàng)建一個更復(fù)雜的數(shù)據(jù)庫Orders,其中有一個主要文件和五個次要文件,數(shù)據(jù)庫中的數(shù)據(jù)和對象分散在所有六個文件中,另有四個日志文件存放事務(wù)日志信息。

默認(rèn)情況下,數(shù)據(jù)和事務(wù)日志存放于同一個驅(qū)動器上的同一個路徑下。這是處理單磁盤系統(tǒng)時采用的方法。實(shí)際生產(chǎn)環(huán)境中,最好將數(shù)據(jù)和日志文件放在不同的磁盤上。

3.文件組

為了便于數(shù)據(jù)布局和管理任務(wù)(如備份和還原操作),用戶可以在SQLServer中將多個文件劃分為一個文件集合,這個文件集合就是一個文件組。例如,可以分別在三個磁盤驅(qū)動器上創(chuàng)建三個文件Data1.ndf、Data2.ndf和Data3.ndf,將它們分給文件組fgroup1,然后在文件組fgroup1上創(chuàng)建一個表,則對表中數(shù)據(jù)的查詢將分散到三個磁盤上,從而提高了性能。文件組分為三種類型。

(1)主要文件組:包含主要文件的文件組。所有系統(tǒng)表都分配到這個文件組中。一個數(shù)據(jù)庫有一個主要文件組。其中包含主要數(shù)據(jù)文件和未放入其他文件組的次要數(shù)據(jù)文件。

(2)用戶定義文件組:用戶首次創(chuàng)建數(shù)據(jù)庫或修改數(shù)據(jù)庫時自定義的文件組。創(chuàng)建這種文件組的主要目的是進(jìn)行數(shù)據(jù)分配。例如,可將位于不同磁盤的文件劃分為一個組,并在這個文件組上創(chuàng)建一個表,就可以提高表的讀寫效率。

(3)默認(rèn)文件組:如果在數(shù)據(jù)庫中創(chuàng)建某個對象時沒有指定所屬的文件組,就會被分到默認(rèn)文件組。不管何時,只能將一個文件組指定為默認(rèn)文件組。默認(rèn)文件組中的文件必須足夠大,能夠容納未分配給其他文件組的所有新對象。如果未使用ALTERDATABASE語句進(jìn)行更改,則PRIMARY文件組是默認(rèn)文件組,不過,即使改變了默認(rèn)文件組,系統(tǒng)對象和表仍然分配給PRIMARY文件組而不是新的默認(rèn)文件組。

注:一般情況下,文件組中的文件尺寸不會自動增長,除非文件組中的所有文件都分配不到可用空間。3.3.2SQLServer數(shù)據(jù)庫中的表

SQLServer數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫,一個數(shù)據(jù)庫由多個表組成,一個表對應(yīng)關(guān)系理論中所說的一個關(guān)系,用于存儲一批數(shù)據(jù)。表中的數(shù)據(jù)組織成一條一條記錄,每條記錄又由分屬于不同數(shù)據(jù)類型和其他特征的多個字段構(gòu)成,如圖3-8所示。圖3-8數(shù)據(jù)庫中的表

1.字段的屬性

表的定義(表的結(jié)構(gòu))包含了表頭的內(nèi)容和格式,也包含了描述表中包含的數(shù)據(jù)類型的元數(shù)據(jù)(metadata,數(shù)據(jù)描述信息)。每個字段都具有該字段可存儲數(shù)據(jù)類型的一組規(guī)則。在輸入表中的數(shù)據(jù)時,如果正在輸入的某個字段的值違反了表的定義中預(yù)先指定的規(guī)則,則系統(tǒng)會拒絕插入或修改這一行。例如,如果預(yù)先為“學(xué)生”表中的“年齡”字段定義了一個約束:“年齡<30”,則當(dāng)所輸入的學(xué)生的年齡為35時,系統(tǒng)會拒絕插入這個學(xué)生的記錄。表中所有的字段名在同一個表中具有唯一性,同一字段的數(shù)據(jù)屬于同一種數(shù)據(jù)類型。除了用字段名和數(shù)據(jù)類型來指定字段的屬性外,還可以定義其他屬性,例如:

(1)?NULL或NOTNULL屬性。NULL即空值,通常表示未知、不可用或?qū)⒃谝院筇砑拥臄?shù)據(jù)。如果指定了表中某個字段具有NULL屬性,則在輸入數(shù)據(jù)時可以省略該字段的值。反之,那些指定為具有NOTNULL屬性的字段都必須在輸入時給出具體的值。

(2)?IDENTITY屬性。IDTENTITY屬性就是字段的標(biāo)識屬性,指定了IDENTITY屬性的字段稱為“標(biāo)識”字段。任何表中都可以創(chuàng)建一個而且只能創(chuàng)建一個標(biāo)識字段,該字段只能定義為decimal、int、numeric、bigint或tinyint等數(shù)值型字段,而且所有的值都是系統(tǒng)自動生成的序號值,每個序號值唯一標(biāo)識表中的一行。

2.主鍵

主鍵可以是一個字段,也可以是多個字段。例如,在“學(xué)生”表中,“學(xué)號”可以作為主鍵;在“成績”表中,“學(xué)號”和“課程號”一起作為主鍵。在SQLServer中,設(shè)置為主鍵的字段在顯示表的結(jié)構(gòu)時用鑰匙狀的圖標(biāo)標(biāo)識。

主鍵字段(或字段組)的每個值(或每組值)都代表一條且只代表一條記錄。因而,每條記錄中主鍵的值都不能為空,一條記錄中的主鍵的值也不能與其他任何記錄中的主鍵的值

相同。實(shí)際創(chuàng)建數(shù)據(jù)庫時,為了操作方便起見,可能會采用一些特殊的處理方法。例如,以下兩種方法常會出現(xiàn)在一些使用頻率比較高的數(shù)據(jù)庫中:

(1)為一個數(shù)據(jù)庫中的一個表或者多個表添加一個專門的字段作為主鍵,其值為每個記錄的編號或類似的內(nèi)容,以后修改數(shù)據(jù)庫中這些表的結(jié)構(gòu)時可以改動得少一些。

(2)將一個經(jīng)常使用的字段放到多個表甚至所有表中,方便數(shù)據(jù)查詢。例如,假定“工資管理數(shù)據(jù)庫”中有三個表“職工”、“工資”和“扣除”,其中都將“職工號”作為主鍵,則在每月計(jì)算每個職工的工資時,按照“職工號”分別從“職工”表中查出每個人的姓名、從“工資”表中查出他的工資數(shù)(基本工資、工齡工資、業(yè)績津貼、補(bǔ)貼、加班費(fèi)等)、從“浮動工資”表中查出他的扣除數(shù)(房管、水電、借款等),即可算出應(yīng)發(fā)給他的工資數(shù)目。

3.表與表之間的聯(lián)系

表與表之間可以建立關(guān)聯(lián),以便體現(xiàn)事物與事物之間的聯(lián)系,如圖3-9所示。圖3-9表與表之間的聯(lián)系

(1)“產(chǎn)品”表與“供應(yīng)商”表之間通過共有的“供應(yīng)商ID”字段建立了關(guān)聯(lián)?!肮?yīng)商ID”字段是“供應(yīng)商”表的主鍵,而在“產(chǎn)品”表中叫做外鍵。這個外鍵表達(dá)了“產(chǎn)品”表與“供應(yīng)商”表之間的一對多聯(lián)系:“供應(yīng)商”表中一個“供應(yīng)商ID”的值可以在“產(chǎn)品”表的多條記錄中出現(xiàn),也就是說,一個供應(yīng)商(“供應(yīng)商”表中的一條記錄)可以提供多種產(chǎn)品(“產(chǎn)品”表中的多條記錄)。

(2)“產(chǎn)品”表與“訂單明細(xì)”表之間通過“產(chǎn)品ID”建立了一對多聯(lián)系,“訂單明細(xì)”表和“訂單”表之間又通過“訂單ID”建立了一對多聯(lián)系。實(shí)際上,這兩個聯(lián)系相當(dāng)于“產(chǎn)品”表和“訂單”表之間的多對多聯(lián)系,因?yàn)殛P(guān)系數(shù)據(jù)模型不能表達(dá)多對多聯(lián)系,才不得不拆成了兩個一對多聯(lián)系。

4.約束

約束是SQLServer提供的自動保持?jǐn)?shù)據(jù)庫完整性的一種方法,它通過限制字段中的數(shù)據(jù)、記錄中的數(shù)據(jù)以及表與表之間的數(shù)據(jù)來保證數(shù)據(jù)的完整性。主鍵就是約束的一種形式。

在SQLServer中,對于基本表的約束分為列約束和表約束。列約束是對某個特定列的約束,包含在列的定義中,直接跟在該列的其他定義之后;表約束與列定義相互獨(dú)立,不包括在列定義中,通常用于對多個列一起進(jìn)行約束。創(chuàng)建表時,可以創(chuàng)建CHECK約束作為表定義的一部分。例如,如果創(chuàng)建“學(xué)生”表時為“年齡”字段添加了CHECK約束“年齡<30”,則當(dāng)輸入該字段的值時,不能輸入大于30的數(shù)字。如果表已經(jīng)存在,則可以添加CHECK約束。表和列可以包含多個CHECK約束。CHECK約束條件的示例如表3-1所示。表3-1CHECK約束條件示例

5.索引

索引是一種幫助用戶按照索引字段(一個或幾個字段的集合)的值快速找到指定內(nèi)容的機(jī)制。索引提供指向存儲在表中特定字段的值的指針,然后根據(jù)指定的排列次序?qū)@些指針進(jìn)行排序。數(shù)據(jù)庫中索引的作用與書中的索引相同:在查找特定值時,先在索引中搜索該值,然后按照指向包含該值的行的指針跳轉(zhuǎn)到所需的內(nèi)容。因?yàn)橥ㄟ^索引查找比直接在原表中查找快捷得多,因而,使用索引可以加快對表中特定數(shù)據(jù)的訪問速度。索引雖然起到了為記錄排序的作用,但不改變表中記錄的物理順序,而是另外建立一個記錄的順序表,操作時引用它就可以了。

一般來說,當(dāng)某個或某些字段被當(dāng)作查找記錄或排序的依據(jù)時,可以將其設(shè)定為索引。一個表可以建立多個索引,每個索引確定表中記錄的一種邏輯順序。同指定主鍵類似,可以在單個字段上創(chuàng)建索引,也可以在多個字段上創(chuàng)建索引。

在SQLServer系統(tǒng)中,根據(jù)索引的順序與數(shù)據(jù)表的物理順序是否相同,可將索引分為兩種類型:一種是表中記錄的物理順序與索引順序相同的聚集索引,另一種是兩者不同的非聚集索引。除此之外,還有唯一索引、包含索引、索引視圖、全文索引等。3.3.3SQLServer的數(shù)據(jù)庫對象

一個SQLServer數(shù)據(jù)庫中,除過包含一組存儲數(shù)據(jù)的表對象之外,一般還包括其他幾種對象,如視圖、索引、觸發(fā)器和存儲過程等。這些對象用于保存SQLServer數(shù)據(jù)庫的基本信息以及用戶自定義的數(shù)據(jù)操作等,以便更好地操縱數(shù)據(jù)庫中的數(shù)據(jù)。實(shí)際上,數(shù)據(jù)庫系統(tǒng)的任務(wù)不僅僅是保存數(shù)據(jù),更重要的是通過各種數(shù)據(jù)操縱手段來利用數(shù)據(jù),這也是它有別于數(shù)據(jù)文件等其他數(shù)據(jù)存儲系統(tǒng)的地方。

注:SQLServer中的數(shù)據(jù)庫實(shí)際上是最高層對象,大部分其他對象都是數(shù)據(jù)庫對象的子對象。從技術(shù)角度上說,數(shù)據(jù)庫服務(wù)器也可以看做對象,但按實(shí)際“編程”的觀點(diǎn)來看,不便稱其為對象。

1.視圖

視圖也是由字段與記錄構(gòu)成的一種表。視圖中的數(shù)據(jù)是從基本表中查詢得到的。也就是說,視圖是一種虛擬表,它實(shí)際上只是保存起來的一套查詢規(guī)則,其中的內(nèi)容全部來源于運(yùn)行時從數(shù)據(jù)庫中已有的表(稱為基表或源表)中按規(guī)則取出來的。視圖主要為查詢數(shù)據(jù)提供方便并提高數(shù)據(jù)庫的安全性。例如,為了查詢某些學(xué)生選修的某些課程的考試成績,需要同時在以下三個表中檢索:

學(xué)生(學(xué)號,姓名,班級,…)

課程(課程號,課程名,學(xué)分)

成績(學(xué)號,課程號,分?jǐn)?shù))再將檢索得到的結(jié)果按照

姓名,課程名,分?jǐn)?shù)

的形式打印出來。如果按照關(guān)系模式

考試成績(姓名,課程名,分?jǐn)?shù))

創(chuàng)建一個名為“考試成績”的視圖,則每次進(jìn)行類似查詢時只需要在這個視圖中檢索。這樣不僅查詢方便,而且可以隱藏“學(xué)生”、“課程”和“成績”三個基表,提高數(shù)據(jù)庫操作的安全性。

視圖的使用與基表大體相同。

2.存儲過程

存儲過程可按字面意義理解為存儲起來的操縱數(shù)據(jù)表的過程。實(shí)際上,存儲過程確實(shí)就是把對數(shù)據(jù)表操作的方法有機(jī)地組織起來的一個對象。存儲過程是獨(dú)立于表而存在的。使用存儲過程可以完善應(yīng)用程序,提高應(yīng)用程序的運(yùn)行效率并提高數(shù)據(jù)庫的安全性。一個存儲過程通常是一組SQL語句(SQLServer版稱為Transact-SQL)有機(jī)結(jié)合而成的一個邏輯單元,其中包括變量、參數(shù)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)等程序的一般構(gòu)件。通過存儲過程可以完成數(shù)據(jù)表中數(shù)據(jù)的添加、刪除、修改、查詢等基本操作以及數(shù)據(jù)表的判斷等較為復(fù)雜的操作。與向服務(wù)器發(fā)送單條語句相比,使用存儲過程有許多優(yōu)點(diǎn)。例如,在使用過程中,可以用較短的存儲過程名替代較長的字符串文本,減少存儲過程中的運(yùn)行代碼所需的網(wǎng)絡(luò)信息流量;可以預(yù)先優(yōu)化和預(yù)編譯,從而節(jié)省存儲過程每次運(yùn)行的時間;可以隱藏?cái)?shù)據(jù)庫的復(fù)雜性,使得用戶更方便地操作;等等。

3.觸發(fā)器

觸發(fā)器是一種特殊的存儲過程,它與表格緊密相連,可以看做表格定義的補(bǔ)充。當(dāng)用戶修改指定表或視圖中的數(shù)據(jù)時,觸發(fā)器就會自動執(zhí)行。觸發(fā)器基于一個表創(chuàng)建,但可針對多個表來操作,故常用于實(shí)現(xiàn)復(fù)雜的規(guī)則。

觸發(fā)器是確保數(shù)據(jù)表數(shù)據(jù)一致性的重要的數(shù)據(jù)庫對象之一,通過觸發(fā)器可以完成諸如向一個表插入數(shù)據(jù)的同時向另一個表插入數(shù)據(jù),或者刪除另一個表中數(shù)據(jù)的操作。但是,使用觸發(fā)器也要慎重,如果數(shù)據(jù)庫中存在大量的觸發(fā)器,則會影響操作時的效率。

4.用戶和角色

用戶是獲得了數(shù)據(jù)庫存取權(quán)限的使用者。角色是一組數(shù)據(jù)庫用戶的集合。如果獲得了對于SQLServer實(shí)例的訪問權(quán)限,則被標(biāo)識為一個登錄名。如果獲得了數(shù)據(jù)庫的訪問權(quán)限,則標(biāo)識為數(shù)據(jù)庫用戶。數(shù)據(jù)庫用戶可以是基于登錄名的,也可以創(chuàng)建為不基于登錄名的。

可以給具有數(shù)據(jù)庫訪問權(quán)限的用戶授予訪問數(shù)據(jù)庫中對象的權(quán)限。訪問權(quán)限可以分別授予各個用戶,但最好創(chuàng)建數(shù)據(jù)庫角色并將具有相同權(quán)限的用戶添加到同一角色中,然后對角色授予訪問權(quán)限。同一角色中的所有用戶具有相同的權(quán)限。3.4.1通過圖形用戶界面創(chuàng)建數(shù)據(jù)庫

使用數(shù)據(jù)庫之前,必須先創(chuàng)建數(shù)據(jù)庫并生成相應(yīng)的數(shù)據(jù)文件和日志文件。隨后在所創(chuàng)建的數(shù)據(jù)庫中,按照數(shù)據(jù)庫設(shè)計(jì)所得到的一系列關(guān)系模式創(chuàng)建一個個的表以及表與表之間的聯(lián)系,就基本形成了一個數(shù)據(jù)庫的框架。當(dāng)然,實(shí)際可用的數(shù)據(jù)庫在數(shù)據(jù)入庫以及創(chuàng)建了視圖、索引、存儲過程等各種數(shù)據(jù)庫對象之后才能成型。

注:SQLServer中,新建的數(shù)據(jù)庫實(shí)際上是根據(jù)model數(shù)據(jù)庫中保存的數(shù)據(jù)庫模板創(chuàng)建的,也就是說它是model數(shù)據(jù)庫的一個副本。

3.4創(chuàng)建SQLServer數(shù)據(jù)庫大多數(shù)使用數(shù)據(jù)庫的人員都使用SQLServerManagementStudio工具。ManagementStudio工具有一個圖形用戶界面,用于創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)庫中的對象。ManagementStudio還具有一個查詢編輯器,用于通過編寫Transact-SQL語句與數(shù)據(jù)庫進(jìn)行交互。ManagementStudio可以從SQLServer安裝磁盤進(jìn)行安裝,也可以從MSDN中下載。

在SQLServerManagementStudio中,用戶可以方便地通過可視化方法創(chuàng)建數(shù)據(jù)庫。

【例3-5】創(chuàng)建“教學(xué)”數(shù)據(jù)庫。

(1)打開SQLServerManagementStudio。

①選擇“開始”→“程序”→“MicrosoftSQLServer2008”→“SQLServerManagementStudio”菜單項(xiàng),打開SQLServerManagementStudio窗口。

②使用“Windows身份驗(yàn)證”連接到SQLServer2008數(shù)據(jù)庫實(shí)例。

(2)打開“新建數(shù)據(jù)庫”對話框。

在“對象資源管理器”窗格中展開服務(wù)器,然后右擊“數(shù)據(jù)庫”結(jié)點(diǎn)并選擇快捷菜單中的“新建數(shù)據(jù)庫”命令,打開“新建數(shù)據(jù)庫”對話框,如圖3-10所示。

圖3-10中,“選擇頁”下有三個選項(xiàng):常規(guī)、選項(xiàng)和文件組。完成了這三個選項(xiàng)的設(shè)置,就完成了數(shù)據(jù)庫的創(chuàng)建工作。

常規(guī)——“數(shù)據(jù)庫文件”列表中包括兩行,分別是數(shù)據(jù)文件和日志文件,其中各字段的意義如下:圖3-10“新建數(shù)據(jù)庫”對話框

(3)定制并創(chuàng)建“dbCourses”數(shù)據(jù)庫。

①在“新建數(shù)據(jù)庫”對話框中“常規(guī)”頁的“數(shù)據(jù)庫名稱”文本框中輸入數(shù)據(jù)庫名稱“dbCourses”。

注:數(shù)據(jù)庫的名稱必須遵循SQLServer2008的命名規(guī)則,如長度在1~128個字符之間,不能使用某些字符(如*#?“<>|),不能包含SQLServer2008的保留字(如master)等。

②如果接受所有默認(rèn)值,可以單擊“確定”按鈕結(jié)束創(chuàng)建工作。本例中的“dbCourses”數(shù)據(jù)庫不用默認(rèn)值,因此還需執(zhí)行以下兩步。

③在“所有者”下拉列表框中選擇數(shù)據(jù)庫所有者:單擊“瀏覽”按鈕,打開“查找對象”對話框,如圖3-11所示,選擇登錄對象sa作為數(shù)據(jù)庫的所有者。圖3-11查找對象對話框注:數(shù)據(jù)庫的所有者是對數(shù)據(jù)庫有完全操作權(quán)限的用戶。默認(rèn)值表示當(dāng)前登錄Windows系統(tǒng)的是管理員賬戶。

④選中“使用全文索引”復(fù)選框,啟用數(shù)據(jù)庫的全文搜索。這樣數(shù)據(jù)庫中的變長復(fù)雜數(shù)據(jù)類型列也可以建立索引。

⑤單擊“確定”按鈕,結(jié)束創(chuàng)建工作。

創(chuàng)建數(shù)據(jù)庫的工作完成之后,選擇“視圖”→“刷新”菜單項(xiàng),則在對象資源管理器的數(shù)據(jù)庫結(jié)點(diǎn)之下將出現(xiàn)剛創(chuàng)建的dbCourses數(shù)據(jù)庫結(jié)點(diǎn),如圖3-12(a)所示。(a)

(b)圖3-12新建數(shù)據(jù)庫的文件與結(jié)點(diǎn)3.4.2通過圖形用戶界面創(chuàng)建數(shù)據(jù)庫中的表

創(chuàng)建表的首要任務(wù)是定義表的結(jié)構(gòu),即規(guī)定表頭的內(nèi)容和格式。在SQLServer中,一個數(shù)據(jù)庫中可以創(chuàng)建多個表,而且每個表中包含的列的數(shù)目多達(dá)1024個。列的數(shù)目及表的總大小僅受限于可用的硬盤存儲容量。另外,每列的寬度可以達(dá)到8092字節(jié),而且image、text或者ntext類型的數(shù)據(jù)不受此限制。

注:默認(rèn)狀態(tài)下,只有系統(tǒng)管理員和數(shù)據(jù)庫擁有者(DBO)可以創(chuàng)建新表,但這兩類人可以授權(quán)其他人來完成這一任務(wù)。

【例3-6】創(chuàng)建“教學(xué)”數(shù)據(jù)庫中的“學(xué)生”表并輸入數(shù)據(jù)。

要創(chuàng)建的“學(xué)生”表結(jié)構(gòu)如下:

(1)打開“教學(xué)”數(shù)據(jù)庫。

①選擇“開始”→“程序”→“MicrosoftSQLServer2005”→“SQLServerManagementStudio”菜單項(xiàng),打開SQLServerManagementStudio窗口。

②使用“Windows身份驗(yàn)證”連接到SQLServer2008數(shù)據(jù)庫實(shí)例。

③在“對象資源管理器”窗格中展開服務(wù)器,展開下屬的“數(shù)據(jù)庫”結(jié)點(diǎn),再展開下屬的“dbCourses”結(jié)點(diǎn)。

(2)打開“新建表”對話框。右擊dbCourses結(jié)點(diǎn)下屬的“表”結(jié)點(diǎn),選擇快捷菜單中的“新建表”命令,打開表設(shè)計(jì)器對話框,如圖3-13所示。圖3-13SQLServer用戶界面及表設(shè)計(jì)器對話框

(3)在表設(shè)計(jì)器對話框中定義表的結(jié)構(gòu)。定義表的結(jié)構(gòu)意為指定表中所有字段的字段名、數(shù)據(jù)類型、寬度等。需要按照預(yù)先設(shè)計(jì)的表的結(jié)構(gòu),逐個地進(jìn)行。

●輸入字段名:字段名在表中是唯一的而且必須遵守SQLServer的命名規(guī)則。

●選擇性地輸入數(shù)據(jù)類型,并在類型名后面的括號中輸入字段寬度,如char(10)表示寬度為10的字符串;float(10,3)表示總寬度為10、小數(shù)點(diǎn)后有3位的浮點(diǎn)數(shù)。

●必要時勾選“允許Null值”復(fù)選框。

注:SQLServer中,char(n)類型用于存儲固定長度的字符,最多可存儲8000個字符,每個字符占一個字節(jié)。nchar(n)類型也用于存儲固定長度的字符,最多可存儲4000個字符,每個字符占兩個字節(jié)。

(4)設(shè)置主鍵。右擊要設(shè)置為主鍵的“學(xué)號”字段的行選擇器(該行最前面的小方塊),選擇快捷菜單中的“設(shè)置主鍵”命令,則該字段會帶上鑰匙狀標(biāo)記。

如果主鍵為多個字段,按住Ctrl鍵并逐個單擊各字段,然后右擊選擇命令,即可設(shè)置這幾個字段共同體為主鍵。

設(shè)計(jì)好的“學(xué)生”表的結(jié)構(gòu)如圖3-14(a)所示,其中“姓名”字段的屬性如圖3-14(b)所示。(a)

(b)圖3-11“學(xué)生”表的結(jié)構(gòu)及其中“姓名”字段的屬性

(5)設(shè)置CHECK約束。

①右擊要設(shè)置CHECK約束的“出生年月”字段名,選擇快捷菜單中的“CHECK約束”命令,打開“CHECK約束”對話框,如圖3-15(a)所示。

②單擊“常規(guī)”欄“表達(dá)式”格右側(cè)的…按鈕,打開“CHECK約束表達(dá)式”對話框,如圖3-15(b)所示。

③輸入表達(dá)式:

出生年月>'1982-01-01'

或者(輸入上面的表達(dá)式后,自動變?yōu)橄旅娴谋磉_(dá)式)

([出生年月]>'1982-01-01')

并單擊“確定”按鈕,保存CHECK約束。

注:CHECK約束可以和一個列關(guān)聯(lián),也可以和表關(guān)聯(lián),可以檢查一個列的值相對于另外一個列的值,只要這些列都在同一個表中以及值是在更新或者插入的同一行中。(a)

(b)圖3-15“CHECK約束”及“CHECK約束表達(dá)式”對話框

(6)保存設(shè)計(jì)好的表。

①單擊工具欄上的“保存”或者選擇“文件”→“保存”→“另存為”菜單項(xiàng),打開“另存為”對話框。

②在彈出的“選擇名稱”對話框的“輸入表名”文本框中,輸入表名“學(xué)生”,并單擊“確定”按鈕將其保存。

(7)輸入“學(xué)生”表中的數(shù)據(jù)。

①右擊dbo.學(xué)生結(jié)點(diǎn),選擇快捷菜單中的“編輯前200行”命令,打開輸入表中數(shù)據(jù)的對話框。

②選擇第一行中的文本框,此時選擇器將提示該行正處于編輯將態(tài)。在該對話框中根據(jù)各個列的屬性輸入數(shù)據(jù)。還可以在該對話框中查看表中的所有數(shù)據(jù)行,也可向表中添加、刪除數(shù)據(jù)和修改表中已有的數(shù)據(jù)。本例中,輸入如圖3-16所示的數(shù)據(jù)。圖3-16輸入“學(xué)生”表中數(shù)據(jù)的對話框圖3-17輸入錯誤數(shù)據(jù)時系統(tǒng)顯示的消息框3.4.3創(chuàng)建數(shù)據(jù)庫關(guān)系圖

注:如果多人同時使用數(shù)據(jù)庫關(guān)系圖工具來操作同一個數(shù)據(jù)庫,并且?guī)讉€人所做的更改作用到了同一個表上,則最后保存的操作結(jié)果覆蓋先保存的內(nèi)容而決定最終的表的布局。

1.?dāng)?shù)據(jù)庫關(guān)系圖的顯示

在數(shù)據(jù)庫關(guān)系圖中,顯示了表、表中的字段名列表以及表與表之間的關(guān)系。用鑰匙狀圖案標(biāo)記的字段為主鍵,如圖3-18所示。實(shí)際上,在這個圖中也可以對顯示出來的表中的字段進(jìn)行定義,例如,可以修改列的名稱、數(shù)據(jù)類型、長度和注釋等。圖3-18數(shù)據(jù)庫關(guān)系圖默認(rèn)形式的數(shù)據(jù)庫關(guān)系圖中,每個表都由三個不同的部分構(gòu)成。

(1)標(biāo)題欄:用于顯示表的名稱。如果修改了某個表之后尚未保存它,則表名末尾將顯示一個星號(?*?)。

(2)行選擇器:可以單擊行選擇器來選擇表中的字段。如果該字段是表的主鍵,則行選擇器上顯示鑰匙狀符號。

(3)字段名列表:字段名列表僅在表的某些視圖中可見。

2.?dāng)?shù)據(jù)庫關(guān)系圖與數(shù)據(jù)庫中的表

可以為一個數(shù)據(jù)庫創(chuàng)建多個數(shù)據(jù)庫關(guān)系圖。每個數(shù)據(jù)庫表都可以出現(xiàn)在任意數(shù)目的關(guān)系圖中。這樣,便可以創(chuàng)建不同的關(guān)系圖使數(shù)據(jù)庫的不同部分可視化或者強(qiáng)調(diào)設(shè)計(jì)的不同方面。例如,可以創(chuàng)建一個大型關(guān)系圖來顯示所有的表和字段,再創(chuàng)建一個較小的關(guān)系圖來顯示所有表但不顯示字段。

SQLServer的數(shù)據(jù)庫關(guān)系圖工具除過可以創(chuàng)建關(guān)系圖之外,還可以用于添加表、修改表、構(gòu)建關(guān)系或者添加索引等操作。在其中所做的任何更改都會先保存在內(nèi)存中,然后通過保存命令提交給數(shù)據(jù)庫。如果一個正在編輯的數(shù)據(jù)庫關(guān)系圖中包含了某個已經(jīng)刪除了的表,則當(dāng)涉及該表的某些更改尚未保存時,該表將會重建。如果該表未曾更改,則重新打開關(guān)系圖后,可以看到它被刪除了。

如果需要在SQLServer中更改表的結(jié)構(gòu),則必須先刪除原來的表,然后重新創(chuàng)建新表。如果強(qiáng)行更改,則會出現(xiàn)提示信息:“不允許保存更改。您所做的更改要求刪除并重新創(chuàng)建以下表。您對無法重新創(chuàng)建的表進(jìn)行了更改或者啟用了“阻止保存要求重新創(chuàng)建表的更改”選項(xiàng)。

去掉這個提示并使得所做的修改保存到數(shù)據(jù)庫中的方法是:

(1)在SQLServer主窗口中選擇“工具”→“選項(xiàng)”→“選項(xiàng)”菜單項(xiàng),打開“選項(xiàng)”對話框,如圖3-19所示。

(2)展開Designers結(jié)點(diǎn),選擇“表設(shè)計(jì)器和數(shù)據(jù)庫設(shè)計(jì)器”項(xiàng),并在右側(cè)的“表選項(xiàng)”欄中取消對“阻止保存要求重新創(chuàng)建表的更改”項(xiàng)的選擇。圖3-19“選項(xiàng)”對話框

【例3-7】創(chuàng)建“教學(xué)”數(shù)據(jù)庫關(guān)系圖。

創(chuàng)建了“教學(xué)”數(shù)據(jù)庫中的所有表之后,就可以按照以下步驟創(chuàng)建其數(shù)據(jù)庫關(guān)系圖了。

(1)打開編輯數(shù)據(jù)庫關(guān)系圖的對話框。

①右擊數(shù)據(jù)庫關(guān)系圖結(jié)點(diǎn),選擇快捷菜單中的“新建數(shù)據(jù)庫關(guān)系圖”命令。

②當(dāng)SQLServer顯示如圖3-20(a)所示的消息框時,單擊“是”按鈕,打開編輯數(shù)據(jù)庫關(guān)系圖的對話框以及“添加表”對話框(如圖3-20(b)所示)。(a)

(b)圖3-20編輯數(shù)據(jù)庫關(guān)系圖的對話框

(2)在“添加表”對話框中,全選表名列表中的所有表名,將“教學(xué)”數(shù)據(jù)庫中的幾個表都放到編輯數(shù)據(jù)庫關(guān)系圖的對話框中。

(3)編輯數(shù)據(jù)庫關(guān)系圖??梢圆捎猛戏诺姆绞?,分別建立兩個表之間的一對多聯(lián)系。例如,將“班級”表和“學(xué)生”表通過共有的“班號”字段連接起來的方法如下:

①將“班級”表中的“班號”字段(主鍵)往“學(xué)生”表的“班號”字段上拖放。

②在彈出的“表和列”對話框(圖3-21(a))中,確認(rèn)兩個表名以及共有字段名無誤后,單擊“確定”按鈕。

③查看彈出的“外鍵關(guān)系”對話框(圖3-21(b)),確認(rèn)無誤后單擊“確定”按鈕。(a)

(b)圖3-21建立兩個表之間聯(lián)系的對話框如果操作無誤,則兩表之間將會出現(xiàn)相應(yīng)的連線,且“班級”表(主鍵表)一端以鑰匙標(biāo)記,“學(xué)生”表(外鍵表)一端以∞標(biāo)記。

完整的“教學(xué)”數(shù)據(jù)庫關(guān)系圖如圖3-22所示。圖3-22“教學(xué)”數(shù)據(jù)庫關(guān)系圖3.4.4創(chuàng)建索引

1.聚集索引與非聚集索引

在創(chuàng)建索引前,首先要確定索引所使用的列。索引可以在一個列上創(chuàng)建,稱之為簡單索引;也可以在多個列上創(chuàng)建,稱之為組合索引。列的選擇由它所在的環(huán)境以及其中所保存的數(shù)據(jù)來決定。索引中數(shù)據(jù)的邏輯順序與數(shù)據(jù)在表中的物理順序有時相同有時不同,可據(jù)此將索引分為聚集索引和非聚集索引兩種。聚集索引定義了數(shù)據(jù)在表中存儲的物理順序。如果聚集索引中定義了多個列,則數(shù)據(jù)將按這些列來排序并存儲:先按第一列指定的順序,再按第二列指定的順序,依此類推。顯然,一個表中的數(shù)據(jù)只能按照一種物理順序來存儲,因此,一個表中只能定義一個聚集索引。插入數(shù)據(jù)時,SQLServer使用聚集索引找到插入位置,并將此處及此后的數(shù)據(jù)一起后移,然后將所輸入的數(shù)據(jù)連同索引鍵值一同插入空出的位置,從而保持了應(yīng)有的順序??梢韵胍?,如果某個列經(jīng)常需要更新,則不宜放入聚集索引,否則會因經(jīng)常改變數(shù)據(jù)的存儲位置而導(dǎo)致過多的處理開銷。另外,由于聚集索引指定的數(shù)據(jù)邏輯順序與其實(shí)際存儲順序相同,故索引提取數(shù)據(jù)時需要進(jìn)行的輸入/輸出操作次數(shù)比非聚集索引少。因此,如果表中只有一個索引,則應(yīng)確保它是聚集索引。

注:只有當(dāng)表包含聚集索引時,其中的數(shù)據(jù)行才按排序順序存儲。如果表具有聚集索引,則稱之為聚集表。如果表沒有聚集索引,則其數(shù)據(jù)行存儲在一個稱為堆的無序結(jié)構(gòu)中。非聚集索引中數(shù)據(jù)的邏輯結(jié)構(gòu)獨(dú)立于數(shù)據(jù)在表中的物理結(jié)構(gòu)。非聚集索引由一系列依序編排的索引值(一般為鍵)以及各索引值自帶的指向表中數(shù)據(jù)的物理位置的指針構(gòu)成。它不會改變表中數(shù)據(jù)的實(shí)際存儲順序,但可通過每個索引值自帶的指針找到相應(yīng)的數(shù)據(jù)。因此,一個表中同時可以存在多個非聚集索引。顯然,當(dāng)需要以多種方式檢索數(shù)據(jù)時,創(chuàng)建多個適應(yīng)不同檢索方式的非聚集索引是有好處的。

注:非聚集索引中的索引行指向數(shù)據(jù)行的指針稱為行定位器。行定位器的結(jié)構(gòu)取決于數(shù)據(jù)是存儲在堆中還是聚集表中。對于堆,行定位器是指向行的指針。對于聚集表,行定位器是聚集索引鍵。

2.唯一索引與主鍵索引

無論是聚集索引還是非聚集索引,都可以設(shè)置為“索引值不能重復(fù)”,稱之為唯一索引。唯一索引不允許兩行具有相同的索引值(包括NULL值在內(nèi))。如果現(xiàn)有數(shù)據(jù)中存在重復(fù)的索引值,則大多數(shù)數(shù)據(jù)庫都會阻止新創(chuàng)建的唯一索引與表保存在一起。當(dāng)新數(shù)據(jù)會使表中的索引值重復(fù)時,數(shù)據(jù)庫也拒絕接受該數(shù)據(jù)。

在一個表中定義了主鍵之后,將會自動創(chuàng)建主鍵索引。主鍵索引是唯一索引的特殊類型,它要求主鍵中的每個值是唯一的。當(dāng)在查詢中使用主鍵索引時,它還允許快速訪問數(shù)據(jù)。

注:復(fù)合索引是基于多個字段創(chuàng)建的索引。它也可以是唯一索引,即字段組合不能重復(fù),但單獨(dú)字段值可以重復(fù)。

3.索引和統(tǒng)計(jì)信息

獲取數(shù)據(jù)時,SQLServer會根據(jù)當(dāng)時情況采用最好的方法進(jìn)行操作,并將結(jié)果返回給請求它的查詢。例如,在提取相同的數(shù)據(jù)且有多個索引可供選擇時,SQLServer會根據(jù)相關(guān)信息選擇其中一個;甚至在有相應(yīng)索引可用的情況下,SQLServer也可能會通過逐行掃描的方法來提取數(shù)據(jù)。做出這些選擇的依據(jù)是統(tǒng)計(jì)信息。

SQLServer會為索引中包含的每一列都保存統(tǒng)計(jì)信息。這些統(tǒng)計(jì)信息在經(jīng)過了一定的時間或進(jìn)行了一定次數(shù)的數(shù)據(jù)插入和更改之后會被更新。因此,如果在已輸入了數(shù)據(jù)的表中創(chuàng)建了索引或者修改了已有的索引,但卻未能使SQLServer更新表上的統(tǒng)計(jì)信息,那么,SQLServer在提取數(shù)據(jù)時,可能會因未能得到正確的信息而采用了低效率的操作方式。

SQLServer會在必要時按照預(yù)先的設(shè)置自動更新統(tǒng)計(jì)信息。例如,可在創(chuàng)建索引時指定“重新計(jì)算統(tǒng)計(jì)信息”,也可通過圖形用戶界面或者SQL語言中的命令來“手動更新”。

【例3-8】為“教學(xué)”數(shù)據(jù)庫中的“學(xué)生”表創(chuàng)建索引。

通過SQLServer的圖形用戶界面進(jìn)行創(chuàng)建非常方便,但必須預(yù)先考慮以下幾個問題:

●要創(chuàng)建的索引中,需要包含哪些列?例如,如果需要按班級顯示“學(xué)生”表中的所有記錄,則索引中包含“班號”字段即可,如果還需要班內(nèi)按學(xué)號顯示,則再包含“學(xué)號”字段即可。

●一個列中,是否只包含唯一的值?例如,在“學(xué)生”表中,一個班級通常有二三十名甚至更多的學(xué)生,一般不宜創(chuàng)建基于“班號”的唯一索引?!袷欠駝?chuàng)建聚集索引?例如,“學(xué)生”表中的主鍵是學(xué)號,該表中的記錄按“學(xué)號”排序是很自然的。如果要創(chuàng)建基于“班號”的聚集索引,則該表中的記錄將改為按“班號”來排序。因此,創(chuàng)建索引之前要想清楚,這樣做是否有利于大多數(shù)操作。

本例按以下步驟創(chuàng)建一個基于“班號”的非聚集索引。

(1)打開“索引/鍵”對話框。右擊“學(xué)生”表結(jié)點(diǎn),選擇快捷菜單中的“索引/鍵”命令,打開“索引/鍵”對話框,如圖3-23(a)所示。

(2)定制索引。

①單擊“添加”按鈕,在左側(cè)的索引列表中添加一個自動命名的索引項(xiàng)。

②單擊右側(cè)“常規(guī)”欄中的“列-索引”網(wǎng)格中的…按鈕,打開“索引列”對話框。

③在“列名”欄選擇“班號”和“學(xué)號”,“排序順序”欄選擇默認(rèn)的“升序”值,如圖3-23(b)所示。

單擊“確定”按鈕后,“索引/鍵”對話框中顯示如圖3-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論