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

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

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

在本章中,將重點學習以下內(nèi)容:

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

● 使用ER模型的關系數(shù)據(jù)庫設計。

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

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

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

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

3.1 數(shù)據(jù)庫設計——模型與結構

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

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

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

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

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

數(shù)據(jù)庫中的數(shù)據(jù)是高度結構化的。也就是說,數(shù)據(jù)庫不僅要考慮記錄內(nèi)的各個數(shù)據(jù)項之間的關系,還要考慮記錄與記錄之間的關系。

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

3.1.2 層次模型

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

圖3.1 層次模型示意圖

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

● 進行插入操作時,如果沒有相應的雙親節(jié)點值就不能插入子女節(jié)點值。

● 進行刪除操作時,如果刪除雙親節(jié)點值,則相應的子女節(jié)點值也被同時刪除。

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

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

3.1.3 網(wǎng)狀模型

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

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

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

3.1.4 關系模型

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

表3.1 2008級學生信息表

該表涉及如下一些概念:

● 關系:對應通常所說的表,如表3.1所示的這張基本信息表。

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

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

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

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

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

公共關鍵字:連接兩個表的公共屬性。例如,表3.1和表3.2是通過編號進行聯(lián)系的,它是兩個表的公共屬性,也就是兩個表的公共關鍵字。

表3.2 2008級學生課程成績表

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

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

1.關系模型的操作與完整性約束

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

2.關系模型的優(yōu)、缺點

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

● 關系模型是建立在嚴格的數(shù)學概念基礎上的,無論實體還是實體之間的聯(lián)系都用關系來表示,數(shù)據(jù)的查詢結果也是關系(表),因此,概念單一,數(shù)據(jù)結構簡單、清晰。

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

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

3.2 關系數(shù)據(jù)庫設計——實體與關系

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

3.2.1 實體

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

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

例如,圖書實體中的“ISBN號”可以作為實體標識符,因為“ISBN號”的值是唯一的,它能唯一地標識出實體中的每一行。而“書名”不可以作為圖書實體的實體標識符,因為“書名”有重名的現(xiàn)象存在,它所標識的行會出現(xiàn)不唯一的情況。

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

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

圖3.2 E-R圖

3.2.3 E-R模型

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

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

● 屬性:使用橢圓形框表示,并用連線與實體連接起來。如果屬性較多,為使圖形更加簡明,有時也將實體與其屬性單獨用列表表示。

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

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

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

3.3.1 規(guī)范化與范式

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

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

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

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

3.3.2 第一范式(1NF)

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

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

圖3.3 第一范式

3.3.3 第二范式(2NF)

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

第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性。如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。簡而言之,第二范式就是非主屬性非部分依賴于主關鍵字。

假定設計學生管理數(shù)據(jù)庫,其中包含選課關系表為SelectCourse(學號,姓名,年齡,課程名稱,成績,學分),關鍵字為組合關鍵字(學號,課程名稱),因為存在如下決定關系:

        (學號,課程名稱)→(姓名,年齡,成績,學分)

所以,這個數(shù)據(jù)庫表不滿足第二范式,因為存在如下決定關系:

        (課程名稱)→(學分)
        (學號)→(姓名,年齡)

即存在組合關鍵字中的字段決定非關鍵字的情況。由于不符合2NF,所以這個關系表會存在如下問題:

1.數(shù)據(jù)冗余

同一門課程由n個學生選修,“學分”就重復n-1次;同一個學生選修了m門課程,“姓名”和“年齡”就重復了m-1次。

2.更新異常

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

3.插入異常

假設要開設一門新的課程,暫時還沒有人選修。這樣,由于還沒有“學號”關鍵字,課程名稱和學分也無法記入數(shù)據(jù)庫。

4.刪除異常

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

把選課關系表SelectCourse改為如下3個表:

        學生:Student(學號,姓名,年齡);
        課程:Course(課程名稱,學分);
        選課關系:SelectCourse(學號,課程名稱,成績)。

這樣的數(shù)據(jù)庫表是符合第二范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。另外,所有單關鍵字的數(shù)據(jù)庫表都符合第二范式,因為不可能存在組合關鍵字。

3.3.4 第三范式(3NF)

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

        關鍵字段→非關鍵字段x→非關鍵字段y

假定學生管理數(shù)據(jù)庫中學生關系表為Student(學號,姓名,年齡,所在學院,學院地點,學院電話),關鍵字為單一關鍵字“學號”,因為存在如下決定關系:

        (學號)→(姓名,年齡,所在學院,學院地點,學院電話)

所以,這個數(shù)據(jù)庫是符合2NF的,但是不符合3NF,因為存在如下決定關系:

        (學號)→(所在學院)→(學院地點,學院電話)

即存在非關鍵字段“學院地點”、“學院電話”對關鍵字段“學號”的傳遞函數(shù)依賴。

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

        學生:(學號,姓名,年齡,所在學院);
        學院:(學院,地點,電話)。

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

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

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

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

● 第四范式,用于處理由復雜的復合主鍵所導致的問題。如果將兩個相互獨立的屬性與第三個屬性一起組合為一個主鍵,并且如果沒有第三個屬性,僅靠這兩個屬性不能在實體中真正地起到唯一標識的作用,那么它就違反了第四范式。

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

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

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

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

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

如果數(shù)據(jù)結構糟糕,則可能需要在觸發(fā)器、存儲過程中,甚至是在業(yè)務邏輯層中進行多余的編程,而這又會進一步嚴重地損害性能。由于需要錯綜復雜的代碼來維護冗余數(shù)據(jù),多余的代碼增加了引入新缺陷的可能性。

3.給表瘦身

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

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

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

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

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

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

3.3.6 非規(guī)范化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

圖3.8 【更改自動增長設置】對話框

對文件增長設置,如圖3.8所示,其中文件增長有兩種自動增長方式。

● 【按百分比】:指定每次增長的百分比。

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

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

圖3.9 存放路徑選擇

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

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

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

圖3.11 【選項】界面

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

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

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

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

【范例3-1】下面學習一個創(chuàng)建用戶數(shù)據(jù)庫test的簡單例子。

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

【代碼解析】

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

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

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

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

【運行結果】

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        USE  database name

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

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

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

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

擴增數(shù)據(jù)庫語句格式如下:

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

【范例3-2】將新創(chuàng)建的test數(shù)據(jù)庫的大小調(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ù)庫一般通過執(zhí)行DBCC SHRINKDATABASE命令來完成,其語句格式如下:

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

其中,

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

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

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

        USE test
        GO
        DBCC SHRINKDATABASE ('test')

【運行結果】

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

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

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

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

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

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

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

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

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

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

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

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

下面簡單介紹部分選項參數(shù)。

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

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

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

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

2.dbo use only

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

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

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

3.read only

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

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

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

4.single user

single user選項設置為true時,每次只能有一個用戶訪問該數(shù)據(jù)庫。

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

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

5.offline

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

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

        EXEC sp_dboption 'test', 'offline', True

6.a(chǎn)utoshrink

autoshrink選項設置為true時,數(shù)據(jù)庫將自動地周期性收縮大小。

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

      EXEC sp_dboption 'test', 'autoshrink', True

7.ANSI warnings

ANSI warnings選項設置為true時,將提示“除0”之類的標準錯誤和警告。

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

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

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

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

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

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

下面再通過執(zhí)行sp_renamedb存儲過程來進行更名操作。打開SQL查詢窗口,輸入如下語句:

        EXEC sp_renamedb 'test1','test'

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

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

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

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

刪除數(shù)據(jù)庫比較簡單,但是應該注意的是,如果某個數(shù)據(jù)庫正在使用時,則無法對該數(shù)據(jù)庫進行刪除。可以使用對象資源管理器和DROP DA TAHASE語句來刪除某個數(shù)據(jù)庫。首先直接使用對象資源管理器來進行數(shù)據(jù)庫的刪除,在對象資源管理器的【數(shù)據(jù)庫】分支中選擇要刪除的數(shù)據(jù)庫選項【test】選項。在該選項上單擊鼠標右鍵,在彈出的快捷菜單中選擇【刪除】命令,彈出如圖3.23所示的窗口,單擊【確定】按鈕,完成數(shù)據(jù)庫刪除。

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

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

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

        DROP DATABASE test

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

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

3.7 小結

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

3.8 習題

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

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

【核心代碼】按照以上分析,構建以下核心代碼:

        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)建一個名為“user”的用戶數(shù)據(jù)庫,其主文件大小為120MB,初始大小為55MB,文件增長增量為3MB;日志文件大小為30MB,初始大小為12MB,文件增長增量為3MB;其中文件均存儲在D盤根目錄下,數(shù)據(jù)庫文件大小使用KB表示。

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

【核心代碼】按照以上分析,構建以下核心代碼:

        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個100MB的數(shù)據(jù)文件和兩個100MB的事務日志文件創(chuàng)建名為Archive的數(shù)據(jù)庫。主文件是列表中的第一個文件,并使用PRIMARY關鍵字顯式指定。事務日志文件在LOG ON關鍵字后指定。注意FILENAME選項中所用的文件擴展名:主要數(shù)據(jù)文件使用.mdf,次要數(shù)據(jù)文件使用.ndf,事務日志文件使用.ldf,存放位置和其他參數(shù)自行指定,數(shù)據(jù)庫文件大小使用MB表示。

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

【核心代碼】按照以上分析,構建以下核心代碼:

        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】將兩個數(shù)據(jù)文件和一個事務日志文件添加到Test數(shù)據(jù)庫中。

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

【核心代碼】按照以上分析,構建以下核心代碼:

        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ù)庫的大小分別擴展到300MB,并縮減到原始狀態(tài)。

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

【核心代碼】按照以上分析,構建以下核心代碼:

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

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

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

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

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

【核心代碼】按照以上分析,構建以下核心代碼:

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

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

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

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

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

【核心代碼】按照以上分析,構建以下核心代碼:

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

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

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

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

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

【核心代碼】按照以上分析,構建以下核心代碼:

        EXEC sp_renamedb 'user','user1'

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

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

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

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

【核心代碼】按照以上分析,構建以下核心代碼:

        DROP DATABASE user

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

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

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

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

【核心代碼】參照前面的習題。

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

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

【核心代碼】參照前面的習題。

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

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

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

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

【核心代碼】參照前面的習題。

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

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

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

(1)公司下設幾個部門,如技術部、財務部、市場部等。

(2)每個部門承擔多個工程項目,每個工程項目屬于一個部門。

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

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

(5)工程項目有工程號、工程名兩個屬性;部門有部門號、部門名稱兩個屬性;職工有職工號、姓名、性別屬性。

要求回答以下問題:

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

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

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

(1)E-R模型如下:

(2)對應的關系數(shù)據(jù)模型如下:

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

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

● 工程項目(工程號,工程名),其中工程號是主鍵。

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

● 承擔(部門號,工程號,起始時間),其中部門號和工程號既是它的主鍵也是它的外鍵。

【題目21】學生運動會模型:

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

(2)每個班級有若干運動員,運動員只能屬于一個班,包括:運動員號、姓名、性別、年齡。

(3)有若干比賽項目,包括:項目號、名稱、比賽地點。

(4)每名運動員可參加多項比賽,每個項目可有多人參加。

(5)要求能夠公布每個比賽項目的運動員名次與成績。

(6)要求能夠公布各個班級團體總分的名次和成績。

要求回答以下問題:

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

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

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

(1)E-R模型如下:

(2)邏輯模型如下:

● 班級(班級號,班級名,專業(yè),人數(shù))主鍵:班級號

● 運動員(運動員號,姓名,性別,年齡,班級號)主鍵:運動員號外鍵: 班級號

● 項目(項目號,項目名,比賽地點)主鍵:項目號

● 比賽(運動員號,項目號,成績,名次,得分)主鍵:運動員號,項目號外鍵:運動員號,項目號

主站蜘蛛池模板: 清河县| 长垣县| 广平县| 宜兰县| 浙江省| 平原县| 鹤庆县| 渭源县| 木兰县| 南宁市| 黔南| 顺义区| 天长市| 惠安县| 舟山市| 安义县| 启东市| 介休市| 台南市| 陆良县| 宕昌县| 榆中县| 新巴尔虎左旗| 绥德县| 阳江市| 扎赉特旗| 左贡县| 蓝田县| 九江县| 永顺县| 建昌县| 浦北县| 汽车| 梁河县| 漳州市| 会泽县| 宿州市| 桂平市| 合水县| 峨边| 开化县|