- 由淺入深學(xué)SQL Server:基礎(chǔ)、進(jìn)階與必做300題
- 王俊 鄭笛編著
- 244字
- 2018-12-27 20:35:35
第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:n和m: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)
- 數(shù)據(jù)產(chǎn)品經(jīng)理高效學(xué)習(xí)手冊(cè):產(chǎn)品設(shè)計(jì)、技術(shù)常識(shí)與機(jī)器學(xué)習(xí)
- Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)
- 數(shù)據(jù)分析實(shí)戰(zhàn):基于EXCEL和SPSS系列工具的實(shí)踐
- Word 2010中文版完全自學(xué)手冊(cè)
- 信息系統(tǒng)與數(shù)據(jù)科學(xué)
- Game Development with Swift
- Visual Studio 2015 Cookbook(Second Edition)
- 大數(shù)據(jù)導(dǎo)論
- 云計(jì)算與大數(shù)據(jù)應(yīng)用
- 大數(shù)據(jù)精準(zhǔn)挖掘
- 數(shù)據(jù)庫(kù)原理與應(yīng)用
- 區(qū)域云計(jì)算和大數(shù)據(jù)產(chǎn)業(yè)發(fā)展:浙江樣板
- 中文版Access 2007實(shí)例與操作
- AI Crash Course
- 數(shù)據(jù)中心UPS系統(tǒng)運(yùn)維