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

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

數(shù)據(jù)庫(kù)是所有數(shù)據(jù)庫(kù)對(duì)象的承載,也是SQL Server 2008相關(guān)知識(shí)學(xué)習(xí)的起點(diǎn)。本章將重點(diǎn)學(xué)習(xí)使用SQL Server 2008進(jìn)行設(shè)計(jì)和創(chuàng)建的方法。首先介紹數(shù)據(jù)庫(kù)設(shè)計(jì)的相關(guān)內(nèi)容:模型結(jié)構(gòu)、關(guān)系與范式;接下來(lái)講述SQL Server 2008中的系統(tǒng)數(shù)據(jù)庫(kù),以及它們?cè)赟QL Server 2008中的使用和所提供的管理作用;最后講述如何創(chuàng)建用戶數(shù)據(jù)庫(kù)和有關(guān)數(shù)據(jù)庫(kù)的管理。

在本章中,將重點(diǎn)學(xué)習(xí)以下內(nèi)容:

● 數(shù)據(jù)模型的分類與概念。

● 使用ER模型的關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)。

● 第一范式、第二范式與第三范式。

● SQL Server 2008的預(yù)設(shè)數(shù)據(jù)庫(kù)。

● 使用SQL Server 2008創(chuàng)建數(shù)據(jù)庫(kù)。

● 使用SQL Server 2008管理數(shù)據(jù)庫(kù)。

3.1 數(shù)據(jù)庫(kù)設(shè)計(jì)——模型與結(jié)構(gòu)

現(xiàn)實(shí)世界中,個(gè)體間總存在著某些聯(lián)系。反映到信息世界中,就是實(shí)體的聯(lián)系,由此構(gòu)成實(shí)體模型。反映到數(shù)據(jù)庫(kù)系統(tǒng)中,是記錄間的聯(lián)系。將實(shí)體模型數(shù)據(jù)化,轉(zhuǎn)化成數(shù)據(jù)模型,這個(gè)過(guò)程就是我們抽象實(shí)際數(shù)據(jù)和設(shè)計(jì)數(shù)據(jù)庫(kù)的過(guò)程。

3.1.1 數(shù)據(jù)模型的基本概念

在數(shù)據(jù)庫(kù)中,用數(shù)據(jù)模型(Data Model)這個(gè)工具來(lái)抽象、表示和處理現(xiàn)實(shí)世界中的數(shù)據(jù)和信息。通俗地講,數(shù)據(jù)模型就是現(xiàn)實(shí)世界的模擬。根據(jù)應(yīng)用目的,模型分為兩個(gè)層次。

● 概念模型(信息模型):從用戶角度看到的模型。該模型要求概念簡(jiǎn)單,表達(dá)清晰,易于理解。

● 數(shù)據(jù)模型:從計(jì)算機(jī)角度看到的模型。要求使用有嚴(yán)格語(yǔ)法和語(yǔ)義的語(yǔ)言對(duì)數(shù)據(jù)進(jìn)行嚴(yán)格形式化定義、限制和規(guī)定,使模型能轉(zhuǎn)變?yōu)橛?jì)算機(jī)可以理解的格式。主要包括網(wǎng)狀模型、層次模型、關(guān)系模型等。

數(shù)據(jù)庫(kù)中的數(shù)據(jù)是高度結(jié)構(gòu)化的。也就是說(shuō),數(shù)據(jù)庫(kù)不僅要考慮記錄內(nèi)的各個(gè)數(shù)據(jù)項(xiàng)之間的關(guān)系,還要考慮記錄與記錄之間的關(guān)系。

數(shù)據(jù)模型主要是指描述這種聯(lián)系的數(shù)據(jù)結(jié)構(gòu)形式。在數(shù)據(jù)庫(kù)的開發(fā)過(guò)程中主要有下面3種數(shù)據(jù)模型:層次模型、網(wǎng)狀模型和關(guān)系模型。其中層次模型和網(wǎng)狀模型統(tǒng)稱為非關(guān)系模型,在數(shù)據(jù)庫(kù)發(fā)展的歷史中曾經(jīng)占據(jù)很重要的地位,但現(xiàn)在基本上被關(guān)系模型所替代了。以SQL Server、Oracle等為代表的數(shù)據(jù)庫(kù)管理系統(tǒng)針對(duì)的都是關(guān)系型數(shù)據(jù)庫(kù)的管理,因此在現(xiàn)有數(shù)據(jù)庫(kù)的設(shè)計(jì)中,我們首先要關(guān)注的就是關(guān)系的建立和管理問(wèn)題。

3.1.2 層次模型

層次模型用樹形結(jié)構(gòu)來(lái)表示各類實(shí)體及實(shí)體間的聯(lián)系。每個(gè)節(jié)點(diǎn)表示一個(gè)記錄類型,節(jié)點(diǎn)之間的連線表示記錄類型間的聯(lián)系,這種聯(lián)系只能是父子聯(lián)系。每個(gè)記錄類型可包含若干個(gè)字段。在這個(gè)模型里,記錄類型描述的是實(shí)體,字段描述實(shí)體的屬性。任何一個(gè)給定的記錄值只有按其路徑查看時(shí),才能顯示出它的全部意義,沒(méi)有一個(gè)子記錄值能夠脫離雙親記錄值而獨(dú)立存在。如圖3-1所示是一個(gè)簡(jiǎn)單的層次模型示意圖。

圖3.1 層次模型示意圖

層次數(shù)據(jù)模型的操作主要有查詢、插入、刪除和更新。進(jìn)行插入、刪除、更新操作時(shí)要滿足層次模型的完整性約束條件:

● 進(jìn)行插入操作時(shí),如果沒(méi)有相應(yīng)的雙親節(jié)點(diǎn)值就不能插入子女節(jié)點(diǎn)值。

● 進(jìn)行刪除操作時(shí),如果刪除雙親節(jié)點(diǎn)值,則相應(yīng)的子女節(jié)點(diǎn)值也被同時(shí)刪除。

● 進(jìn)行更新操作時(shí),應(yīng)更新所有相應(yīng)記錄,以保證數(shù)據(jù)的一致性。

層次數(shù)據(jù)模型的優(yōu)點(diǎn):數(shù)據(jù)模型比較簡(jiǎn)單,操作方便;對(duì)于實(shí)體間聯(lián)系是固定的,且預(yù)先定義好應(yīng)用系統(tǒng),性能較高;提供良好的完整性支持。層次數(shù)據(jù)模型的缺點(diǎn):不適合于表示非層次性的聯(lián)系;對(duì)插入和刪除操作的限制比較多;查詢子女節(jié)點(diǎn)必須通過(guò)雙親節(jié)點(diǎn);由于結(jié)構(gòu)嚴(yán)密,層次命令趨于程序化。

3.1.3 網(wǎng)狀模型

網(wǎng)狀數(shù)據(jù)模型是一種比層次模型更具普遍性的結(jié)構(gòu)。它去掉了層次模型的兩個(gè)限制,允許多個(gè)節(jié)點(diǎn)沒(méi)有雙親節(jié)點(diǎn),允許節(jié)點(diǎn)有多個(gè)雙親節(jié)點(diǎn)。此外,它允許兩個(gè)節(jié)點(diǎn)之間有多種聯(lián)系(復(fù)合聯(lián)系)。

● 網(wǎng)狀數(shù)據(jù)模型的優(yōu)點(diǎn):能夠更為直接地描述現(xiàn)實(shí)世界;具有良好的性能,存取效率較高。

● 網(wǎng)狀數(shù)據(jù)模型的缺點(diǎn):其數(shù)據(jù)定義語(yǔ)言極其復(fù)雜;數(shù)據(jù)獨(dú)立性較差。由于實(shí)體間的聯(lián)系本質(zhì)上是通過(guò)存取路徑指示的,因此應(yīng)用程序在訪問(wèn)數(shù)據(jù)時(shí)要指定存取路徑。

3.1.4 關(guān)系模型

一個(gè)關(guān)系模型的邏輯結(jié)構(gòu)是一張二維表,它由行和列組成。在關(guān)系模型中,實(shí)體及實(shí)體間的聯(lián)系都用關(guān)系來(lái)表示。關(guān)系模型要求關(guān)系必須是規(guī)范化的,最基本的條件就是關(guān)系的每一個(gè)分量必須是一個(gè)不可分的數(shù)據(jù)項(xiàng),即不允許表中還有表。例如,表3.1所示的學(xué)生信息表就是一個(gè)關(guān)系模型。

表3.1 2008級(jí)學(xué)生信息表

該表涉及如下一些概念:

● 關(guān)系:對(duì)應(yīng)通常所說(shuō)的表,如表3.1所示的這張基本信息表。

● 記錄:圖中的一行即為一個(gè)記錄,如果表3.1中有20行,即有20個(gè)記錄。

● 屬性:圖中的一列即為一個(gè)屬性,如表3.1中有5列,對(duì)應(yīng)5個(gè)屬性(編號(hào)、姓名、年齡、籍貫、專業(yè))。

● 鍵(關(guān)鍵字):在關(guān)系型數(shù)據(jù)庫(kù)的表中,鍵是標(biāo)識(shí)記錄的一種方式。因?yàn)殒I涉及的是全部的記錄,所以可以使用鍵來(lái)建立表之間的關(guān)系。例如,當(dāng)要用到不同表中的同名列進(jìn)行工作時(shí),可以利用這種特性。以鍵作為一種捷徑,能夠很容易地在兩個(gè)表之間建立鏈接。當(dāng)唯一地標(biāo)識(shí)表中的記錄是數(shù)據(jù)庫(kù)設(shè)計(jì)中的重要部分時(shí),鍵也能被使用。當(dāng)單獨(dú)一個(gè)列足以標(biāo)識(shí)記錄時(shí),可以將鍵定義在單一的列上,否則,將鍵定義在多個(gè)列上。

主關(guān)鍵字:表3.1中的某個(gè)屬性組,它可以唯一確定一個(gè)記錄。例如,表3.1中的編號(hào)是按照學(xué)生學(xué)號(hào)的編排方法,每個(gè)學(xué)生的學(xué)號(hào)都是不同的,所以它可唯一確定一名學(xué)生,也就成為本關(guān)系的主關(guān)鍵字。主鍵是最重要的一種鍵的類型。定義主鍵的列必須只包含唯一的值。為此,不可能在任何允許NULL值的列上定義主鍵。關(guān)于主鍵的另一個(gè)限制是,一個(gè)表只能有一個(gè)主鍵。可以利用主鍵把一個(gè)表中的數(shù)據(jù)與另一個(gè)表中的數(shù)據(jù)相關(guān)聯(lián)。

候選關(guān)鍵字:那些可以用做關(guān)鍵字的屬性或?qū)傩缘慕M合。例如,在表3.1中編號(hào)和(編號(hào),姓名),它們都能唯一標(biāo)識(shí)下面中的每一行,編號(hào)和(編號(hào),姓名)均是候選關(guān)鍵字。可以指定編號(hào)也可以指定(編號(hào),姓名),被指定的就是主關(guān)鍵字。

公共關(guān)鍵字:連接兩個(gè)表的公共屬性。例如,表3.1和表3.2是通過(guò)編號(hào)進(jìn)行聯(lián)系的,它是兩個(gè)表的公共屬性,也就是兩個(gè)表的公共關(guān)鍵字。

表3.2 2008級(jí)學(xué)生課程成績(jī)表

外關(guān)鍵字:也稱為外鍵或外碼,它是由一個(gè)表中的一個(gè)屬性或多個(gè)屬性所組成的。外關(guān)鍵字能表示另一個(gè)表的主關(guān)鍵字,實(shí)際上外關(guān)鍵字本身只是主關(guān)鍵字的備份,它是公共關(guān)鍵字。使用外關(guān)鍵字來(lái)描述表和表之間的聯(lián)系。一個(gè)表不一定有外關(guān)鍵字,而且外關(guān)鍵字的值也不一定是唯一的。它允許有重復(fù)值,也允許為空值(NULL)。

● 替代主鍵的唯一約束:通過(guò)定義這種約束,將確保唯一值只能輸入到在約束中定義的一個(gè)或幾個(gè)列中。盡管很像前面講過(guò)的主鍵定義,但二者是不同的。唯一約束不是主鍵,但在唯一約束中定義的一個(gè)或幾個(gè)列也可能成為主鍵。此外,唯一約束能夠包含NULL值,但主鍵不能。不過(guò),由于NULL被視為與列中任何其他值一樣,因此,當(dāng)準(zhǔn)備插入或更新數(shù)據(jù)時(shí),必須使構(gòu)成唯一約束的列保持唯一,從而只允許有一個(gè)NULL值。最后,一個(gè)表可以有多個(gè)唯一約束,但只能有一個(gè)主鍵。

1.關(guān)系模型的操作與完整性約束

關(guān)系數(shù)據(jù)模型的操作主要包括查詢、插入、刪除和更新數(shù)據(jù)。這些操作必須滿足關(guān)系的完整性約束條件。關(guān)系的完整性約束條件包括三大類:實(shí)體完整性、參照完整性和用戶定義的完整性。關(guān)系模型中的數(shù)據(jù)操作是集合操作,操作對(duì)象和操作結(jié)果都是關(guān)系,即若干記錄的集合。關(guān)系模型把存取路徑向用戶隱藏起來(lái),用戶只要指出“干什么”,不必詳細(xì)說(shuō)明“怎么干”,從而大大提高了數(shù)據(jù)的獨(dú)立性,提高了用戶的工作效率。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言是SQL語(yǔ)言。

2.關(guān)系模型的優(yōu)、缺點(diǎn)

關(guān)系數(shù)據(jù)模型的優(yōu)點(diǎn)如下:

● 關(guān)系模型是建立在嚴(yán)格的數(shù)學(xué)概念基礎(chǔ)上的,無(wú)論實(shí)體還是實(shí)體之間的聯(lián)系都用關(guān)系來(lái)表示,數(shù)據(jù)的查詢結(jié)果也是關(guān)系(表),因此,概念單一,數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單、清晰。

● 關(guān)系模型的存取路徑對(duì)用戶透明,從而具有更高的數(shù)據(jù)獨(dú)立性、更好的安全保密性,也簡(jiǎn)化了程序員的工作和數(shù)據(jù)庫(kù)的開發(fā)工作。

關(guān)系數(shù)據(jù)模型的缺點(diǎn):由于存取路徑對(duì)用戶透明,查詢效率往往不如非關(guān)系數(shù)據(jù)模型。因此,為了提高性能,必須對(duì)用戶的查詢請(qǐng)求進(jìn)行優(yōu)化,從而增加了另外開發(fā)數(shù)據(jù)庫(kù)管理系統(tǒng)的負(fù)擔(dān)。

3.2 關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)——實(shí)體與關(guān)系

在上一節(jié)中我們學(xué)習(xí)了數(shù)據(jù)庫(kù)設(shè)計(jì)中數(shù)據(jù)模型的發(fā)展過(guò)程和關(guān)系數(shù)據(jù)模型的基本概念、特點(diǎn)。對(duì)于關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),它就是立足于關(guān)系數(shù)據(jù)模型,描述實(shí)體之間的關(guān)系。因此本節(jié)將針對(duì)關(guān)系型數(shù)據(jù)模型討論實(shí)體與關(guān)系的聯(lián)系。

3.2.1 實(shí)體

客觀存在并可相互區(qū)別的事物稱為實(shí)體。例如,圖書、教師等都是實(shí)體。常常將實(shí)體具有的某種特性稱為實(shí)體的屬性。例如,可以用若干個(gè)屬性(圖書編號(hào)、ISBN號(hào)、定價(jià)、出版社)來(lái)描述圖書實(shí)體,屬性的具體取值稱為屬性值。

實(shí)體表示的是一類事物,其中的一個(gè)具體事物稱為該實(shí)體的一個(gè)實(shí)例。例如“ABC11700 4”,“史記(3冊(cè))”,“72.00”,“中國(guó)長(zhǎng)安”則具體表示了一本書,它是圖書實(shí)體的一個(gè)實(shí)例。如果某個(gè)屬性或?qū)傩缘慕M合能唯一地標(biāo)識(shí)出實(shí)體中的每一行,則可以選擇該屬性或?qū)傩缘慕M合作為實(shí)體標(biāo)識(shí)符。

例如,圖書實(shí)體中的“ISBN號(hào)”可以作為實(shí)體標(biāo)識(shí)符,因?yàn)椤癐SBN號(hào)”的值是唯一的,它能唯一地標(biāo)識(shí)出實(shí)體中的每一行。而“書名”不可以作為圖書實(shí)體的實(shí)體標(biāo)識(shí)符,因?yàn)椤皶庇兄孛默F(xiàn)象存在,它所標(biāo)識(shí)的行會(huì)出現(xiàn)不唯一的情況。

3.2.2 實(shí)體間的聯(lián)系

實(shí)體不是孤立的,實(shí)體與實(shí)體之間有著密切的聯(lián)系。實(shí)體間的聯(lián)系分為1對(duì)1、1對(duì)多和多對(duì)多3種。例如,學(xué)校實(shí)體和學(xué)生實(shí)體之間是1對(duì)多的聯(lián)系,學(xué)生實(shí)體和課程實(shí)體之間是多對(duì)多的聯(lián)系。可以使用實(shí)體關(guān)系圖(E-R圖)描述實(shí)體與實(shí)體間的聯(lián)系。如圖3.2所示,兩個(gè)實(shí)體之間有3種聯(lián)系(1:1、1:nm:n)。

圖3.2 E-R圖

3.2.3 E-R模型

數(shù)據(jù)庫(kù)設(shè)計(jì)就是將現(xiàn)實(shí)世界的數(shù)據(jù)組織成數(shù)據(jù)庫(kù)管理系統(tǒng)所需的數(shù)據(jù)模型。實(shí)體聯(lián)系方法簡(jiǎn)單、實(shí)用,通常使用它的工具——E-R圖來(lái)描述現(xiàn)實(shí)世界的信息結(jié)構(gòu),并將所描述的結(jié)果稱為E-R模型。E-R模型可以轉(zhuǎn)換為DBMS所支持的數(shù)據(jù)模型。如圖3.2所示,E-R圖有以下3個(gè)要素。

● 實(shí)體:使用矩形框表示,框內(nèi)標(biāo)注實(shí)體名稱。

● 屬性:使用橢圓形框表示,并用連線與實(shí)體連接起來(lái)。如果屬性較多,為使圖形更加簡(jiǎn)明,有時(shí)也將實(shí)體與其屬性單獨(dú)用列表表示。

● 實(shí)體之間的聯(lián)系:使用菱形框表示,框內(nèi)注明聯(lián)系名稱,并用連線將菱形框分別與有關(guān)實(shí)體相連,并在連線上注明聯(lián)系類型。

3.3 關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)——范式與規(guī)范化

通過(guò)E-R模型能夠?qū)?shí)體與關(guān)系之間進(jìn)行基本的映射,開始關(guān)系型數(shù)據(jù)庫(kù)的設(shè)計(jì)。但是,還有一個(gè)很重要的問(wèn)題,關(guān)系模型要求關(guān)系必須是規(guī)范化的,即要求關(guān)系模型必須滿足一定的規(guī)范條件,即本節(jié)中將要學(xué)習(xí)到的范式。

3.3.1 規(guī)范化與范式

數(shù)據(jù)庫(kù)的規(guī)范化是減少表中數(shù)據(jù)重復(fù)的一種技巧。規(guī)范化過(guò)程針對(duì)已經(jīng)發(fā)現(xiàn)的實(shí)體和屬性,將它們改造得更適合關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。該過(guò)程減掉冗余,并且將數(shù)據(jù)改造成有利于關(guān)系型引擎發(fā)揮作用的形式,大量消除重復(fù)數(shù)據(jù)后將得到更小、更緊湊的數(shù)據(jù)庫(kù)。這樣將減小出現(xiàn)混亂的幾率,并且將減少實(shí)時(shí)更新多列數(shù)據(jù)的開銷。

一旦完成了規(guī)范化過(guò)程,使用基于集的SQL語(yǔ)言來(lái)操作數(shù)據(jù)會(huì)更方便。對(duì)數(shù)據(jù)庫(kù)定義來(lái)說(shuō),其終極目標(biāo)就是將自己識(shí)別出來(lái)的很多數(shù)據(jù)分解為原子值(原子值是指就用于關(guān)系數(shù)據(jù)庫(kù)而言,一個(gè)值已經(jīng)沒(méi)必要被進(jìn)一步分解了)。也就是說(shuō),分解到需要用T-SQL(Transact SQL)代碼訪問(wèn)的最底層形式上。

規(guī)范化過(guò)程基于一系列級(jí)別,其中每個(gè)級(jí)別都達(dá)到一定水平的正確性,或遵守著一系列特定“規(guī)則”,這些規(guī)則通常稱為“范式”。設(shè)計(jì)范式(范式,數(shù)據(jù)庫(kù)設(shè)計(jì)范式,數(shù)據(jù)庫(kù)的設(shè)計(jì)范式)是符合某一種級(jí)別的關(guān)系模式的集合。構(gòu)造數(shù)據(jù)庫(kù)必須遵循一定的規(guī)則。在關(guān)系數(shù)據(jù)庫(kù)中,這種規(guī)則就是范式。

關(guān)系數(shù)據(jù)庫(kù)中的關(guān)系必須滿足一定的要求,即滿足不同的范式。目前關(guān)系數(shù)據(jù)庫(kù)有6種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。滿足最低要求的范式是第一范式(1NF),在第一范式的基礎(chǔ)上進(jìn)一步滿足更多要求的稱為第二范式(2NF),其余范式以此類推。一般說(shuō)來(lái),數(shù)據(jù)庫(kù)只需滿足第三范式(3NF)就行了。

3.3.2 第一范式(1NF)

在任何一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,第一范式(1NF)是對(duì)關(guān)系模式的基本要求,不滿足第一范式(1NF)的數(shù)據(jù)庫(kù)就不是關(guān)系數(shù)據(jù)庫(kù)。所謂第一范式(1NF)是指數(shù)據(jù)庫(kù)表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個(gè)新的實(shí)體。新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對(duì)多關(guān)系。

在第一范式(1NF)中表的每一行只包含一個(gè)實(shí)例的信息。例如,對(duì)于員工信息,不能將員工信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工信息表的每一行只表示一個(gè)員工的信息,一個(gè)員工的信息在表中只出現(xiàn)一次。簡(jiǎn)而言之,第一范式就是無(wú)重復(fù)的列,如圖3.3所示。

圖3.3 第一范式

3.3.3 第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來(lái)的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或行必須可以被唯一地區(qū)分。為實(shí)現(xiàn)區(qū)分,通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)。

第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性。如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系。簡(jiǎn)而言之,第二范式就是非主屬性非部分依賴于主關(guān)鍵字。

假定設(shè)計(jì)學(xué)生管理數(shù)據(jù)庫(kù),其中包含選課關(guān)系表為SelectCourse(學(xué)號(hào),姓名,年齡,課程名稱,成績(jī),學(xué)分),關(guān)鍵字為組合關(guān)鍵字(學(xué)號(hào),課程名稱),因?yàn)榇嬖谌缦聸Q定關(guān)系:

        (學(xué)號(hào),課程名稱)→(姓名,年齡,成績(jī),學(xué)分)

所以,這個(gè)數(shù)據(jù)庫(kù)表不滿足第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:

        (課程名稱)→(學(xué)分)
        (學(xué)號(hào))→(姓名,年齡)

即存在組合關(guān)鍵字中的字段決定非關(guān)鍵字的情況。由于不符合2NF,所以這個(gè)關(guān)系表會(huì)存在如下問(wèn)題:

1.?dāng)?shù)據(jù)冗余

同一門課程由n個(gè)學(xué)生選修,“學(xué)分”就重復(fù)n-1次;同一個(gè)學(xué)生選修了m門課程,“姓名”和“年齡”就重復(fù)了m-1次。

2.更新異常

若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的“學(xué)分”值都要更新,否則會(huì)出現(xiàn)同一門課程學(xué)分不同的情況。

3.插入異常

假設(shè)要開設(shè)一門新的課程,暫時(shí)還沒(méi)有人選修。這樣,由于還沒(méi)有“學(xué)號(hào)”關(guān)鍵字,課程名稱和學(xué)分也無(wú)法記入數(shù)據(jù)庫(kù)。

4.刪除異常

假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫(kù)表中刪除。但是,與此同時(shí),課程名稱和學(xué)分信息也被刪除了。很顯然,這也會(huì)導(dǎo)致插入異常。

把選課關(guān)系表SelectCourse改為如下3個(gè)表:

        學(xué)生:Student(學(xué)號(hào),姓名,年齡);
        課程:Course(課程名稱,學(xué)分);
        選課關(guān)系:SelectCourse(學(xué)號(hào),課程名稱,成績(jī))。

這樣的數(shù)據(jù)庫(kù)表是符合第二范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。另外,所有單關(guān)鍵字的數(shù)據(jù)庫(kù)表都符合第二范式,因?yàn)椴豢赡艽嬖诮M合關(guān)鍵字。

3.3.4 第三范式(3NF)

滿足第三范式(3NF)必須先滿足第二范式(2NF)。第三范式(3NF)要求一個(gè)數(shù)據(jù)庫(kù)表中不包含已在其他表中已包含的非主關(guān)鍵字信息。簡(jiǎn)而言之,第三范式就是屬性不依賴于其他非主屬性。在第二范式的基礎(chǔ)上,如果數(shù)據(jù)表中不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴,則符合第三范式。所謂傳遞函數(shù)依賴,指的是如果存在“A→B→C”的決定關(guān)系,則C傳遞函數(shù)依賴于A。因此,滿足第三范式的數(shù)據(jù)庫(kù)表應(yīng)該不存在如下依賴關(guān)系:

        關(guān)鍵字段→非關(guān)鍵字段x→非關(guān)鍵字段y

假定學(xué)生管理數(shù)據(jù)庫(kù)中學(xué)生關(guān)系表為Student(學(xué)號(hào),姓名,年齡,所在學(xué)院,學(xué)院地點(diǎn),學(xué)院電話),關(guān)鍵字為單一關(guān)鍵字“學(xué)號(hào)”,因?yàn)榇嬖谌缦聸Q定關(guān)系:

        (學(xué)號(hào))→(姓名,年齡,所在學(xué)院,學(xué)院地點(diǎn),學(xué)院電話)

所以,這個(gè)數(shù)據(jù)庫(kù)是符合2NF的,但是不符合3NF,因?yàn)榇嬖谌缦聸Q定關(guān)系:

        (學(xué)號(hào))→(所在學(xué)院)→(學(xué)院地點(diǎn),學(xué)院電話)

即存在非關(guān)鍵字段“學(xué)院地點(diǎn)”、“學(xué)院電話”對(duì)關(guān)鍵字段“學(xué)號(hào)”的傳遞函數(shù)依賴。

它也會(huì)存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況。把學(xué)生關(guān)系表分為如下兩個(gè)表:

        學(xué)生:(學(xué)號(hào),姓名,年齡,所在學(xué)院);
        學(xué)院:(學(xué)院,地點(diǎn),電話)。

這樣的數(shù)據(jù)庫(kù)表是符合第三范式的,它消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。

3.3.5 其他范式與規(guī)范化的好處

除了最常用的第一范式、第二范式和第三范式外,還有不太常用的如下幾種范式:

● BCNF范式,指非主鍵字段必須依賴于整個(gè)主鍵字。在第三范式的基礎(chǔ)上,數(shù)據(jù)庫(kù)表中如果不存在任何字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合BCNF。

● 第四范式,用于處理由復(fù)雜的復(fù)合主鍵所導(dǎo)致的問(wèn)題。如果將兩個(gè)相互獨(dú)立的屬性與第三個(gè)屬性一起組合為一個(gè)主鍵,并且如果沒(méi)有第三個(gè)屬性,僅靠這兩個(gè)屬性不能在實(shí)體中真正地起到唯一標(biāo)識(shí)的作用,那么它就違反了第四范式。

● 第五范式,要求能從由原始表分解和轉(zhuǎn)換而得的新表中精確重建出原始表。利用第五范式可以確定在分解和轉(zhuǎn)換過(guò)程中是否有數(shù)據(jù)丟失。

每個(gè)級(jí)別的規(guī)范化都表明在更高程度上遵守了被廣泛認(rèn)可的數(shù)據(jù)庫(kù)設(shè)計(jì)標(biāo)準(zhǔn)。當(dāng)提高了自己數(shù)據(jù)的規(guī)范化程度時(shí),你將逐漸很自然地創(chuàng)建出越來(lái)越多的寬度更窄的表(列更少)。通過(guò)這些規(guī)范化措施,能夠在數(shù)據(jù)庫(kù)的設(shè)計(jì)中達(dá)到如下目的。

1.消滅重復(fù)數(shù)據(jù)

任何一個(gè)數(shù)據(jù),只要在數(shù)據(jù)庫(kù)中出現(xiàn)了一次以上,就隨時(shí)都有可能出錯(cuò)。毫無(wú)疑問(wèn),以姓名為例,對(duì)于任何搬到一個(gè)新地址的人來(lái)說(shuō),存儲(chǔ)冗余數(shù)據(jù)的問(wèn)題都顯而易見。各個(gè)政府機(jī)關(guān)分別要求搬到新地址的市民修改地址信息,如稅單、駕照、機(jī)動(dòng)車登記等,沒(méi)有一個(gè)統(tǒng)一的、修改一次就行的地方。搬一次家簡(jiǎn)單,但更新這些數(shù)據(jù)卻是個(gè)復(fù)雜的過(guò)程。

2.避免編寫不必要的代碼

如果數(shù)據(jù)結(jié)構(gòu)糟糕,則可能需要在觸發(fā)器、存儲(chǔ)過(guò)程中,甚至是在業(yè)務(wù)邏輯層中進(jìn)行多余的編程,而這又會(huì)進(jìn)一步嚴(yán)重地?fù)p害性能。由于需要錯(cuò)綜復(fù)雜的代碼來(lái)維護(hù)冗余數(shù)據(jù),多余的代碼增加了引入新缺陷的可能性。

3.給表瘦身

更瘦的表就意味著在數(shù)據(jù)庫(kù)一個(gè)給定的頁(yè)上可以放入更多的數(shù)據(jù),比起更胖的表來(lái),在一次單獨(dú)的讀取操作中,數(shù)據(jù)庫(kù)服務(wù)器就可以從表中獲取更多的行。但這所有的一切意味著當(dāng)結(jié)束規(guī)范化過(guò)程時(shí),系統(tǒng)中會(huì)有更多的表。

4.最大化聚集索引的使用

在SQL Server 2008中,對(duì)表排序是聚集索引的內(nèi)生特性。聚集索引是一類特殊的索引,因?yàn)閿?shù)據(jù)的物理存儲(chǔ)與索引數(shù)據(jù)的順序一致,這就使得用索引進(jìn)行查詢有更好的性能。通常情況下,用聚集索引來(lái)將表排序成方便使用的形式,從而增強(qiáng)性能。每張表只能有唯一一個(gè)聚集索引。數(shù)據(jù)庫(kù)中的聚集索引越多,就越不需要進(jìn)行排序操作,然后就可以非常快地連接大量的數(shù)據(jù)集。

5.降低每張表中索引的數(shù)量

每張表中的索引越少,維護(hù)索引所需要做的工作就越少。在SQL Server中,數(shù)據(jù)和索引分開存放在8KB的頁(yè)上。通常情況下,任何時(shí)候SQL Server都無(wú)法在RAM中保持整個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)保持最近被看過(guò)的東西的“快照”。為了造成整個(gè)數(shù)據(jù)庫(kù)都在內(nèi)存中的印象,當(dāng)需要時(shí),SQL Server在高速訪問(wèn)存儲(chǔ)空間內(nèi)對(duì)數(shù)據(jù)頁(yè)進(jìn)行搬入、搬出操作。但是,這個(gè)空間在任意一個(gè)時(shí)間點(diǎn)上包含的頁(yè)數(shù)量都有限。

因此,SQL Server對(duì)數(shù)據(jù)進(jìn)行搬入、搬出該空間的操作時(shí),其原則是最常訪問(wèn)到的數(shù)據(jù)在空間中保持不動(dòng)。所以,為了盡可能保持高性能,我們的目標(biāo)是要最小化需傳輸?shù)奈锢眄?yè)。規(guī)范化要做的就是給表瘦身,讓表針對(duì)特定問(wèn)題,而不是讓表去處理很多列。因此,它有助于將列數(shù)量保持在一個(gè)最低水平上。

3.3.6 非規(guī)范化

需要注意的是,規(guī)范化也可能會(huì)影響數(shù)據(jù)庫(kù)及數(shù)據(jù)檢索的速度,因此數(shù)據(jù)庫(kù)設(shè)計(jì)者不可能無(wú)度地規(guī)范化。對(duì)數(shù)據(jù)庫(kù)進(jìn)行合理而有益的規(guī)范化,重復(fù)數(shù)據(jù)的消除將帶來(lái)更快的數(shù)據(jù)排序速度,查詢也將運(yùn)行得更快,從而改善性能。但是,也可能會(huì)由于創(chuàng)建了太多的關(guān)系和太多狹小的表,導(dǎo)致過(guò)分規(guī)范化數(shù)據(jù),以致檢索一條信息需要訪問(wèn)許多的表并在這些表之間產(chǎn)生許多連接。

非規(guī)范化與規(guī)范化完全相反,此時(shí)要在表中引入數(shù)據(jù)冗余,以減少表連接的數(shù)目,潛在地加速數(shù)據(jù)訪問(wèn)。盡管使數(shù)據(jù)規(guī)范化會(huì)帶來(lái)更高的效率,但是,有時(shí)使數(shù)據(jù)非規(guī)范化反而是更好的選擇。不要只因?yàn)閯e人認(rèn)為數(shù)據(jù)應(yīng)該徹底規(guī)范化就這樣去做,具體如何應(yīng)該根據(jù)需要而定。

盡管使數(shù)據(jù)非規(guī)范化的缺點(diǎn)很多,它將會(huì)帶來(lái)重復(fù)和多余的信息(這些信息可以通過(guò)規(guī)范化放置在另一個(gè)表中,然后在查詢時(shí)連接表即可)。這既會(huì)產(chǎn)生性能問(wèn)題,又要占用較大的數(shù)據(jù)存儲(chǔ)空間。然而,如果查詢運(yùn)行速度提高了,那么進(jìn)行使數(shù)據(jù)非規(guī)范化所付出的代價(jià)也算是合理的。但當(dāng)系統(tǒng)中最重要的是數(shù)據(jù)完整性時(shí),使數(shù)據(jù)非規(guī)范化將毫無(wú)意義,因?yàn)檫@樣會(huì)導(dǎo)致數(shù)據(jù)重復(fù),進(jìn)而當(dāng)需要對(duì)數(shù)據(jù)做修改時(shí),一個(gè)地方的數(shù)據(jù)已經(jīng)更新,而另一個(gè)地方的數(shù)據(jù)尚未更新。

3.4 SQ L Server 2008的預(yù)設(shè)數(shù)據(jù)庫(kù)

每個(gè)SQL Server都包含兩種類型的數(shù)據(jù)庫(kù):系統(tǒng)數(shù)據(jù)庫(kù)和用戶數(shù)據(jù)庫(kù)。系統(tǒng)數(shù)據(jù)庫(kù)存儲(chǔ)有關(guān)SQL Server的信息,SQL Server使用系統(tǒng)數(shù)據(jù)庫(kù)來(lái)管理系統(tǒng),例如,下面將要介紹的master數(shù)據(jù)庫(kù)、model數(shù)據(jù)庫(kù)、msdb數(shù)據(jù)庫(kù)和tempdb數(shù)據(jù)庫(kù)等;而用戶數(shù)據(jù)庫(kù)由用戶來(lái)建立,如圖書管理信息數(shù)據(jù)庫(kù),SQL Server可以包含一個(gè)或多個(gè)用戶數(shù)據(jù)庫(kù)。

3.4.1 master數(shù)據(jù)庫(kù)

如圖3.4所示,master(控制)數(shù)據(jù)庫(kù)是SQL Server 2008中的總控?cái)?shù)據(jù)庫(kù)。它是最重要的系統(tǒng)數(shù)據(jù)庫(kù),記錄系統(tǒng)中所有系統(tǒng)級(jí)的信息。它對(duì)其他的數(shù)據(jù)庫(kù)實(shí)施管理和控制的功能,同時(shí)該數(shù)據(jù)庫(kù)還保存了用于SQL Server 2008管理的許多系統(tǒng)級(jí)信息。master數(shù)據(jù)庫(kù)記錄所有的登錄賬戶和系統(tǒng)配置,它始終有一個(gè)可用的最新master數(shù)據(jù)庫(kù)備份。

圖3.4 master數(shù)據(jù)庫(kù)

由此可知,如果在計(jì)算機(jī)上安裝了一個(gè)SQL Server系統(tǒng),那么系統(tǒng)首先會(huì)建立一個(gè)master數(shù)據(jù)庫(kù)來(lái)記錄系統(tǒng)的有關(guān)登錄賬戶、系統(tǒng)配置、數(shù)據(jù)庫(kù)文件等初始化信息。如果用戶在這個(gè)SQL Server系統(tǒng)中建立一個(gè)用戶數(shù)據(jù)庫(kù)(如圖書管理系統(tǒng)數(shù)據(jù)庫(kù)),系統(tǒng)馬上將用戶數(shù)據(jù)庫(kù)的有關(guān)用戶管理、文件配置、數(shù)據(jù)庫(kù)屬性等信息寫入master數(shù)據(jù)庫(kù)。系統(tǒng)正是根據(jù)master數(shù)據(jù)庫(kù)中的信息來(lái)管理系統(tǒng)和其他數(shù)據(jù)庫(kù)的。因此,如果master數(shù)據(jù)庫(kù)信息被破壞,整個(gè)SQL Server系統(tǒng)將受到影響,用戶數(shù)據(jù)庫(kù)將不能被使用。

3.4.2 tempdb數(shù)據(jù)庫(kù)

使用SQL Server 2008系統(tǒng)時(shí),經(jīng)常會(huì)產(chǎn)生一些臨時(shí)表和臨時(shí)數(shù)據(jù)庫(kù)對(duì)象等。例如,用戶在數(shù)據(jù)庫(kù)中修改表的某一行數(shù)據(jù)時(shí),在修改數(shù)據(jù)庫(kù)這一事務(wù)沒(méi)有被提交的情況下,系統(tǒng)內(nèi)就會(huì)有該數(shù)據(jù)的新、舊版本之分,往往修改后的數(shù)據(jù)表構(gòu)成了臨時(shí)表。所以系統(tǒng)要提供一個(gè)空間來(lái)存儲(chǔ)這些臨時(shí)對(duì)象。如圖3.5所示,tempdb數(shù)據(jù)庫(kù)保存所有的臨時(shí)表和臨時(shí)存儲(chǔ)過(guò)程。tempdb數(shù)據(jù)庫(kù)是全局資源,所有連接到系統(tǒng)的用戶的臨時(shí)表和存儲(chǔ)過(guò)程都被存儲(chǔ)在該數(shù)據(jù)庫(kù)中。

tempdb數(shù)據(jù)庫(kù)是臨時(shí)數(shù)據(jù)庫(kù),在SQL Server 2008每次啟動(dòng)時(shí)都被重新創(chuàng)建,因此該數(shù)據(jù)庫(kù)在系統(tǒng)啟動(dòng)時(shí)總是空的,上一次的臨時(shí)數(shù)據(jù)庫(kù)都被清除掉了。臨時(shí)表和存儲(chǔ)過(guò)程在連接斷開時(shí)自動(dòng)清除,而且當(dāng)系統(tǒng)關(guān)閉后將沒(méi)有任何連接處于活動(dòng)狀態(tài),因此tempdb數(shù)據(jù)庫(kù)中沒(méi)有任何內(nèi)容會(huì)從SQL Server的一個(gè)啟動(dòng)工作保存到另一個(gè)啟動(dòng)工作之中。默認(rèn)情況下,在SQL Server 2008運(yùn)行時(shí),tempdb數(shù)據(jù)庫(kù)會(huì)根據(jù)需要自動(dòng)增長(zhǎng)。不過(guò),與其他數(shù)據(jù)庫(kù)不同,每次啟動(dòng)數(shù)據(jù)庫(kù)引擎時(shí),它會(huì)重置初始大小。

圖3.5 tempdb數(shù)據(jù)庫(kù)

3.4.3 model數(shù)據(jù)庫(kù)

model(模板)數(shù)據(jù)庫(kù)為用戶新創(chuàng)建的數(shù)據(jù)庫(kù)提供模板和原型,它包含了用戶數(shù)據(jù)庫(kù)中應(yīng)該包含的所有系統(tǒng)表的結(jié)構(gòu)。當(dāng)用戶創(chuàng)建數(shù)據(jù)庫(kù)時(shí),系統(tǒng)會(huì)自動(dòng)把model數(shù)據(jù)庫(kù)中的內(nèi)容復(fù)制到新建的用戶數(shù)據(jù)庫(kù)中。熟悉Microsoft Word的用戶都會(huì)有這樣的體會(huì),當(dāng)修改了文檔的頁(yè)面設(shè)置,并把該設(shè)置作為默認(rèn)設(shè)置保存起來(lái)時(shí),在此次之后新建的任何文檔的格式都會(huì)默認(rèn)為該設(shè)置格式。也就是說(shuō),在把被修改過(guò)的頁(yè)面設(shè)置作為默認(rèn)保存的同時(shí),也就修改了Microsoft Word中基于所有新建文檔的Normal模板,用戶在系統(tǒng)中新創(chuàng)建的所有數(shù)據(jù)庫(kù)的內(nèi)容,最初都與該模板數(shù)據(jù)庫(kù)具有完全相同的內(nèi)容。

3.4.4 msdb數(shù)據(jù)庫(kù)

msdb數(shù)據(jù)庫(kù)供SQL Server 2008代理程序調(diào)度警報(bào)作業(yè)及記錄操作時(shí)使用。當(dāng)很多用戶在使用一個(gè)數(shù)據(jù)庫(kù)時(shí),經(jīng)常會(huì)出現(xiàn)多個(gè)用戶對(duì)同一個(gè)數(shù)據(jù)的修改而造成數(shù)據(jù)不一致的現(xiàn)象,或是用戶對(duì)某些數(shù)據(jù)和對(duì)象的非法操作等。為了防止上述現(xiàn)象的發(fā)生,SQL Server中有一套代理程序能夠按照系統(tǒng)管理員的設(shè)定監(jiān)控上述現(xiàn)象的發(fā)生,及時(shí)向系統(tǒng)管理員發(fā)出警報(bào)。那么當(dāng)代理程序調(diào)度警報(bào)作業(yè)、記錄操作時(shí),系統(tǒng)要用到或?qū)崟r(shí)產(chǎn)生許多相關(guān)信息,這些信息一般存儲(chǔ)在msdb數(shù)據(jù)庫(kù)中。

3.4.5 AdventureW orks和AdventureWorksDW示例數(shù)據(jù)庫(kù)

AdventureWorks和AdventureWorksDW是SQL Server 2008中的示例數(shù)據(jù)庫(kù)(需要在安裝過(guò)程中選擇安裝)。這些數(shù)據(jù)庫(kù)基于一個(gè)自行車生產(chǎn)公司,以一種簡(jiǎn)單的、易于理解的方式來(lái)展示SQL Server 2008的新功能,如Reporting Services、CLR(公共語(yǔ)言運(yùn)行時(shí))特性及許多其他特性。

AdventureWorks示例數(shù)據(jù)庫(kù)虛構(gòu)了Adventure Works Cycles公司,該公司是一家大型跨國(guó)生產(chǎn)公司。公司生產(chǎn)金屬和復(fù)合材料的自行車,產(chǎn)品銷往北美、歐洲和亞洲市場(chǎng)。公司總部位于華盛頓州的伯瑟爾市,有290名雇員,公司還擁有一些遍及其銷售市場(chǎng)的地區(qū)性銷售團(tuán)隊(duì)。盡管示例數(shù)據(jù)庫(kù)不是為SQL Server 2008新手準(zhǔn)備的,但在學(xué)習(xí)完SQL Server 2008基礎(chǔ)知識(shí)后,使用它們也不會(huì)有困難。

3.5 使用SQL Server 2008創(chuàng)建數(shù)據(jù)庫(kù)

在一個(gè)SQL Server 20 08系統(tǒng)中,有多種方法可以創(chuàng)建用戶數(shù)據(jù)庫(kù)。一種是使用第2章中介紹的SQL Server Management Studio對(duì)象資源管理器創(chuàng)建數(shù)據(jù)庫(kù);另一種是使用Transact-SQL命令創(chuàng)建數(shù)據(jù)庫(kù),它可以把創(chuàng)建數(shù)據(jù)庫(kù)的腳本保存下來(lái),在其他計(jì)算機(jī)上運(yùn)行以創(chuàng)建相同的數(shù)據(jù)庫(kù)。

此外,利用系統(tǒng)提供的創(chuàng)建數(shù)據(jù)庫(kù)向?qū)б部梢詣?chuàng)建數(shù)據(jù)庫(kù)。創(chuàng)建用戶數(shù)據(jù)庫(kù)之前,必須先確定數(shù)據(jù)庫(kù)的名稱、數(shù)據(jù)庫(kù)所有者、初始大小、數(shù)據(jù)庫(kù)文件增長(zhǎng)方式、數(shù)據(jù)庫(kù)文件的最大允許增長(zhǎng)的大小,以及用于存儲(chǔ)數(shù)據(jù)庫(kù)的文件路徑和屬性等。下面分別介紹這兩種創(chuàng)建數(shù)據(jù)庫(kù)的方法。

3.5.1 使用SQL Server Management Studio對(duì)象資源管理器創(chuàng)建數(shù)據(jù)庫(kù)

使用SQL Server Management Studio對(duì)象資源管理器創(chuàng)建數(shù)據(jù)庫(kù)步驟如下:

(1)在【開始】菜單中選擇【所有程序】|【Microsoft SQL Server 2008】|【SQL Server Management Studio】命令,打開SSMS,如圖3.6所示。

圖3.6 SSMS初始狀態(tài)

(2)在SSMS左側(cè)的【對(duì)象資源管理器】窗口的【數(shù)據(jù)庫(kù)】分支上單擊鼠標(biāo)右鍵,從彈出的快捷菜單中選擇【新建數(shù)據(jù)庫(kù)】命令,彈出【新建數(shù)據(jù)庫(kù)】窗口,如圖3.7所示。

圖3.7 【新建數(shù)據(jù)庫(kù)】窗口

(3)在【數(shù)據(jù)庫(kù)名稱】文本框中輸入創(chuàng)建的數(shù)據(jù)庫(kù)名稱“wj”。此時(shí),系統(tǒng)會(huì)以數(shù)據(jù)庫(kù)名稱做為前綴創(chuàng)建主數(shù)據(jù)庫(kù)文件和事務(wù)日志文件,如wj和wj_log。主數(shù)據(jù)庫(kù)文件和事務(wù)日志文件的初始大小與model系統(tǒng)數(shù)據(jù)庫(kù)指定的默認(rèn)大小相同,選擇默認(rèn)值,其中數(shù)據(jù)庫(kù)文件的增量為1MB,不限制增長(zhǎng)的總量,日志文件每次增長(zhǎng)10%,也不限制增長(zhǎng)的總量。也可以進(jìn)行自定義,單擊【自動(dòng)增長(zhǎng)】旁的按鈕,彈出如圖3.8所示的對(duì)話框。

圖3.8 【更改自動(dòng)增長(zhǎng)設(shè)置】對(duì)話框

對(duì)文件增長(zhǎng)設(shè)置,如圖3.8所示,其中文件增長(zhǎng)有兩種自動(dòng)增長(zhǎng)方式。

● 【按百分比】:指定每次增長(zhǎng)的百分比。

● 【按MB】:指定每次增長(zhǎng)的兆字節(jié)數(shù)。

用戶也可以指定最大文件大小,如果選中【不限制文件增長(zhǎng)】單選按鈕,那么數(shù)據(jù)文件的容量可以無(wú)限地增大;如果選中【限制文件增長(zhǎng)】單選按鈕,可以將數(shù)據(jù)文件限制在某一特定的數(shù)量范圍以內(nèi),一般,有經(jīng)驗(yàn)的數(shù)據(jù)庫(kù)管理員會(huì)預(yù)先估計(jì)數(shù)據(jù)庫(kù)的大小,當(dāng)然這樣做需要一定的技巧,需要不斷地積累經(jīng)驗(yàn)。同樣可以對(duì)數(shù)據(jù)庫(kù)文件和數(shù)據(jù)庫(kù)邏輯文件的存放路徑進(jìn)行修改。默認(rèn)情況下,SQL Server 2008將存放路徑設(shè)為安裝目錄下的data目錄下。用戶可以根據(jù)管理需要進(jìn)行修改,單擊【路徑】旁的按鈕,彈出窗口,此時(shí)可以修改路徑,如圖3.9所示。

圖3.9 存放路徑選擇

如果需要為該數(shù)據(jù)庫(kù)添加所有者,則單擊【添加】按鈕,彈出【選擇數(shù)據(jù)庫(kù)所有者】對(duì)話框,如圖3.10所示。在該對(duì)話框中,可以單擊【瀏覽】按鈕選擇瀏覽數(shù)據(jù)庫(kù)所在計(jì)算機(jī)上的用戶名,并添加為數(shù)據(jù)庫(kù)的所有者。

圖3.10 【選擇數(shù)據(jù)庫(kù)所有者】對(duì)話框

在【選項(xiàng)】界面可以設(shè)置數(shù)據(jù)庫(kù)的一些選項(xiàng),如圖3.11所示。在各屬性的下拉列表框中可以做出選擇。

圖3.11 【選項(xiàng)】界面

完成所有設(shè)置后,在如圖3.8所示的窗口中單擊【確定】按鈕,完成數(shù)據(jù)庫(kù)創(chuàng)建,如圖3.12所示。

圖3.12 完成數(shù)據(jù)庫(kù)創(chuàng)建的對(duì)象資源管理器窗口

3.5.2 使用SQL Server Management Studio查詢窗口創(chuàng)建用戶數(shù)據(jù)庫(kù)

使用SQL查詢分析器創(chuàng)建數(shù)據(jù)庫(kù),其實(shí)就是在查詢窗口的編輯面板中使用DATABASE等Transact-SQL命令來(lái)創(chuàng)建用戶數(shù)據(jù)庫(kù)。

【范例3-1】下面學(xué)習(xí)一個(gè)創(chuàng)建用戶數(shù)據(jù)庫(kù)test的簡(jiǎn)單例子。

            CREATE DATABASE test
            --創(chuàng)建名為test的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)的命名規(guī)則按照標(biāo)識(shí)符的使用規(guī)則
            ON  PRIMARY
            (   NAME= 'test',
                --指定建立數(shù)據(jù)庫(kù)對(duì)應(yīng)的邏輯名字
                FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\test.mdf',
                --指定用于存放數(shù)據(jù)庫(kù)部分的磁盤文件,路徑必須指定為SQL Server所安裝服務(wù)器上的某個(gè)文件夾
                SIZE=10240KB,
                --指定數(shù)據(jù)庫(kù)文件的初始大小,用戶可以以MB為單位指定大小,也可以使用單位KB來(lái)指定大小
                --當(dāng)添加數(shù)據(jù)或日志文件時(shí),其默認(rèn)大小是1 MB
                MAXSIZE = UNLIMITED,
                FILEGROWTH = 10%)
              LOG ON
                --指定建立數(shù)據(jù)庫(kù)對(duì)應(yīng)的日志文件
            (   NAME='test_log',
                FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\test_log.ldf',
                --指定用于存放數(shù)據(jù)庫(kù)日志部分的磁盤文件,路徑必須指定為SQL Server所安裝服務(wù)器上的某個(gè)文件夾
                SIZE=1024KB,
                --指定數(shù)據(jù)庫(kù)日志文件的初始大小,用戶可以以MB為單位指定大小,也可以使用單位KB來(lái)指定大小
                --當(dāng)添加數(shù)據(jù)或日志文件時(shí),其默認(rèn)大小是1 MB
                MAXSIZE = 5120KB,
                FILEGROWTH = 1024KB )
            GO

【代碼解析】

● PRIMARY參數(shù)用來(lái)在主文件組中指定文件。主文件組中包含所有數(shù)據(jù)庫(kù)的系統(tǒng)表,還包含所有未指派給用戶文件組的對(duì)象。主文件組的第一個(gè)logical_file_name稱為主文件,該文件包含數(shù)據(jù)庫(kù)的邏輯起點(diǎn)及其系統(tǒng)表。一個(gè)數(shù)據(jù)庫(kù)只能有一個(gè)主文件。如果指定PRIMARY,那么CREATE DA TABASE語(yǔ)句中有一個(gè)主文件。如果沒(méi)有指定PRIMARY,那么CREATE DATABASE語(yǔ)句中列出的第一個(gè)文件將成為主文件。

● MAXSIZE參數(shù)指定文件能夠增長(zhǎng)到的最大長(zhǎng)度。默認(rèn)單位為KB,用戶也可以以MB來(lái)指定該長(zhǎng)度。如果沒(méi)有指定長(zhǎng)度或設(shè)定為UNLIMITED時(shí),文件將一直增長(zhǎng),直到磁盤滿為止。要建立的數(shù)據(jù)庫(kù)大小單位為MB。

● FILEGROWTH參數(shù)指定文件的增長(zhǎng)增量。該參數(shù)設(shè)置不能超過(guò)MAXSIZE參數(shù)。指定值的默認(rèn)單位為MB,用戶也可以以KB為單位進(jìn)行指定,此外還可以使用百分比設(shè)定。如果該參數(shù)沒(méi)有指定,則默認(rèn)為10%,最小值為64KB。在查詢編輯器窗口中輸入上述代碼,單擊【執(zhí)行】按鈕完成查詢,即完成test用戶數(shù)據(jù)庫(kù)的新建工作。

注意:使用CREATE DATABASE語(yǔ)句即可創(chuàng)建數(shù)據(jù)庫(kù)及存儲(chǔ)該數(shù)據(jù)庫(kù)的文件。SQL Server 2008分兩步來(lái)實(shí)現(xiàn)CREATE DATAB ASE語(yǔ)句。首先,SQL Server 2008使用model數(shù)據(jù)庫(kù)的副本初始化數(shù)據(jù)庫(kù)及其源數(shù)據(jù);然后SQL Server 2008使用空頁(yè)填充數(shù)據(jù)庫(kù)的剩余部分,每個(gè)新數(shù)據(jù)庫(kù)都從model數(shù)據(jù)庫(kù)中繼承數(shù)據(jù)庫(kù)選項(xiàng)設(shè)置。

【運(yùn)行結(jié)果】

執(zhí)行結(jié)果如圖3.13所示。

圖3.13 使用T-SQL代碼新建數(shù)據(jù)庫(kù)

3.5.3 查看和修改數(shù)據(jù)庫(kù)屬性

對(duì)于已有的數(shù)據(jù)庫(kù),可以分別利用對(duì)象資源管理器和Transact-SQL語(yǔ)句來(lái)查看數(shù)據(jù)庫(kù)信息。

1.使用SQL Server Management Studio窗口中的對(duì)象資源管理器查看數(shù)據(jù)庫(kù)信息

在完成數(shù)據(jù)庫(kù)創(chuàng)建后,可以對(duì)數(shù)據(jù)庫(kù)的屬性進(jìn)行進(jìn)一步設(shè)置。在對(duì)象資源管理器窗口中選擇新建的wj數(shù)據(jù)庫(kù)的【wj】分支,在其上單擊鼠標(biāo)右鍵,從彈出的快捷菜單中選擇【屬性】命令,彈出【數(shù)據(jù)庫(kù)屬性】窗口,如圖3.14所示。在該窗口中可以對(duì)數(shù)據(jù)庫(kù)屬性進(jìn)行修改。例如,設(shè)置數(shù)據(jù)庫(kù)文件所屬的文件組時(shí),在【數(shù)據(jù)庫(kù)屬性】窗口左側(cè)的分支中單擊【文件組】選項(xiàng),如圖3.15所示。單擊【添加】按鈕,可以增加自定義名稱的文件組。

圖3.14 【數(shù)據(jù)庫(kù)屬性】窗口

圖3.15 設(shè)置數(shù)據(jù)庫(kù)文件所屬的文件組

在屬性頁(yè)窗口中列出了數(shù)據(jù)庫(kù)、備份和維護(hù),以及空間配置等信息。數(shù)據(jù)庫(kù)本身的信息包括數(shù)據(jù)庫(kù)的所有者、創(chuàng)建日期、大小、可用空間、用戶數(shù)。

2.使用Transact-SQL命令查看數(shù)據(jù)庫(kù)信息

在Transact-SQL語(yǔ)句格式中,有許多查看數(shù)據(jù)庫(kù)信息的語(yǔ)句,例如,可以使用存儲(chǔ)過(guò)程sp_helpdb來(lái)顯示有關(guān)數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)參數(shù)的信息。如圖3.16所示的是使用存儲(chǔ)過(guò)程sp_helpdb對(duì)數(shù)據(jù)庫(kù)test進(jìn)行屬性查詢,圖中顯示了該數(shù)據(jù)庫(kù)的所有者、狀態(tài)、創(chuàng)建時(shí)間、文件尺寸、文件增長(zhǎng)屬性等數(shù)據(jù)庫(kù)信息,其命令格式為:sp_helpdb 'test'。

圖3.16 使用sp_helpdb存儲(chǔ)過(guò)程查看test數(shù)據(jù)庫(kù)屬性

3.6 使用SQL Server 2008管理數(shù)據(jù)庫(kù)

本節(jié)學(xué)習(xí)使用SQL Server 2008完成數(shù)據(jù)庫(kù)打開、修改、增加和縮減等管理工作。

3.6.1 打開數(shù)據(jù)庫(kù)

當(dāng)用戶登錄SQL Server 2008服務(wù)器,連接SQL Server 2008后,用戶需要連接SQL Server 2008服務(wù)器中的某個(gè)數(shù)據(jù)庫(kù),才能使用該數(shù)據(jù)庫(kù)中的數(shù)據(jù)。如果用戶沒(méi)有預(yù)先指定連接哪個(gè)數(shù)據(jù)庫(kù),SQL Server 2008會(huì)自動(dòng)連接上master系統(tǒng)數(shù)據(jù)庫(kù)。一般地,用戶需要指定連接SQL Server 2008服務(wù)器中的哪個(gè)數(shù)據(jù)庫(kù),或者從一個(gè)數(shù)據(jù)庫(kù)切換至另一個(gè)數(shù)據(jù)庫(kù),可以在查詢分析器的【編輯】面板中利用use命令來(lái)打開或切換至不同的數(shù)據(jù)庫(kù)。

打開或切換數(shù)據(jù)庫(kù)的命令如下:

        USE  database name

其中,database name表示需要打開或切換的數(shù)據(jù)庫(kù)名稱。

3.6.2 修改、增加和縮減數(shù)據(jù)庫(kù)容量

當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)增長(zhǎng)到要超過(guò)它的使用空間時(shí),必須加大數(shù)據(jù)庫(kù)的容量。增加數(shù)據(jù)庫(kù)容量就是給它提供額外的設(shè)備空間。同時(shí),如果在新建數(shù)據(jù)庫(kù)時(shí)指定給某數(shù)據(jù)庫(kù)過(guò)多的設(shè)備空間,可以通過(guò)縮減數(shù)據(jù)庫(kù)容量來(lái)減少設(shè)備空間的浪費(fèi)。增加和縮減數(shù)據(jù)庫(kù)容量的方法一般有兩種,即用Transact-SQL命令和利用SQL Server Management Studio查詢窗口中的【對(duì)象資源管理器】面板來(lái)增縮數(shù)據(jù)庫(kù)容量。

1.在SQL Server Management Studio查詢窗口中使用Transact-SQL語(yǔ)句增縮數(shù)據(jù)庫(kù)容量

擴(kuò)增數(shù)據(jù)庫(kù)語(yǔ)句格式如下:

        USE database name  --需要修改的數(shù)據(jù)庫(kù)名
        Go
        ALTER DATABASE database name
        -- database name是需要調(diào)整大小的數(shù)據(jù)庫(kù)的名稱
        MODIFY FILE
        (
        NAME=file name,
        --需要增加容量的數(shù)據(jù)庫(kù)的物理文件的路徑
        SIZE=newsize
        --為數(shù)據(jù)庫(kù)文件指定新的容量尺寸,該容量必須大于現(xiàn)有數(shù)據(jù)庫(kù)的空間
        )

【范例3-2】將新創(chuàng)建的test數(shù)據(jù)庫(kù)的大小調(diào)整為20MB。

修改大小的示例代碼如下:

        USE test
        Go
        ALTER DATABASE test
        MODIFY FILE
        (
        NAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\test.mdf',
        SIZE=20
        )

縮減數(shù)據(jù)庫(kù)一般通過(guò)執(zhí)行DBCC SHRINKDATABASE命令來(lái)完成,其語(yǔ)句格式如下:

        DBCC SHRINKDATABASE (database_name[,new_size[,'MASTEROVERRIDE']])

其中,

● database_name:想縮減的數(shù)據(jù)庫(kù)名稱。

● new_size:縮減數(shù)據(jù)庫(kù)后剩余多少容量。假如不指定,那么數(shù)據(jù)庫(kù)將縮減至最小的容量。

如下所示為縮減數(shù)據(jù)庫(kù)的示例代碼,將test數(shù)據(jù)庫(kù)縮減至最小容量。

        USE test
        GO
        DBCC SHRINKDATABASE ('test')

【運(yùn)行結(jié)果】

執(zhí)行結(jié)果如圖3.17所示。

圖3.17 縮減test數(shù)據(jù)庫(kù)容量

2.在SQL Server Management Studio對(duì)象資源管理器中修改數(shù)據(jù)庫(kù)

進(jìn)入SQL Server Management Studio窗口,在要修改的數(shù)據(jù)庫(kù)【wj】分支項(xiàng)單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇【屬性】命令,進(jìn)入屬性窗口,在這些選項(xiàng)的展開頁(yè)面中可以管理文件增長(zhǎng)、擴(kuò)展數(shù)據(jù)庫(kù)、縮小數(shù)據(jù)庫(kù)、修改文件(組)設(shè)置和增加新數(shù)據(jù)庫(kù)等。如圖3.18所示,將wj數(shù)據(jù)庫(kù)的大小修改為8MB。

圖3.18 修改wj數(shù)據(jù)庫(kù)容量

修改成功后,單擊【確定】按鈕,修改數(shù)據(jù)生效。

3.6.3 查看目前數(shù)據(jù)庫(kù)選項(xiàng)設(shè)定及修改

設(shè)定數(shù)據(jù)庫(kù)選項(xiàng)可以控制數(shù)據(jù)庫(kù)是單用戶使用模式還是db_owner模式,以及此數(shù)據(jù)庫(kù)是否僅可讀取等,可以設(shè)置此數(shù)據(jù)庫(kù)是否自動(dòng)關(guān)閉、自動(dòng)收縮和數(shù)據(jù)庫(kù)的兼容級(jí)別等選項(xiàng)。

如果想查看目前數(shù)據(jù)庫(kù)選項(xiàng),如前兩節(jié)中已經(jīng)討論的使用屬性窗口的方式,也可以在查詢分析器中使用Transact-SQL命令來(lái)查看和更改數(shù)據(jù)庫(kù)選項(xiàng)。一般使用sp_dboption存儲(chǔ)過(guò)程來(lái)查看數(shù)據(jù)庫(kù)選項(xiàng),如下所示將數(shù)據(jù)庫(kù)test的屬性設(shè)置為只讀:

        EXEC sp_dboption 'test', 'read only', True

如圖3.19所示是執(zhí)行屬性設(shè)置后的結(jié)果。

圖3.19 將test數(shù)據(jù)庫(kù)屬性設(shè)置為只讀

下面簡(jiǎn)單介紹部分選項(xiàng)參數(shù)。

1.trunc log on chkpt選項(xiàng)參數(shù)

trunc log on chkpt選項(xiàng)參數(shù)表示每當(dāng)checkpoint檢查進(jìn)程執(zhí)行時(shí)(通常每分鐘12次以上),事務(wù)日志被載截,即將已提交的事務(wù)日志刪除。但是,該選項(xiàng)設(shè)置成true以后,人工執(zhí)行checkpoint操作時(shí)都不載截事務(wù)日志。在開發(fā)數(shù)據(jù)庫(kù)應(yīng)用時(shí),為防止日志增長(zhǎng)太快,可以將該選項(xiàng)設(shè)置成true,所以它很有用。

該參數(shù)的設(shè)置代碼如下:

        EXEC sp_dboption 'test', 'trunc. log on chkpt.', True

2.dbo use only

dbo use only選項(xiàng)設(shè)置為true時(shí),只有數(shù)據(jù)庫(kù)擁有者才能使用該數(shù)據(jù)庫(kù)。

該參數(shù)的設(shè)置代碼如下:

        EXEC sp_dboption 'test', 'dbo use only',True

3.read only

read only選項(xiàng)使得用戶可以從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù),但不能修改數(shù)據(jù)。

該參數(shù)的設(shè)置代碼如下:

        EXEC sp_dboption 'wj', 'read only', True

4.single user

single user選項(xiàng)設(shè)置為true時(shí),每次只能有一個(gè)用戶訪問(wèn)該數(shù)據(jù)庫(kù)。

該參數(shù)的設(shè)置代碼如下:

        EXEC sp_dboption 'test', 'single  user', True

5.offline

offline選項(xiàng)設(shè)置為true時(shí),設(shè)定數(shù)據(jù)庫(kù)為離線,反之為在線。

該參數(shù)的設(shè)置代碼如下:

        EXEC sp_dboption 'test', 'offline', True

6.a(chǎn)utoshrink

autoshrink選項(xiàng)設(shè)置為true時(shí),數(shù)據(jù)庫(kù)將自動(dòng)地周期性收縮大小。

該參數(shù)的設(shè)置代碼如下:

      EXEC sp_dboption 'test', 'autoshrink', True

7.ANSI warnings

ANSI warnings選項(xiàng)設(shè)置為true時(shí),將提示“除0”之類的標(biāo)準(zhǔn)錯(cuò)誤和警告。

該參數(shù)的設(shè)置代碼如下:

      EXEC sp_dboption 'test', 'ANSI warnings', True

3.6.4 數(shù)據(jù)庫(kù)更名

通常情況下,在一個(gè)應(yīng)用程序的開發(fā)過(guò)程中,往往需要改變數(shù)據(jù)庫(kù)的名稱,但是在SQL Server 200 8中更改數(shù)據(jù)庫(kù)名稱并不像在Windows中那樣簡(jiǎn)單,要改變名稱的那個(gè)數(shù)據(jù)庫(kù)很可能正被其他用戶使用,所以變更數(shù)據(jù)庫(kù)名稱的操作必須在單用戶模式下方可進(jìn)行,然后使用系統(tǒng)存儲(chǔ)過(guò)程sp_renamedb或直接更改來(lái)更改數(shù)據(jù)庫(kù)的名稱。首先將數(shù)據(jù)庫(kù)更改為單用戶模式,如圖3.20所示。

圖3.20 將test數(shù)據(jù)庫(kù)設(shè)置為單用戶模式

完成單用戶設(shè)置后,可以在對(duì)象資源管理器中直接對(duì)數(shù)據(jù)庫(kù)的名稱進(jìn)行修改,如圖3.21所示,將test數(shù)據(jù)庫(kù)的名稱修改為test1。

下面再通過(guò)執(zhí)行sp_renamedb存儲(chǔ)過(guò)程來(lái)進(jìn)行更名操作。打開SQL查詢窗口,輸入如下語(yǔ)句:

        EXEC sp_renamedb 'test1','test'

執(zhí)行完成后,如圖3.22所示。

圖3.21 修改test數(shù)據(jù)庫(kù)的名稱

圖3.22 修改test1數(shù)據(jù)庫(kù)的名稱

3.6.5 刪除數(shù)據(jù)庫(kù)

刪除數(shù)據(jù)庫(kù)比較簡(jiǎn)單,但是應(yīng)該注意的是,如果某個(gè)數(shù)據(jù)庫(kù)正在使用時(shí),則無(wú)法對(duì)該數(shù)據(jù)庫(kù)進(jìn)行刪除。可以使用對(duì)象資源管理器和DROP DA TAHASE語(yǔ)句來(lái)刪除某個(gè)數(shù)據(jù)庫(kù)。首先直接使用對(duì)象資源管理器來(lái)進(jìn)行數(shù)據(jù)庫(kù)的刪除,在對(duì)象資源管理器的【數(shù)據(jù)庫(kù)】分支中選擇要?jiǎng)h除的數(shù)據(jù)庫(kù)選項(xiàng)【test】選項(xiàng)。在該選項(xiàng)上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇【刪除】命令,彈出如圖3.23所示的窗口,單擊【確定】按鈕,完成數(shù)據(jù)庫(kù)刪除。

圖3.23 使用對(duì)象資源管理器刪除test數(shù)據(jù)庫(kù)

也可以直接使用T-SQL代碼來(lái)完成數(shù)據(jù)庫(kù)的刪除,如圖3.24所示。

圖3.24 使用T-SQL代碼刪除test數(shù)據(jù)庫(kù)

        DROP DATABASE test

在SQL Server Management Studio查詢分析器窗口中運(yùn)行代碼,執(zhí)行完畢后,SQL Server 2008將返回該數(shù)據(jù)庫(kù)的數(shù)據(jù)文件和日志文件均被刪除的提示信息。

如圖3.24,test數(shù)據(jù)庫(kù)已被刪除。

3.7 小結(jié)

本章學(xué)習(xí)了數(shù)據(jù)模型的概念和數(shù)據(jù)庫(kù)的創(chuàng)建與管理。本章的重點(diǎn)是掌握系統(tǒng)數(shù)據(jù)庫(kù)的分類和作用、學(xué)會(huì)使用對(duì)象資源管理器創(chuàng)建用戶數(shù)據(jù)庫(kù)、學(xué)會(huì)使用查詢分析器創(chuàng)建用戶數(shù)據(jù)庫(kù)、學(xué)會(huì)壓縮和擴(kuò)充數(shù)據(jù)庫(kù)、學(xué)會(huì)查看和修改數(shù)據(jù)庫(kù)選項(xiàng)、學(xué)會(huì)給數(shù)據(jù)庫(kù)改名和刪除數(shù)據(jù)庫(kù)。難點(diǎn)是使用E-R模型設(shè)計(jì)數(shù)據(jù)庫(kù)和不同范式的理解。下一章將在此基礎(chǔ)上全面介紹Transact-SQL語(yǔ)言。

3.8 習(xí)題

【題目1】創(chuàng)建一個(gè)Test數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)的主數(shù)據(jù)文件邏輯名稱為Test_data,物理文件名為Test.mdf,初始大小為10MB,最大尺寸為無(wú)限大,增長(zhǎng)速度為10%;數(shù)據(jù)庫(kù)的日志文件邏輯名稱為Test_log,物理文件名為Test.ldf,初始大小為1MB,最大尺寸為5MB,增長(zhǎng)速度為1MB,數(shù)據(jù)庫(kù)文件大小使用KB表示。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)創(chuàng)建的理解,按照示例完成即可,要注意題目中對(duì)于所創(chuàng)建的數(shù)據(jù)庫(kù)的具體參數(shù)的要求。首先,在沒(méi)有指出文件創(chuàng)建位置時(shí),在SQL的安裝文件夾創(chuàng) 建,例 如SQL Server 2008的 安 裝 路 徑 為“C:\Program Files\ Microsoft SQL Server\MSSQL.1\MSSQL\”,則創(chuàng)建于對(duì)應(yīng)的data文件夾下。其次,注意數(shù)據(jù)庫(kù)文件的大小以KB表示,因此要正確使用換算關(guān)系。最大尺寸和增長(zhǎng)速度采用和例子類似的方式即可。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        CREATE DATABASE Test
        ON PRIMARY
        (
        NAME = 'Test',
        FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\test.mdf',
        SIZE=10240KB,
        MAXSIZE = UNLIMITED,
        FILEGROWTH = 10%
        )
        LOG ON
        (
        NAME='Test_log',
        FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\test_log.ldf',
        SIZE=1024KB,
        MAXSIZE = 5120KB,
        FILEGROWTH = 1024KB
        )
        GO

【題目2】創(chuàng)建一個(gè)名為“user”的用戶數(shù)據(jù)庫(kù),其主文件大小為120MB,初始大小為55MB,文件增長(zhǎng)增量為3MB;日志文件大小為30MB,初始大小為12MB,文件增長(zhǎng)增量為3MB;其中文件均存儲(chǔ)在D盤根目錄下,數(shù)據(jù)庫(kù)文件大小使用KB表示。

【分析】與題目1相比,首先,要選擇不同的存放位置,例如可以直接存放在D盤的data文件夾中。其次,注意增長(zhǎng)方式的變化,在本題中增長(zhǎng)方式為一個(gè)固定值。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        CREATE DATABASE user
        ON PRIMARY
        (
        NAME = 'user',
        FILENAME='D:\ \data\user.mdf',
        SIZE=56320KB,
        MAXSIZE =122880KB,
        FILEGROWTH = 30720KB,
        )
        LOG ON
        (
        NAME='user_log',
        FILENAME='D:\ user_log.ldf',
        SIZE=12288KB,
        MAXSIZE = 30720KB,
        FILEGROWTH = 3072KB
        )
        GO

【題目3】使用3個(gè)100MB的數(shù)據(jù)文件和兩個(gè)100MB的事務(wù)日志文件創(chuàng)建名為Archive的數(shù)據(jù)庫(kù)。主文件是列表中的第一個(gè)文件,并使用PRIMARY關(guān)鍵字顯式指定。事務(wù)日志文件在LOG ON關(guān)鍵字后指定。注意FILENAME選項(xiàng)中所用的文件擴(kuò)展名:主要數(shù)據(jù)文件使用.mdf,次要數(shù)據(jù)文件使用.ndf,事務(wù)日志文件使用.ldf,存放位置和其他參數(shù)自行指定,數(shù)據(jù)庫(kù)文件大小使用MB表示。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)創(chuàng)建的理解。參數(shù)的指定和前兩題相同,區(qū)別在于本題使用的數(shù)據(jù)文件和事務(wù)日志文件為多個(gè),因此要逐一進(jìn)行列舉。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        CREATE DATABASE Archive
        ON
        PRIMARY
          (
            NAME=Arch1,
            FILENAME='c:\program files\microsoft sql server\mssql.1\mssql\data\archdat1.mdf',
            SIZE= 100MB,
            MAXSIZE = 200,
            FILEGROWTH = 20
          ),
          (
            NAME= Arch2,
            FILENAME = 'c:\program files\microsoft sql server\mssql.1\mssql\data\archdat2.ndf',
            SIZE= 100MB,
            MAXSIZE = 200,
            FILEGROWTH = 20
          ),
          (
            NAME= Arch3,
            FILENAME = 'c:\program files\microsoft sql server\mssql.1\mssql\data\archdat3.ndf',
            SIZE= 100MB,
            MAXSIZE = 200,
            FILEGROWTH = 20
          )
          LOG ON
          (
            NAME= Archlog1,
            FILENAME = 'c:\program files\microsoft sql server\mssql.1\mssql\data\archlog1.ldf',
            SIZE= 100MB,
            MAXSIZE = 200,
            FILEGROWTH = 20
          ),
          (
            NAME=Archlog2,
            FILENAME = 'c:\program files\microsoft sql server\mssql.1\mssql\data\archlog2.ldf',
            SIZE= 100MB,
            MAXSIZE = 200,
            FILEGROWTH = 20
            )
          GO

【題目4】將兩個(gè)數(shù)據(jù)文件和一個(gè)事務(wù)日志文件添加到Test數(shù)據(jù)庫(kù)中。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)修改方法的理解。數(shù)據(jù)文件和事務(wù)文件的使用和上幾題類似,區(qū)別在于本題中是對(duì)現(xiàn)有數(shù)據(jù)庫(kù)的修改,因此需要使用ALTER DATABASE修改數(shù)據(jù)庫(kù)。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        ALTER DATABASE Test
        ADD FILE
        (
          NAME= Test1,
        FILENAME='c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test1.ndf',
        SIZE= 5MB,
        MAXSIZE = 100MB,
        FILEGROWTH = 5MB
      ),
      (
        NAME= Test2,
        FILENAME='c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test2.ndf',
        SIZE= 3MB,
        MAXSIZE = 10MB,
        FILEGROWTH = 1MB
      )
      GO
      ALTER DATABASE Test
      ADD LOG FILE
      (
        NAME= testlog1,
        FILENAME='c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\testlog1.ldf',
        SIZE= 5MB,
        MAXSIZE = 100MB,
        FILEGROWTH = 5MB
      )
      GO

【題目5】使用T-SQL代碼將“user”用戶數(shù)據(jù)庫(kù)的大小分別擴(kuò)展到300MB,并縮減到原始狀態(tài)。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)修改方法的理解。與上題不同的是,本題中不是向數(shù)據(jù)庫(kù)中新增,而是對(duì)已有的數(shù)據(jù)庫(kù)進(jìn)行修改,因此需使用MODIFY關(guān)鍵字。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        USE user
        Go
        ALTER DATABASE user
        MODIFY FILE
        (
          NAME=' D:\ \data\user.mdf',
          SIZE=300MB
        )

【題目6】使用SSMS完成第5題的步驟。

【分析】該試題是考查對(duì)于SSMS修改數(shù)據(jù)庫(kù)屬性的方法的熟悉,參考前文內(nèi)容進(jìn)行。注意,正確打開SSMS,并選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù),通過(guò)修改【屬性】對(duì)話框中的值來(lái)完成修改。

【題目7】使用T-SQL代碼將“user”用戶數(shù)據(jù)庫(kù)的大小縮減到50MB。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)修改方法的理解。對(duì)于數(shù)據(jù)庫(kù)文件的縮減,關(guān)鍵就在于DBCC關(guān)鍵字的使用,然后要正確設(shè)定縮減后的數(shù)據(jù)庫(kù)大小。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        USE user
        GO
        DBCC SHRINKDATABASE ('user') 50MB

【題目8】使用SSMS完成第7題的步驟。

【分析】該試題是考查對(duì)于SSMS修改數(shù)據(jù)庫(kù)屬性的方法的熟悉,參考前文內(nèi)容進(jìn)行。注意,正確打開SSMS,并選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù),通過(guò)修改【屬性】對(duì)話框中的值來(lái)完成修改。

【題目9】使用T-SQL代碼將“user”用戶數(shù)據(jù)庫(kù)設(shè)為單用戶。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)修改方法的理解。注意使用sp_dboption系統(tǒng)過(guò)程完成設(shè)置工作。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        EXEC sp_dboption 'user', 'single  user', True

【題目10】使用SSMS完成第9題的步驟。

【分析】該試題是考查對(duì)于SSMS修改數(shù)據(jù)庫(kù)屬性的方法的熟悉,參考前文內(nèi)容進(jìn)行。注意,正確打開SSMS,并選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù),通過(guò)修改【屬性】對(duì)話框中的值來(lái)完成修改。

【題目11】使用T-SQL代碼修改“user”用戶數(shù)據(jù)庫(kù)的名稱。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)名稱變更方法的理解。注意使用sp_renamedb系統(tǒng)過(guò)程完成設(shè)置工作。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        EXEC sp_renamedb 'user','user1'

【題目12】使用SSMS完成第11題的步驟。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)名稱變更方法的理解,參考前文內(nèi)容進(jìn)行。注意,正確打開SSMS,并選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù),通過(guò)修改【屬性】對(duì)話框中的值來(lái)完成修改。

【題目13】使用T-SQL代碼刪除“user”用戶數(shù)據(jù)庫(kù)。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)刪除方法的理解。注意使用DROP關(guān)鍵字。

【核心代碼】按照以上分析,構(gòu)建以下核心代碼:

        DROP DATABASE user

【題目14】使用SSMS完成第13題的步驟。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)刪除方法的理解,參考前文內(nèi)容進(jìn)行。注意,正確打開SSMS,并選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù),通過(guò)修改【屬性】對(duì)話框中的值來(lái)完成修改。

【題目15】使用向?qū)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)學(xué)生成績(jī)數(shù)據(jù)庫(kù)Stu_Score。要求數(shù)據(jù)庫(kù)增量為3MB,不限制增長(zhǎng)總量,按照百分比增長(zhǎng)。

【分析】該試題是進(jìn)一步考查對(duì)于數(shù)據(jù)庫(kù)創(chuàng)建的理解,同時(shí)為后面的進(jìn)一步應(yīng)用提供數(shù)據(jù)庫(kù)基礎(chǔ)。按照示例完成即可,要注意題目中對(duì)于所創(chuàng)建的數(shù)據(jù)庫(kù)的具體參數(shù)的要求。

【核心代碼】參照前面的習(xí)題。

【題目16】在題目15的基礎(chǔ)上,使用T-SQL命令修改數(shù)據(jù)庫(kù)容量為30MB。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)創(chuàng)建的理解,按照示例完成即可,要注意題目中對(duì)于所創(chuàng)建的數(shù)據(jù)庫(kù)的具體參數(shù)的要求。

【核心代碼】參照前面的習(xí)題。

【題目17】在題目1的基礎(chǔ)上,使用向?qū)薷臄?shù)據(jù)庫(kù)容量為20MB。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)修改方法的理解,參考前文內(nèi)容進(jìn)行。

【題目18】將題目15中創(chuàng)建的數(shù)據(jù)庫(kù)名稱改為Score。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)名稱變更的理解。

【核心代碼】參照前面的習(xí)題。

【題目19】使用向?qū)h除學(xué)生成績(jī)數(shù)據(jù)庫(kù)Score。

【分析】該試題是考查對(duì)于數(shù)據(jù)庫(kù)刪除方法的理解,參考前文內(nèi)容進(jìn)行。

【題目20】假設(shè)某公司的業(yè)務(wù)規(guī)則如下:

(1)公司下設(shè)幾個(gè)部門,如技術(shù)部、財(cái)務(wù)部、市場(chǎng)部等。

(2)每個(gè)部門承擔(dān)多個(gè)工程項(xiàng)目,每個(gè)工程項(xiàng)目屬于一個(gè)部門。

(3)每個(gè)部門有多名職工,每一名職工只能屬于一個(gè)部門。

(4)一個(gè)部門可能參與多個(gè)工程項(xiàng)目,且每個(gè)工程項(xiàng)目有多名職工參與施工。根據(jù)職工在工程項(xiàng)目中完成的情況發(fā)放酬金。

(5)工程項(xiàng)目有工程號(hào)、工程名兩個(gè)屬性;部門有部門號(hào)、部門名稱兩個(gè)屬性;職工有職工號(hào)、姓名、性別屬性。

要求回答以下問(wèn)題:

● 根據(jù)上述規(guī)則設(shè)計(jì)E-R模型。

● 將E-R模型轉(zhuǎn)換成關(guān)系數(shù)據(jù)模型,并指出每個(gè)關(guān)系的主鍵和外鍵。

【分析】對(duì)于E-R模型的設(shè)計(jì),首先要確定實(shí)體是什么。對(duì)于本題來(lái)說(shuō),根據(jù)題面(5)的描述,實(shí)體包括部門、工程項(xiàng)目和職工。接下來(lái)要確定實(shí)體的屬性,這些在題面(5)中也給出得非常清楚。最后要判定模型中的關(guān)系,也就是所謂的R,那么從題面(2)到題面(4)可以看出來(lái),部門和職工間是1到N的對(duì)應(yīng)關(guān)系,同時(shí)部門和工程項(xiàng)目之間也是1到N的對(duì)應(yīng)關(guān)系。

(1)E-R模型如下:

(2)對(duì)應(yīng)的關(guān)系數(shù)據(jù)模型如下:

● 部門(部門號(hào),部門名稱),其中部門號(hào)是主鍵。

● 職工(職工號(hào),姓名,性別),其中職工號(hào)是主鍵。

● 工程項(xiàng)目(工程號(hào),工程名),其中工程號(hào)是主鍵。

● 隸屬(部門號(hào),職工號(hào),職位),其中部門號(hào)和職工號(hào)既是它的主鍵也是它的外鍵。

● 承擔(dān)(部門號(hào),工程號(hào),起始時(shí)間),其中部門號(hào)和工程號(hào)既是它的主鍵也是它的外鍵。

【題目21】學(xué)生運(yùn)動(dòng)會(huì)模型:

(1)有若干班級(jí),每個(gè)班級(jí)包括:班級(jí)號(hào)、班級(jí)名、專業(yè)、人數(shù)。

(2)每個(gè)班級(jí)有若干運(yùn)動(dòng)員,運(yùn)動(dòng)員只能屬于一個(gè)班,包括:運(yùn)動(dòng)員號(hào)、姓名、性別、年齡。

(3)有若干比賽項(xiàng)目,包括:項(xiàng)目號(hào)、名稱、比賽地點(diǎn)。

(4)每名運(yùn)動(dòng)員可參加多項(xiàng)比賽,每個(gè)項(xiàng)目可有多人參加。

(5)要求能夠公布每個(gè)比賽項(xiàng)目的運(yùn)動(dòng)員名次與成績(jī)。

(6)要求能夠公布各個(gè)班級(jí)團(tuán)體總分的名次和成績(jī)。

要求回答以下問(wèn)題:

● 畫出每個(gè)實(shí)體及其屬性關(guān)系、實(shí)體間實(shí)體聯(lián)系的E-R圖。

● 根據(jù)試題中的處理要求:完成數(shù)據(jù)庫(kù)邏輯模型,包括各個(gè)表的名稱和屬性,并指出每個(gè)表的主鍵和外鍵。

【分析】對(duì)于E-R模型的設(shè)計(jì),首先要確定實(shí)體是什么。對(duì)于本題來(lái)說(shuō),根據(jù)題面(1)~(3)的描述,實(shí)體包括班級(jí)、運(yùn)動(dòng)員和項(xiàng)目。接下來(lái)要確定實(shí)體的屬性,這些在題面中也給出得非常清楚。最后要判定模型中的關(guān)系,也就是所謂的R,那么從題面(2)~(4)可以看出,班級(jí)和運(yùn)動(dòng)員間是1到N的對(duì)應(yīng)關(guān)系,同時(shí)運(yùn)動(dòng)員和項(xiàng)目之間是多到多的對(duì)應(yīng)關(guān)系。

(1)E-R模型如下:

(2)邏輯模型如下:

● 班級(jí)(班級(jí)號(hào),班級(jí)名,專業(yè),人數(shù))主鍵:班級(jí)號(hào)

● 運(yùn)動(dòng)員(運(yùn)動(dòng)員號(hào),姓名,性別,年齡,班級(jí)號(hào))主鍵:運(yùn)動(dòng)員號(hào)外鍵: 班級(jí)號(hào)

● 項(xiàng)目(項(xiàng)目號(hào),項(xiàng)目名,比賽地點(diǎn))主鍵:項(xiàng)目號(hào)

● 比賽(運(yùn)動(dòng)員號(hào),項(xiàng)目號(hào),成績(jī),名次,得分)主鍵:運(yùn)動(dòng)員號(hào),項(xiàng)目號(hào)外鍵:運(yùn)動(dòng)員號(hào),項(xiàng)目號(hào)

主站蜘蛛池模板: 安宁市| 台中市| 波密县| 秦皇岛市| 新营市| 十堰市| 江华| 伊金霍洛旗| 中西区| 武宁县| 平原县| 霞浦县| 南平市| 湘乡市| 新邵县| 新蔡县| 江门市| 岐山县| 古浪县| 青海省| 黑水县| 南江县| 治多县| 湘乡市| 新晃| 汝南县| 花莲市| 莱西市| 日喀则市| 左云县| 钟祥市| 霍城县| 武平县| 昭平县| 民勤县| 依兰县| 绥阳县| 四会市| 台中市| 阳原县| 常熟市|