版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、q 數(shù)據(jù)庫(kù)是什么?數(shù)據(jù)庫(kù)由什么構(gòu)成?它存儲(chǔ)在何處?q 如何定義系統(tǒng)的類型,是關(guān)系的還是分析的?q 如何收集當(dāng)前系統(tǒng)的數(shù)據(jù)并找出新系統(tǒng)的信息。q 如何通過SSMS、向?qū)Щ虿樵兙庉嬈鞔翱趧?chuàng)建數(shù)據(jù)庫(kù),如何在查詢編輯器窗口設(shè)置數(shù)據(jù)庫(kù)選項(xiàng)。q 如何查看數(shù)據(jù)庫(kù)的細(xì)節(jié)。q 如何用SSMS和查詢編輯器窗口移除數(shù)據(jù)庫(kù)。 注解 在本章的練習(xí)中,將不會(huì)使用任何明確的、正式的設(shè)計(jì)技術(shù),畢竟本書并非是專門講述數(shù)據(jù)庫(kù)設(shè)計(jì)的圖書。然而,到達(dá)數(shù)據(jù)庫(kù)最終設(shè)計(jì)的過程(物理的和邏輯的)將是相同的。3.1 數(shù)據(jù)庫(kù)的定義數(shù)據(jù)庫(kù)(database)是對(duì)象的容器,它不僅可以存儲(chǔ)數(shù)據(jù),而且能夠使數(shù)據(jù)存儲(chǔ)和檢索以安全而可靠的方式進(jìn)行。SQL
2、Server 2005數(shù)據(jù)庫(kù)能夠包含如下對(duì)象(盡管當(dāng)數(shù)據(jù)庫(kù)剛創(chuàng)建時(shí),這些信息中的一部分尚未創(chuàng)建):q 表定義。q 表中的列,組成數(shù)據(jù)行。q 程序(存儲(chǔ)過程或程序集),用于訪問或操作數(shù)據(jù)。q 索引,用于加速數(shù)據(jù)檢索。q 視圖,查看真實(shí)數(shù)據(jù)的一種特殊的方式。q 函數(shù),可以應(yīng)用到數(shù)據(jù)行的重復(fù)性任務(wù)。上述列表中包含了不少專門術(shù)語(yǔ),因此,下面將花些時(shí)間來(lái)講述它們的定義:q 表:表用于存儲(chǔ)數(shù)據(jù)庫(kù)中的數(shù)據(jù)。盡管可以使數(shù)據(jù)庫(kù)只包含系統(tǒng)表而沒有用戶表,但數(shù)據(jù)庫(kù)至少應(yīng)該有一個(gè)有用的表。系統(tǒng)表是一種特殊的表,SQL Server用系統(tǒng)表來(lái)幫助其進(jìn)行與數(shù)據(jù)庫(kù)有關(guān)的工作。表包含位于行和列之中的信息,這很像在Excel中
3、那樣,但其能力遠(yuǎn)比Excel中的單元格強(qiáng)大。臨時(shí)表是另一種類型的數(shù)據(jù)庫(kù)表,可以有幾種不同的形式。q 列:列提供每一個(gè)單獨(dú)的信息項(xiàng)的定義,由列定義構(gòu)成表定義。列很像Excel中的列,由存放數(shù)據(jù)的單元格組成。與Excel中的列不同的是,在Excel中,列的每個(gè)單元格可以存放不同類型的數(shù)據(jù),而對(duì)于SQL Server表中的列,可以存放的數(shù)據(jù)取決于準(zhǔn)備讓它存放的數(shù)據(jù)類型以及數(shù)量。每個(gè)表至少要有一個(gè)列,雖然該列不必包含任何信息。q 行:行由單元格組成,每個(gè)單元格來(lái)自為表定義的每一個(gè)列。表可以有任意數(shù)目的行,行的數(shù)目只受限于磁盤空間,或者說(shuō)受限于在數(shù)據(jù)庫(kù)創(chuàng)建定義中指定的最大磁盤空間,或服務(wù)器上的磁盤空間。
4、每一行描述了一條單獨(dú)的信息,如用戶的銀行賬戶詳情或電子商務(wù)站點(diǎn)的產(chǎn)品信息。行也稱為記錄。q 存儲(chǔ)過程:當(dāng)需要一個(gè)程序來(lái)操作數(shù)據(jù)或進(jìn)行與數(shù)據(jù)有關(guān)的工作,或者需要重復(fù)地執(zhí)行相同的數(shù)據(jù)密集型任務(wù)時(shí),把代碼存儲(chǔ)到存儲(chǔ)過程中常常是較理想的選擇。存儲(chǔ)過程包含一條或多條T-SQL語(yǔ)句,這些語(yǔ)句已經(jīng)編譯并隨時(shí)可以在需要時(shí)執(zhí)行。存儲(chǔ)過程永久存儲(chǔ)在數(shù)據(jù)庫(kù)中,隨時(shí)可供使用。q T-SQL語(yǔ)句:SQL Server在進(jìn)行數(shù)據(jù)方面的工作時(shí),可以使用的程序語(yǔ)句。q 程序集:程序集是SQL Server 2005中新增內(nèi)容。它與存儲(chǔ)過程類似,可用于操作數(shù)據(jù)或進(jìn)行與數(shù)據(jù)有關(guān)的工作,不同的是,使用程序集,更多地是為了程序邏輯(
5、正如在.NET程序中見到的那樣)。程序集不僅可以是存儲(chǔ)過程的替代物,還能有許多不同的外觀,例如,能夠使用程序集創(chuàng)建數(shù)據(jù)類型。q 索引:索引可以看成是預(yù)定義的信息列,它告知數(shù)據(jù)庫(kù)數(shù)據(jù)是如何被物理排序和存儲(chǔ)的,SQL Server使用索引(通過把T-SQL查詢所提供的信息與列中的數(shù)據(jù)相匹配)來(lái)快速查找數(shù)據(jù)行。索引由一個(gè)或多個(gè)(在其上定義該索引的表的)列組成,但索引不能跨多個(gè)表來(lái)定義。SQL Server中的索引非常類似于書的索引,使用索引,能夠比一頁(yè)頁(yè)地翻閱更快地找到資料。q 視圖:可以把視圖看作是虛擬表。視圖能夠包含組合自數(shù)個(gè)表的信息,它能給數(shù)據(jù)提供更為用戶友好的界面。視圖還能極大提高應(yīng)用的安全
6、性,當(dāng)然,它也確實(shí)削減了使用存儲(chǔ)過程和直接訪問表的功能。也可以為視圖創(chuàng)建索引,從而加快視圖中數(shù)據(jù)處理的速度。q 函數(shù):函數(shù)與存儲(chǔ)過程相似,只是在處理多行數(shù)據(jù)時(shí),函數(shù)一次只取一行數(shù)據(jù)或者一次只生成一行數(shù)據(jù)。例如,若要?jiǎng)?chuàng)建賬目,就使用存儲(chǔ)過程產(chǎn)生輸出;若要一次一個(gè)地細(xì)查每一筆交易,以計(jì)算出每天的利潤(rùn),則使用函數(shù)。在所有數(shù)據(jù)庫(kù)中都有一組系統(tǒng)表,SQL Server使用這些系統(tǒng)表來(lái)維護(hù)數(shù)據(jù)庫(kù)。系統(tǒng)表中存儲(chǔ)了所有列的信息、所有用戶的信息以及許多其他信息(即元數(shù)據(jù))。不同于以往版本的SQL Server,在SQL Server 2005中,系統(tǒng)表的安全性有了改進(jìn)和增強(qiáng),系統(tǒng)表不再能直接訪問,而只能通過視圖
7、訪問。由于系統(tǒng)表中的數(shù)據(jù)不能修改,并且系統(tǒng)表提供的信息只在使用高級(jí)功能時(shí)才有用,因此,沒有必要在這里研究系統(tǒng)表。3.2 SQL Server中的數(shù)據(jù)庫(kù)當(dāng)首次安裝完SQL Server后,已經(jīng)有幾個(gè)數(shù)據(jù)庫(kù)安裝并顯示出來(lái)了。本節(jié)將一一講述這些數(shù)據(jù)庫(kù),以便讀者了解每一個(gè)數(shù)據(jù)庫(kù)的功用,這樣當(dāng)在本書之外碰到這些數(shù)據(jù)庫(kù)時(shí)就不致困擾。首先講述SQL Server中最重要的數(shù)據(jù)庫(kù),即master數(shù)據(jù)庫(kù),然后講述tempdb、model、msdb以及AdventureWorks/AdventureWorksDW數(shù)據(jù)庫(kù)。3.2.1 master由于master數(shù)據(jù)庫(kù)是SQL Server中最重要的數(shù)據(jù)庫(kù),因此在開
8、始講述它前必須先做警告:任何對(duì)master數(shù)據(jù)庫(kù)的直接改動(dòng)行為,請(qǐng)自行負(fù)責(zé)!深入探究該數(shù)據(jù)庫(kù)中的任何系統(tǒng)視圖,或者直接修改該數(shù)據(jù)庫(kù)的記錄信息或列信息都是不明智的??梢酝ㄟ^系統(tǒng)函數(shù)以有條不紊的方式對(duì)這些數(shù)據(jù)進(jìn)行建設(shè)性的修改,這是唯一應(yīng)該用來(lái)修改master數(shù)據(jù)庫(kù)的方法。master數(shù)據(jù)庫(kù)位于SQL Server的核心,如果該數(shù)據(jù)庫(kù)被損壞,SQL Server將無(wú)法正常工作。master數(shù)據(jù)庫(kù)中包含如下重要信息:q 所有的登錄名或用戶ID所屬的角色。q 所有的系統(tǒng)配置設(shè)置(例如,數(shù)據(jù)排序信息、安全實(shí)現(xiàn)、默認(rèn)語(yǔ)言)。q 服務(wù)器中的數(shù)據(jù)庫(kù)的名稱及相關(guān)信息。q 數(shù)據(jù)庫(kù)的位置。q SQL Server如何
9、初始化。q 用于存儲(chǔ)下列信息的特殊的系統(tǒng)表(下列信息并非詳盡無(wú)遺):n 如何使用緩存?n 哪些字符集可用?n 可用語(yǔ)言列表。n 系統(tǒng)錯(cuò)誤和警告消息。n 程序集,一種特殊的SQL Server對(duì)象(所有數(shù)據(jù)庫(kù)中的處理SQL Server對(duì)象的表不為master數(shù)據(jù)庫(kù)所專有)。master數(shù)據(jù)庫(kù)是SQL Server安全衛(wèi)士,它使用上述信息來(lái)確保所有的事都在掌控之中。注解 定期備份master數(shù)據(jù)庫(kù)非常重要。確保備份master數(shù)據(jù)庫(kù)是備份策略的一部分。關(guān)于備份,將在第7章詳細(xì)講述。3.2.2 tempdbtempdb數(shù)據(jù)庫(kù),正如它的名字所暗示的那樣,是一個(gè)臨時(shí)性的數(shù)據(jù)庫(kù),它存在于SQL Serv
10、er會(huì)話期間,一旦SQL Server關(guān)閉,tempdb數(shù)據(jù)庫(kù)將丟失。當(dāng)SQL Server重新啟動(dòng)時(shí),將重建全新的、空的tempdb數(shù)據(jù)庫(kù),以供使用。關(guān)于該過程,還有更多可講述的內(nèi)容,但是,在深入探討這些之前,還是先來(lái)了解tempdb數(shù)據(jù)庫(kù)的用途是什么。眾所周知,數(shù)據(jù)庫(kù)能夠存儲(chǔ)數(shù)據(jù),而數(shù)據(jù)可以存儲(chǔ)在多個(gè)表中,使用命令和函數(shù)來(lái)檢索和操作這些數(shù)據(jù)。然而,有時(shí)可能想把某個(gè)數(shù)據(jù)集臨時(shí)存儲(chǔ)起來(lái),以便稍后進(jìn)行處理例如,當(dāng)要把得自一個(gè)存儲(chǔ)過程的數(shù)據(jù)傳遞給在該存儲(chǔ)過程之后運(yùn)行的另一個(gè)存儲(chǔ)過程時(shí),一個(gè)選擇就是把那些數(shù)據(jù)存儲(chǔ)在tempdb數(shù)據(jù)庫(kù)中。在存儲(chǔ)過程或查詢中創(chuàng)建的所有臨時(shí)表都將被放置在tempdb數(shù)據(jù)庫(kù)
11、中。只要tempdb數(shù)據(jù)庫(kù)沒被更新,一切將稱心如意;一旦重建了tempdb數(shù)據(jù)庫(kù),那么存放于其中的數(shù)據(jù)將丟失,需要重生成數(shù)據(jù)?;蛟S,你會(huì)認(rèn)為這并非一個(gè)理想的解決方案,畢竟,如果能把臨時(shí)信息存儲(chǔ)在該數(shù)據(jù)庫(kù)之外的某處,不是很完美嗎?其實(shí),tempdb不是這樣用的,關(guān)于tempdb,實(shí)際上只應(yīng)把它看作是過渡的存儲(chǔ)空間。重建tempdb的另一個(gè)原因是:不僅開發(fā)者要使用該數(shù)據(jù)庫(kù),SQL Server自己也要使用tempdb。實(shí)際上,SQL Server始終在使用tempdb,當(dāng)重新初始化SQL Server時(shí),它需要確認(rèn)原先正在處理的任何臨時(shí)性工作都已經(jīng)清除掉。畢竟,很可能是由于臨時(shí)性工作的問題導(dǎo)致服務(wù)
12、的重啟。正像其他數(shù)據(jù)庫(kù)一樣,tempdb也有大小的限制,必須確保該數(shù)據(jù)庫(kù)的大小對(duì)于當(dāng)前的應(yīng)用以及所有要存儲(chǔ)于其中的臨時(shí)信息是足夠的。閱讀隨后的章節(jié),將看到數(shù)據(jù)庫(kù)的大小有最小值和最大值。tempdb也不例外,應(yīng)該確保該數(shù)據(jù)庫(kù)大小可以擴(kuò)展,這樣當(dāng)需要時(shí)就可以增加其大小。注意 因?yàn)閠empdb的大小是有限的,所以在使用它時(shí)必須當(dāng)心,不要讓tempdb被來(lái)自不好的存儲(chǔ)過程(對(duì)于創(chuàng)建有太多記錄的表沒有明確限制)的表中的記錄所填滿。如果發(fā)生了這種情況,不僅當(dāng)前的處理不能繼續(xù),整個(gè)服務(wù)器都可能無(wú)法工作,從而將影響到在該服務(wù)器上的所有用戶。第一段中提過,關(guān)于tempdb的更新過程還有更多可講述的內(nèi)容,這將在下
13、一節(jié)中進(jìn)行闡述。3.2.3 model創(chuàng)建數(shù)據(jù)庫(kù)時(shí)(很快就要在本章的學(xué)習(xí)中創(chuàng)建數(shù)據(jù)庫(kù)),總是以一套預(yù)定義的標(biāo)準(zhǔn)為模型。例如,若希望所有的數(shù)據(jù)庫(kù)都有確定的初始大小,或者都有特定的信息集,那么可以把這些信息放在model數(shù)據(jù)庫(kù)中,以model數(shù)據(jù)庫(kù)作為其他數(shù)據(jù)庫(kù)的模板數(shù)據(jù)庫(kù)。如果想要使所有的數(shù)據(jù)庫(kù)都有一個(gè)特定的表,可以把該表放在model數(shù)據(jù)庫(kù)里。model數(shù)據(jù)庫(kù)是tempdb數(shù)據(jù)庫(kù)的基礎(chǔ)。對(duì)model數(shù)據(jù)庫(kù)的任何改動(dòng)都將反映在tempdb數(shù)據(jù)庫(kù)中,所以,在決定對(duì)model數(shù)據(jù)庫(kù)有所改變時(shí),必須預(yù)先考慮好并多加些小心。3.2.4 msdbmsdb給SQL Server代理提供必要的信息來(lái)運(yùn)行作業(yè),
14、因而,它是SQL Server中另一個(gè)十分重要的數(shù)據(jù)庫(kù)。SQL Server代理是SQL Server中的一個(gè)Windows服務(wù),用以運(yùn)行任何已創(chuàng)建的計(jì)劃作業(yè)(例如包含備份處理的作業(yè))。作業(yè)是SQL Server中定義的自動(dòng)運(yùn)行的一系列操作,它不需要任何手工干預(yù)來(lái)啟動(dòng)。既然有了tempdb及model數(shù)據(jù)庫(kù),就不應(yīng)該直接調(diào)整msdb數(shù)據(jù)庫(kù),也的確無(wú)此必要。許多進(jìn)程使用msdb。例如,當(dāng)創(chuàng)建備份或執(zhí)行還原時(shí),將用msdb來(lái)存儲(chǔ)有關(guān)這些任務(wù)的信息。3.2.5 AdventureWorks/AdventureWorks DWAdventureWorks和AdventureWorksDW是SQL Se
15、rver中的示例數(shù)據(jù)庫(kù)(如果在安裝過程中選擇了安裝它們的話)。這些數(shù)據(jù)庫(kù)基于一個(gè)自行車生產(chǎn)公司,以一種簡(jiǎn)單的、易于理解的方式來(lái)展示SQL Server 2005的新功能,如Reporting Services、CLR(公共語(yǔ)言運(yùn)行時(shí))特性以及許多其他特性。下一段文字摘錄自微軟的文檔資料,簡(jiǎn)要地給讀者提供了AdventureWords數(shù)據(jù)庫(kù)相關(guān)背景的概覽:Adventure Works Cycles是AdventureWorks示例數(shù)據(jù)庫(kù)所基于的虛構(gòu)的公司,該公司是一家大型跨國(guó)生產(chǎn)公司。公司生產(chǎn)金屬和復(fù)合材料的自行車,產(chǎn)品銷往北美、歐洲和亞洲市場(chǎng)。公司總部位于華盛頓州的伯瑟爾市,有290名雇員,
16、公司還擁有一些遍及其銷售市場(chǎng)的地區(qū)性銷售團(tuán)隊(duì)。盡管示例數(shù)據(jù)庫(kù)不是為SQL Server新手準(zhǔn)備的,但在學(xué)習(xí)完SQL Server基礎(chǔ)知識(shí)后,使用它們也不會(huì)有困難。認(rèn)識(shí)了SQL Server中的數(shù)據(jù)庫(kù)以后,終于可以開始創(chuàng)建數(shù)據(jù)庫(kù)了!接下來(lái)將從決定要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)的類型入手,數(shù)據(jù)庫(kù)的類型取決于數(shù)據(jù)庫(kù)的用途。3.3 決定數(shù)據(jù)庫(kù)系統(tǒng)類型在能夠設(shè)計(jì)數(shù)據(jù)庫(kù)之前,必須先確定該系統(tǒng)是聯(lián)機(jī)事務(wù)處理(OLTP)系統(tǒng),還是聯(lián)機(jī)分析處理(OLAP)系統(tǒng)。可以在第一次接觸用戶之前、或者在第一次接觸用戶期間找出答案,但對(duì)于OLTP或OLAP的選擇可能在初次提議中已經(jīng)指明。做出決定以前,需要先理解這兩個(gè)關(guān)鍵的系統(tǒng)類型。3.3
17、.1 OLTPOLTP系統(tǒng)提供數(shù)據(jù)的即時(shí)更新。OLTP數(shù)據(jù)庫(kù)系統(tǒng)極有可能有一個(gè)用.NET語(yǔ)言(如Visual Basic .NET(VB.NET)、C#或ASP.NET)編寫的獨(dú)立用戶前端。用戶前端調(diào)用數(shù)據(jù)庫(kù),并且立即更新用戶對(duì)底層數(shù)據(jù)所做的任何改變。對(duì)于OLTP系統(tǒng),需要進(jìn)行許多考慮以確保系統(tǒng)快速而可靠,并能保證數(shù)據(jù)完整性。設(shè)計(jì)OLTP系統(tǒng)時(shí),至關(guān)重要的是:不僅要有正確的數(shù)據(jù)庫(kù)結(jié)構(gòu),還要有正確的物理存放位置。規(guī)范化為第三范式(該術(shù)語(yǔ)的意思將在本章的后面做詳細(xì)講述)的OLTP系統(tǒng)是很常見的,盡管并非每個(gè)案例都是如此。通過規(guī)范化數(shù)據(jù),將有助于達(dá)到OLTP系統(tǒng)的其中一個(gè)主要目的:使數(shù)據(jù)更新盡可能地
18、快。在通過移除冗余或重復(fù)列來(lái)規(guī)范化數(shù)據(jù)時(shí),應(yīng)確保數(shù)據(jù)盡可能地簡(jiǎn)潔。規(guī)范化在許多OLTP系統(tǒng)中是極為重要的。1備份許多OLTP系統(tǒng)是一天24小時(shí)、一周7天永不停歇地在使用。在這樣的系統(tǒng)中,數(shù)據(jù)改動(dòng)極為頻繁,這就意味著備份數(shù)據(jù)庫(kù)是一項(xiàng)必須進(jìn)行的任務(wù)。盡管可以在SQL Server正在使用時(shí)對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份,但最好還是在不使用SQL Server時(shí)或者只有少量的數(shù)據(jù)更新活動(dòng)發(fā)生時(shí)執(zhí)行備份。理想的時(shí)間段也許是在午夜,或者甚至是中斷時(shí)期。當(dāng)決定執(zhí)行備份時(shí),至關(guān)重要的是:要經(jīng)常在OLTP系統(tǒng)中監(jiān)視和檢查備份,以確定系統(tǒng)仍然能如希望的那樣工作。下面這種情形并不鮮見:那些被認(rèn)為能夠在災(zāi)難發(fā)生時(shí)用于還原的有效的
19、備份,事實(shí)上卻是損壞的、不完整的或者可能根本沒有創(chuàng)建的備份。因此,應(yīng)該定期從生產(chǎn)中執(zhí)行備份,并將其重載入安全的開發(fā)場(chǎng)所以確保其有效性。2索引速度對(duì)于一個(gè)成功的OLTP系統(tǒng)十分關(guān)鍵。在OLTP系統(tǒng)中,存在比OLAP系統(tǒng)數(shù)量更多的索引,索引不僅有助于使一個(gè)表中的數(shù)據(jù)與另一個(gè)表相關(guān)聯(lián),而且借助索引能夠在表中快速訪問到數(shù)據(jù)行。注解 第6章將講述如何創(chuàng)建索引、索引如何工作以及如何在解決方案中運(yùn)用索引。3.3.2 OLAP當(dāng)考慮OLTP系統(tǒng)時(shí),必須緊記對(duì)數(shù)據(jù)庫(kù)的更新隨時(shí)可能發(fā)生,而且,更新必定是即時(shí)反映在數(shù)據(jù)庫(kù)中的。此外,另一個(gè)要點(diǎn)是:在這樣的系統(tǒng)中,許多更新會(huì)同時(shí)發(fā)生,此時(shí)并不會(huì)對(duì)任何數(shù)據(jù)有所損害。OL
20、AP系統(tǒng)的設(shè)計(jì)基于如下前提,即數(shù)據(jù)保持相對(duì)靜止、沒有頻繁發(fā)生的更新。這些更新可能發(fā)生在每晚、每周、每月或者任何其他時(shí)間,只要更新不像在OLTP系統(tǒng)中那樣頻繁發(fā)生即可。正如其名字“聯(lián)機(jī)分析處理”所暗示的那樣,在OLAP系統(tǒng)中,大量的處理涉及對(duì)現(xiàn)有數(shù)據(jù)的分析。OLAP系統(tǒng)中的數(shù)據(jù)只應(yīng)有極少的更新,或者完全沒有更新表面上看,只有當(dāng)在分析中發(fā)現(xiàn)數(shù)據(jù)錯(cuò)誤時(shí),或者如前面提及的那樣,當(dāng)有更多的數(shù)據(jù)要用于分析時(shí),才進(jìn)行更新。數(shù)據(jù)備份多半只在對(duì)數(shù)據(jù)庫(kù)有所改動(dòng)時(shí),作為“最終操作”執(zhí)行。在OLAP系統(tǒng)中,沒有必要定期進(jìn)行備份。設(shè)計(jì)用作OLAP的系統(tǒng)有時(shí)不遵循任何設(shè)計(jì)標(biāo)準(zhǔn)或規(guī)范化規(guī)則,并且大多數(shù)確實(shí)只擁有比OLTP系
21、統(tǒng)數(shù)量更少的索引。在OLAP系統(tǒng)中往往不存在規(guī)范化,因?yàn)槿舨槐貜囊?guī)范化的表中提取數(shù)據(jù),將更容易獲取數(shù)據(jù)并對(duì)數(shù)據(jù)切片和切塊。由于在OLAP系統(tǒng)中只有極少的或者幾乎沒有更新,因此不必考慮事務(wù)的執(zhí)行及事務(wù)的緊湊性。大多數(shù)OLAP系統(tǒng)中不存在規(guī)范化。在OLAP系統(tǒng)中發(fā)現(xiàn)一兩個(gè)大型的平面表(而不是幾個(gè)關(guān)聯(lián)在一起的表)是很尋常的,因此,只會(huì)有較少的關(guān)系,也將只有較少的索引。注解 OLAP系統(tǒng)也稱數(shù)據(jù)倉(cāng)庫(kù),盡管在整個(gè)OLAP系統(tǒng)設(shè)計(jì)中,數(shù)據(jù)倉(cāng)庫(kù)只是其中的一部分。簡(jiǎn)言之,數(shù)據(jù)倉(cāng)庫(kù)存放OLAP系統(tǒng)中要使用的數(shù)據(jù)。3.3.3 示例系統(tǒng)類型選擇那么,綜合考慮上一節(jié)中給出的所有信息,不難發(fā)現(xiàn),盡管在示例系統(tǒng)中數(shù)據(jù)更新
22、相對(duì)不頻繁(換句話說(shuō),只有當(dāng)發(fā)生金融事務(wù)或產(chǎn)生賬目時(shí)才會(huì)有更新),但系統(tǒng)中確實(shí)存在聯(lián)機(jī)更新,并產(chǎn)生即時(shí)效果。因此,本書中的示例系統(tǒng)將是一個(gè)OLTP系統(tǒng)。3.4 收集數(shù)據(jù)在創(chuàng)建數(shù)據(jù)庫(kù)前,首先應(yīng)該做的事情之一是,找出數(shù)據(jù)庫(kù)系統(tǒng)中必須要保存的信息是什么以及應(yīng)當(dāng)怎樣保存那些信息(例如,用數(shù)字或文本的形式保存、信息的長(zhǎng)度等等)。要完成這一任務(wù),需要進(jìn)行數(shù)據(jù)收集,數(shù)據(jù)收集可能涉及:與作為系統(tǒng)所有者的人士進(jìn)行交談,以及與要使用系統(tǒng)的用戶進(jìn)行交談。對(duì)于比較大的系統(tǒng),可能需要數(shù)次會(huì)議,每一次的會(huì)議針對(duì)系統(tǒng)的一部分進(jìn)行討論和研究。即便如此,對(duì)于每一部分,可能還要花費(fèi)數(shù)次會(huì)議反復(fù)討論。此外,還可以安排面談、分發(fā)調(diào)查
23、表,或者甚至只是觀察所有活動(dòng)著的現(xiàn)有過程,所做這一切,都是為了盡可能多地收集關(guān)于數(shù)據(jù)庫(kù)以及將要如何使用數(shù)據(jù)庫(kù)的信息。一個(gè)數(shù)據(jù)庫(kù)解決方案是否成功,其關(guān)鍵主要不在創(chuàng)建系統(tǒng),而是在收集信息的過程中、在真正寫下第一行代碼之前。如果取用了錯(cuò)誤的信息,或者遺漏了可能對(duì)最終解決方案至關(guān)重要的元素,那么此時(shí)這個(gè)系統(tǒng)已經(jīng)有了缺陷。使盡可能多的用戶介入到早期的階段,并接著使他們參與到設(shè)計(jì)進(jìn)程中,將極大減少錯(cuò)誤的發(fā)生以及最終產(chǎn)品的部件的遺漏。對(duì)于本書中的示例金融程序,首先想要與之交談的是將要顯示的數(shù)據(jù)的所有者。這些人是銀行中處理支票、現(xiàn)金提取、信用卡交易等業(yè)務(wù)的工作人員,以及那些處理股票份額買賣、單位信托、人壽保險(xiǎn)
24、單等業(yè)務(wù)的人員。這些人了解要給哪一位客戶發(fā)送什么文件或賬目清單,以及這些賬目清單中要包含什么信息。此外,這些人對(duì)于客戶想要如何核對(duì)這些賬目清單多半有不錯(cuò)的想法,并且他們清楚什么數(shù)據(jù)允許下載并插入到SQL Server數(shù)據(jù)庫(kù)中。在第一次會(huì)議中,將研究所有的文檔,以明確要在當(dāng)前系統(tǒng)中存儲(chǔ)什么信息。會(huì)議中會(huì)認(rèn)識(shí)到,當(dāng)前的系統(tǒng)要發(fā)送不同的賬目清單:一份是客戶活期存款賬戶的賬目清單,其余的是客戶所擁有的每一種金融產(chǎn)品的獨(dú)立賬目清單。當(dāng)研究賬目清單時(shí),將注重每一種賬目清單所包含的信息,需要捕獲這些信息以產(chǎn)生類似的賬目清單。這可能不僅是與客戶相關(guān)的信息,也是監(jiān)管的賬目信息。有了源自手中所有文檔資料的信息后,
25、就可以開始討論什么信息是系統(tǒng)所必需的。顯然,在這些會(huì)議中將討論大量的信息,其中一些是有用的,而一些則沒有用處。確保討論是以在場(chǎng)人士提出建議的順序進(jìn)行記錄的,而不是以“合乎邏輯”的順序記錄的。這樣可以模擬會(huì)議,在這里,人們將“回憶”起必須滿足的項(xiàng)目;在這里,一個(gè)觀點(diǎn)的提出可能使某人想到其他要點(diǎn)。從最初的討論中,記錄如下的要點(diǎn):(1) 該軟件必須能處理多個(gè)金融產(chǎn)品。主要的產(chǎn)品是活期存款賬戶(銀行或個(gè)人用戶用以保存業(yè)務(wù)詳情)。該系統(tǒng)也必須能管理附帶產(chǎn)品(如貸款、人壽保險(xiǎn)單、汽車保險(xiǎn)單),并且,系統(tǒng)還應(yīng)能記錄股市上的所有股票交易情況。(2) 每月或在客戶提出請(qǐng)求的任何時(shí)候,產(chǎn)生賬目清單。如果客戶曾在當(dāng)
26、月內(nèi)請(qǐng)求賬目清單,仍將產(chǎn)生一份那個(gè)月的賬目清單。(3) 每天,在有存款的賬戶上增加利息,從透支的賬戶中扣除利息。(4) 客戶可以以系統(tǒng)獨(dú)立版的形式擁有年度保險(xiǎn)費(fèi)、月保險(xiǎn)費(fèi)或一次收付清保險(xiǎn)費(fèi)的產(chǎn)品。需要知道何時(shí)開始收款以及何時(shí)停止收款,也需要確定要為哪一個(gè)產(chǎn)品發(fā)出提醒(例如,一份給客戶的通知,告知客戶他的汽車保險(xiǎn)單需要續(xù)約)。(5) 如果某一項(xiàng)產(chǎn)品的托收失敗了,系統(tǒng)必須進(jìn)行具結(jié),使得下次收款時(shí),能征收到該筆款項(xiàng)。(6) 每一項(xiàng)產(chǎn)品有自己的賬目清單,但只有銀行業(yè)務(wù)賬目清單是可以請(qǐng)求產(chǎn)生的。(7) 由于允許進(jìn)行股票份額的交易,因此系統(tǒng)必須在任何時(shí)間記錄和顯示客戶特有股票的現(xiàn)值。注意上述列表中的信息完
27、全沒有固定的順序,因?yàn)樾畔⑼褪沁@樣顯露出來(lái)的。還要注意,第(2)點(diǎn)和第(6)點(diǎn),多少有一些信息上的重復(fù);如果沒有認(rèn)識(shí)和理解到這一點(diǎn),可能將引發(fā)問題。注解 這里對(duì)示例數(shù)據(jù)庫(kù)只執(zhí)行了數(shù)據(jù)收集任務(wù)。在這里所收集到的信息應(yīng)該在稍后的設(shè)計(jì)階段與用戶進(jìn)行反復(fù)查對(duì),不過這已超出了本書的講述范圍。3.5 決定要存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息現(xiàn)在將使用前一節(jié)中記錄下的要點(diǎn),試著找出每一個(gè)要點(diǎn)關(guān)注的所有領(lǐng)域。通過觀察這一系列需要記錄信息并把信息存儲(chǔ)到數(shù)據(jù)庫(kù)中的領(lǐng)域,很明顯會(huì)發(fā)現(xiàn),需要把它們以某種方式進(jìn)行排序歸類。目前,仍然是以邏輯的視點(diǎn)來(lái)觀察解決方案,尚不準(zhǔn)備開始創(chuàng)建數(shù)據(jù)庫(kù)中的任何事物。3.7.1 使用鍵在數(shù)據(jù)庫(kù)的表中
28、,鍵是標(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è)列上。接下來(lái)的部分介紹可以在數(shù)據(jù)庫(kù)中使用的三種類型的鍵:主鍵、外鍵/引用鍵以及候選鍵/備用鍵。另外,還將介紹一種可以用來(lái)替代主鍵的SQL Server方法,稱為約束。1主鍵主鍵或許是最重要的鍵的類型。首要地(也是最重要地),要在其上定義主鍵的列必須只包含唯一的值。
29、主鍵不能定義在不返回任何行的列(或列的序列)上。為此,不可能在任何允許NULL值的列上定義主鍵。關(guān)于主鍵的另一個(gè)限制是,一個(gè)表只能有一個(gè)主鍵??梢岳弥麈I把一個(gè)表中的數(shù)據(jù)與另一個(gè)表中的數(shù)據(jù)相關(guān)聯(lián)。例如,在本書的示例數(shù)據(jù)庫(kù)中,有兩個(gè)表:一個(gè)表存儲(chǔ)客戶,另一個(gè)表存儲(chǔ)客戶的銀行交易。在客戶表的客戶ID(每當(dāng)加入新客戶記錄時(shí),將產(chǎn)生一個(gè)唯一的客戶ID)上定義了主鍵。那么主鍵將用來(lái)關(guān)聯(lián)銀行交易表中的多個(gè)記錄,為客戶ID返回其所有的銀行交易。這兩個(gè)表之間的鏈接是客戶ID(正如前面所述,它被定義為客戶表的主鍵)。稍后,將看到如何把表聯(lián)接到一起并在它們之間定義關(guān)系。聯(lián)接和關(guān)系在本質(zhì)上指的是同一件事,即:可以在
30、兩個(gè)(或多個(gè))表之間通過特定的列(或列的集合)定義的邏輯鏈接。2外鍵/引用鍵以一種關(guān)系把兩個(gè)(或多個(gè))表鏈接到一起,這種情形時(shí)有發(fā)生。正如上一部分中的例子所示范的那樣,在客戶表和交易表之間建立鏈接的是客戶ID列。該列在客戶表中返回唯一的行,因此定義為主鍵。然而,在交易表中必須要有相應(yīng)的外鍵(或引用鍵),以鏈接回客戶表的客戶ID列。當(dāng)要在本書的示例數(shù)據(jù)庫(kù)中創(chuàng)建關(guān)系時(shí),將看到為何創(chuàng)建外鍵將在兩個(gè)列之間創(chuàng)建一種鏈接(或關(guān)系)。這種鏈接是通過約束創(chuàng)建的,約束是SQL Server使用的一種方法,用來(lái)檢查建立在關(guān)系中的細(xì)節(jié)。從外鍵的觀點(diǎn)來(lái)看,約束(或檢查)將確保關(guān)系遵循為之設(shè)置的條件。在后面 “更多關(guān)于
31、外鍵”一節(jié)中,會(huì)更深入地探討外鍵。3候選鍵/備用鍵前面講過,一個(gè)表只能有一個(gè)主鍵。然而,可能會(huì)有另外的鍵也能輕而易舉地定義為主鍵,這樣的鍵是成為主鍵的候選,稱為候選鍵。從根本上來(lái)說(shuō),在候選鍵和主鍵的定義之間沒有必然的區(qū)別。例如,如果有一個(gè)表,用來(lái)存儲(chǔ)通用(GM)汽車的備件,當(dāng)在總店為各GM分店訂購(gòu)零件時(shí),可能會(huì)有一個(gè)內(nèi)部的GM零件號(hào)供使用。該零件號(hào)將是唯一的,適于用作主鍵。另一方面,每一個(gè)制造廠商也會(huì)為其零件創(chuàng)建(對(duì)他們而言)唯一的零件號(hào)。如果數(shù)據(jù)庫(kù)中包含制造廠商標(biāo)識(shí)符,那么由制造廠商賦予的零件號(hào)也能用作主鍵。由于一個(gè)表中不能有兩個(gè)主鍵,而且已經(jīng)選擇了GM零件號(hào)作為主鍵,從而可以把制造廠商標(biāo)識(shí)
32、符和制造廠商零件號(hào)創(chuàng)建為候選鍵。4替代主鍵的唯一約束通過定義這種約束,將確保唯一值只能輸入到在約束中定義的一個(gè)或幾個(gè)列中。盡管這似乎很像前面講過的主鍵定義,但二者是不同的。唯一約束不是主鍵,但在唯一約束中定義的一個(gè)或幾個(gè)列也可能成為主鍵。此外,唯一約束能夠包含NULL值,但主鍵不能。不過,由于NULL被視為與列中任何其他值一樣,因此,當(dāng)準(zhǔn)備插入或更新數(shù)據(jù)時(shí),必須使構(gòu)成唯一約束的列保持唯一,從而只允許有一個(gè) NULL值。最后,一個(gè)表可以有多個(gè)唯一約束,但只能有一個(gè)主鍵。3.7.2 創(chuàng)建關(guān)系在SQL Server數(shù)據(jù)庫(kù)中,關(guān)系是兩個(gè)表之間的邏輯鏈接。雖然,在后面將看到,設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),會(huì)在兩個(gè)表之間
33、畫出一條物理連線,但表之間是不存在物理鏈接的。表之間有物理鏈接意味著,鏈接兩個(gè)表的真實(shí)數(shù)據(jù)將只在某個(gè)中間位置存儲(chǔ)一次,而鏈接兩個(gè)表的鍵的信息要存儲(chǔ)多于一次,然而事實(shí)并非如此。當(dāng)定義邏輯關(guān)系時(shí),是在告訴SQL Server:將要把來(lái)自主表的主鍵與另一個(gè)表的外鍵鏈接起來(lái)。如此一來(lái),這就需要有兩個(gè)鍵,每個(gè)表一個(gè)。接下來(lái)的部分,將從觀察關(guān)系如何對(duì)引用完整性概念起作用開始,詳細(xì)地講述關(guān)系,1關(guān)系和引用完整性可以用關(guān)系來(lái)強(qiáng)制數(shù)據(jù)完整性。換句話說(shuō),如果由于數(shù)據(jù)在某個(gè)表中而希望另一個(gè)表中也有這樣的數(shù)據(jù),就可以在這兩個(gè)表之間放置一種關(guān)系,以確保沒有任何SQL命令破壞這種規(guī)則。不過,不要把引用完整性與維護(hù)數(shù)據(jù)完整
34、性的其他過程(例如,在列上放置檢查或默認(rèn)值以保證某個(gè)特定列的值是有效的)混淆了。引用完整性圍繞如下要旨:數(shù)據(jù)庫(kù)中,有兩個(gè)表包含相同的信息,要求兩個(gè)表中重復(fù)的數(shù)據(jù)元素保持一致性。例如,如果一個(gè)表中有一個(gè)主鍵,另一個(gè)表中有一個(gè)外鍵,主鍵和外鍵的數(shù)據(jù)是完全匹配的,那么,重要的是要保證這兩部分?jǐn)?shù)據(jù)要么一起改變,要么根本不發(fā)生改變。要強(qiáng)制引用完整性,并非只有關(guān)系一種方法,也可以使用觸發(fā)器來(lái)確保數(shù)據(jù)有效(這將在第13章中進(jìn)一步討論)。舉例來(lái)說(shuō),本書的示例銀行系統(tǒng)中包含客戶表和交易表。如果某客戶在客戶表中沒有記錄,則不能記錄該客戶的交易。結(jié)果,必須使用引用完整性來(lái)強(qiáng)制這兩個(gè)表之間的數(shù)據(jù)完整性,因此,當(dāng)某客戶
35、的交易記錄還存在時(shí),不能從數(shù)據(jù)庫(kù)中刪除其客戶記錄。同樣,如果某客戶沒有交易記錄存在,則允許移除其客戶記錄。強(qiáng)制引用完整性的另一個(gè)結(jié)果是,如果某個(gè)客戶引用號(hào)在客戶表中不存在,則無(wú)法輸入具有該客戶引用號(hào)的交易記錄。若要在這種情形下輸入客戶交易記錄,必須先在客戶表中創(chuàng)建客戶記錄,然后才能完成交易記錄的輸入。最后,當(dāng)與某客戶記錄相關(guān)的客戶交易記錄存在時(shí),如果要修改客戶記錄中的客戶引用號(hào),必須先在客戶交易記錄中作修改,并檢查所修改的客戶交易記錄的引用已經(jīng)存在,然后才能在客戶記錄中修改客戶引用號(hào)。因此,要想維護(hù)數(shù)據(jù)的完整性,有許多規(guī)則要遵循。如果確實(shí)希望如此,就使用引用完整性來(lái)強(qiáng)制數(shù)據(jù)的完整性。不過,與此
36、相對(duì)的另一種做法是,不使用引用完整性來(lái)強(qiáng)制數(shù)據(jù)完整性,而是通過創(chuàng)建存儲(chǔ)過程或觸發(fā)器(SQL Server中某種類型的程序)來(lái)實(shí)現(xiàn)這一任務(wù)。相關(guān)的主題將在第10章和第13章中講述。使用存儲(chǔ)過程和觸發(fā)器來(lái)維護(hù)數(shù)據(jù)完整性是可行的,但不是令人滿意的解決方案,因?yàn)檫@會(huì)使系統(tǒng)暴露在不能保持?jǐn)?shù)據(jù)完整性的場(chǎng)合(可能由于系統(tǒng)設(shè)計(jì)中的漏洞,也可能由于開發(fā)者沒有用正確的處理順序來(lái)確保所有數(shù)據(jù)總是有效的)。不僅如此,如果有人直接向表中加入數(shù)據(jù),引用完整性將會(huì)喪失。當(dāng)然,在應(yīng)用程序中進(jìn)行數(shù)據(jù)完整性檢查確實(shí)能減少網(wǎng)絡(luò)流量,因?yàn)樗械尿?yàn)證都是在前端進(jìn)行的。在討論數(shù)據(jù)庫(kù)關(guān)系類型之前,關(guān)于引用完整性,還有一個(gè)要點(diǎn)需要說(shuō)明:如果
37、想要通過在兩個(gè)表之間創(chuàng)建關(guān)系來(lái)維護(hù)引用完整性,這兩個(gè)表必須在同一個(gè)數(shù)據(jù)庫(kù)中。在兩個(gè)數(shù)據(jù)庫(kù)間不可能存在引用完整性。2關(guān)系類型在數(shù)據(jù)庫(kù)中,主要存在如下三種關(guān)系類型:q 一對(duì)一關(guān)系。q 一對(duì)多關(guān)系。q 多對(duì)多關(guān)系。接下來(lái)將分別講述每一種關(guān)系類型,這樣,當(dāng)需要?jiǎng)?chuàng)建關(guān)系時(shí),就知道應(yīng)該創(chuàng)建哪一種關(guān)系,該在何時(shí)創(chuàng)建以及為何要?jiǎng)?chuàng)建。下面先從一對(duì)一關(guān)系開始講述,雖然這種關(guān)系最不常用,但它可能是最易于理解的一種關(guān)系。3一對(duì)一關(guān)系這種關(guān)系在實(shí)際運(yùn)行的數(shù)據(jù)庫(kù)中比較罕見。一般來(lái)說(shuō),沒有什么真正的理由來(lái)讓一個(gè)表中的一條記錄只與另一個(gè)表中的一條記錄相匹配。這種情形只會(huì)發(fā)生在:例如,當(dāng)要把一個(gè)非常大的表拆分成兩個(gè)單獨(dú)的表時(shí)。
38、為了說(shuō)明一對(duì)一關(guān)系,假設(shè)本書的示例銀行數(shù)據(jù)庫(kù)中有一個(gè)為ATM卡存儲(chǔ)PIN號(hào)碼的表,該表與客戶記錄中的其余部分完全分開(如圖3-1所示)。多數(shù)情況下,一個(gè)客戶記錄有一個(gè)PIN號(hào)碼記錄,不過也可能有例外如高利息存款賬戶可能沒有ATM卡,因此也就沒有相關(guān)聯(lián)的PIN號(hào)碼記錄。圖3-1 一對(duì)一關(guān)系4一對(duì)多關(guān)系一對(duì)多關(guān)系可能是數(shù)據(jù)庫(kù)中最常見到的一種關(guān)系。這就是一條主記錄與子表中0條、1條或多條記錄相關(guān)聯(lián)的情形。以示例銀行數(shù)據(jù)庫(kù)為例,假設(shè)有一條客戶主記錄以及任意數(shù)目的關(guān)聯(lián)交易記錄。這些關(guān)聯(lián)交易記錄的數(shù)量可以從0條(對(duì)應(yīng)于客戶是銀行新客戶的情形,此時(shí)尚未進(jìn)行存款或執(zhí)行交易)到1條或者多條(對(duì)應(yīng)于賬戶中已有初始
39、存款的情形,此后該賬戶又發(fā)生了更多的存款或取款交易),如圖3-2所示。圖3-2 一對(duì)多關(guān)系當(dāng)在示例數(shù)據(jù)庫(kù)解決方案中建立客戶對(duì)交易關(guān)系時(shí),將再次看到這一概念的運(yùn)用。5多對(duì)多關(guān)系多對(duì)多關(guān)系是最后一種能存在于數(shù)據(jù)庫(kù)中的關(guān)系類型。當(dāng)主表中0條、1條甚至多條記錄與子表中0條、1條或多條記錄有關(guān)時(shí),多對(duì)多關(guān)系會(huì)較頻繁地出現(xiàn)。多對(duì)多關(guān)系的一個(gè)例子是:某公司從好幾個(gè)倉(cāng)庫(kù)進(jìn)行發(fā)貨(視為主表),然后,將貨物發(fā)送到許多商店(視為子表),如圖3-3所示。可以對(duì)倉(cāng)庫(kù)進(jìn)行定位和組織,使得不同的倉(cāng)庫(kù)都能為同一個(gè)商店供貨,并且,倉(cāng)庫(kù)也能分組(如農(nóng)產(chǎn)品、冷凍品、易腐敗品和保稅品)。為了讓商店能得到豐富的貨物補(bǔ)給,需要有許多不同
40、的倉(cāng)庫(kù)對(duì)其供貨(通常是位于不同地點(diǎn)的倉(cāng)庫(kù))。圖3-3 多對(duì)多關(guān)系當(dāng)在數(shù)據(jù)庫(kù)中建立關(guān)系時(shí),必須要有外鍵。在本章的前面曾簡(jiǎn)要地講述過外鍵,下一節(jié)將更深入地探討外鍵3.7.3 更多關(guān)于外鍵外鍵是子表上的鍵,定義在該鍵中的列(一個(gè)或一組)能正好與主表中的列在信息和數(shù)量上完全匹配。使用外鍵,能通過關(guān)系構(gòu)建要返回的數(shù)據(jù)。此外,外鍵并非必須映射到主表的主鍵上。盡管外鍵映射到主鍵上十分常見,但是,當(dāng)主表中被映射的鍵是唯一鍵時(shí),也可以在主表與子表之間建立關(guān)系。外鍵的所有本質(zhì)在于其映射的過程以及它位于子表上這一事實(shí)。僅當(dāng)創(chuàng)建了從子表到父表的關(guān)系以后,外鍵才得以存在。但是,主表和子表到底是什么?為了說(shuō)明,回想一下講
41、述關(guān)系時(shí)的例子。例如,來(lái)看一對(duì)多關(guān)系。主表將在左邊,或者說(shuō)在關(guān)系中的“一”這一邊,而子表將在右邊,也就是關(guān)系中的“多”這一邊(如圖3-4所示)。圖3-4 外鍵關(guān)于外鍵、關(guān)系以及主表和子表,還有最后一點(diǎn)需要說(shuō)明。對(duì)于主表和子表而言,完全有可能二者就是同一個(gè)表,外鍵和唯一鍵也都定義在這同一個(gè)表中。這稱為自聯(lián)接或自反關(guān)系。這種情形是相當(dāng)特殊的,因而在數(shù)據(jù)庫(kù)中往往并不多見,盡管也可以通過這種關(guān)系來(lái)確保一個(gè)列中的數(shù)據(jù)與另一個(gè)列中的數(shù)據(jù)完全匹配,就像在任何其他聯(lián)接中那樣。例如,假設(shè)有一個(gè)圍繞客戶的表,其中有兩列,一列是父客戶ID,保存總公司的ID并用來(lái)鏈接所有的分部。如果把總公司也看作是聯(lián)合企業(yè)的分部,第
42、二個(gè)列是具體的分部ID,可以在這兩列之間放置一個(gè)鏈接,使得當(dāng)總公司作為分部時(shí),該鏈接依然有效(如圖3-5所示)。另一個(gè)例子是:在所有雇員所在的雇員表中,具有一個(gè)從雇員到其經(jīng)理的自聯(lián)接。學(xué)習(xí)完關(guān)系,下面將討論如何規(guī)范化數(shù)據(jù)庫(kù)。圖3-5 位于同一表中的外鍵3.8 規(guī)范化數(shù)據(jù)庫(kù)的規(guī)范化是減少表中數(shù)據(jù)重復(fù)的一種技巧。于是,就能建立通過鍵或索引相互關(guān)聯(lián)的多個(gè)表。大量消除重復(fù)數(shù)據(jù)后將得到更小、更緊湊的數(shù)據(jù)庫(kù)。這樣將減少出現(xiàn)混亂(在存放“相同”數(shù)據(jù)的列中,哪一列的數(shù)據(jù)是正確的?哪一列的數(shù)據(jù)應(yīng)做修改)的幾率,并且,將減少實(shí)時(shí)更新多列數(shù)據(jù)的開銷。注解 只是提醒一下,現(xiàn)在仍然還在建立解決方案的邏輯階段,依然還不準(zhǔn)
43、備在SQL Server中創(chuàng)建數(shù)據(jù)庫(kù)。規(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)行得更快,從而改善性能。盡管通過規(guī)范化將產(chǎn)生高效的數(shù)據(jù)庫(kù),但是,也可能會(huì)由于創(chuàng)建了太多的關(guān)系和太多狹小的表,導(dǎo)致過分規(guī)范化數(shù)據(jù),以致檢索一條信息需要訪問許多的表并在這些表之間產(chǎn)生許多聯(lián)接。高明的設(shè)計(jì)者知道何時(shí)該停止規(guī)范化,不會(huì)走得太遠(yuǎn),例如產(chǎn)生太多的關(guān)系。這些知識(shí)主要源自經(jīng)驗(yàn)和實(shí)踐,但在示例數(shù)據(jù)庫(kù)中,讀者將學(xué)會(huì)該在哪里“停止”。提示 當(dāng)任何參考表返回一個(gè)數(shù)據(jù)行,沒有更多的表查閱檢索那條信息,這就是應(yīng)
44、該停止規(guī)范化的信號(hào)。本章的這一節(jié),將以稱為邏輯建模的方法對(duì)示例數(shù)據(jù)庫(kù)建模。建立邏輯模型的目的是顯示應(yīng)用程序?yàn)闈M足商業(yè)需求而必須存儲(chǔ)的數(shù)據(jù)。它展示數(shù)據(jù)如何相互關(guān)聯(lián),并探究在項(xiàng)目開發(fā)領(lǐng)域之外的商業(yè)領(lǐng)域中的任何整體需求。在創(chuàng)建邏輯模型時(shí),無(wú)需考慮任何特定的計(jì)算機(jī)環(huán)境,因此沒有為性能、數(shù)據(jù)存儲(chǔ)等進(jìn)行優(yōu)化。在邏輯模型中,術(shù)語(yǔ)實(shí)體用于表示表的一種概念形式。鑒于目前仍然在數(shù)據(jù)庫(kù)設(shè)計(jì)的邏輯建模階段,因此,在討論中將使用“實(shí)體”而不是“表”,因?yàn)閷?shí)體對(duì)于實(shí)現(xiàn)的依賴較少。同樣,在邏輯建模中,把數(shù)據(jù)列稱為屬性。為了建造示例數(shù)據(jù)庫(kù)的邏輯模型,將匯總本章之前的所有信息,并在實(shí)體中實(shí)現(xiàn)屬性。這樣一來(lái),將明白需要如何修改設(shè)
45、計(jì)。剩下的問題是:實(shí)體中應(yīng)該包含什么?下面的三個(gè)原則決定著實(shí)體的內(nèi)容:q 每一個(gè)實(shí)體應(yīng)該有一個(gè)唯一的標(biāo)識(shí)符。q 只存儲(chǔ)與實(shí)體直接有關(guān)的信息。q 避免重復(fù)值或重復(fù)列。在后面的小節(jié)中,將更詳細(xì)地講述以上每一個(gè)原則。3.8.1 每一個(gè)實(shí)體應(yīng)該有唯一的標(biāo)識(shí)符在每一個(gè)實(shí)體中必須能找到唯一的行??梢酝ㄟ^使用唯一標(biāo)識(shí)屬性(或幾個(gè)屬性的組合)來(lái)實(shí)現(xiàn)這一目標(biāo)。然而,無(wú)論使用什么方法,在唯一標(biāo)識(shí)屬性(組)中,一定不能有兩個(gè)行包含相同的信息??紤]到實(shí)體中可能沒有屬性的組合能夠使行唯一,或者,可能希望從單獨(dú)的屬性中構(gòu)造唯一值,此時(shí)需要有其他的解決方案。SQL Server中有一種特殊的數(shù)據(jù)類型,稱為唯一標(biāo)識(shí)符(uni
46、que identifier)數(shù)據(jù)類型,通過它可以使行唯一;不過,更常用的解決方法是,先創(chuàng)建一個(gè)整數(shù)列,然后把該列設(shè)置為標(biāo)識(shí)(identity)列。關(guān)于這種方法,將在第5章講述構(gòu)建表時(shí)學(xué)習(xí)到更多。3.8.2 只存儲(chǔ)與實(shí)體直接有關(guān)的信息在某些情況下,把非常多的信息放在一個(gè)實(shí)體中可能很容易,因此幾乎改變了這個(gè)特定實(shí)體存在的理由。這樣做的話,將不得不在實(shí)體中插入重復(fù)的信息,這可能會(huì)降低OLTP系統(tǒng)的效率。并且,當(dāng)為一件事情所設(shè)計(jì)的實(shí)體事實(shí)上包含了另一事情的數(shù)據(jù)時(shí),可能會(huì)帶來(lái)混亂。3.8.3 避免重復(fù)值或重復(fù)列當(dāng)一個(gè)屬性包含的信息是同一個(gè)實(shí)體(或相關(guān)實(shí)體)中另一個(gè)屬性的嚴(yán)格副本時(shí),是空間和資源上的浪費(fèi)。但是,往往容易在兩個(gè)(或多個(gè))表中出現(xiàn)重復(fù)屬性或重復(fù)值,因而產(chǎn)生重復(fù)的信息。正是在這種情形下,需要避免重復(fù)值并把重復(fù)值移走。3.8.4 范式現(xiàn)在,已經(jīng)知道應(yīng)該在實(shí)體中包含什么數(shù)據(jù),那么,該如何對(duì)數(shù)據(jù)進(jìn)行規(guī)范化呢?本章要講述如下幾種規(guī)范化形式:q 第一范式(1NF)。q 第二范式(2NF)。q 第三范式(3NF)。雖然還有很多別的、“更高”的規(guī)范形式,但它們?cè)趯W(xué)術(shù)研究之外很少用到,因此本書將不涉及。1第一范式要使數(shù)據(jù)庫(kù)滿足第一范式,就要消除所有重復(fù)信息組。任何重復(fù)的數(shù)據(jù)組
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度專業(yè)自駕旅游包車代駕服務(wù)合同
- 2025年度棚改項(xiàng)目回遷房買賣合同范本
- 2025年桉樹種植基地環(huán)保設(shè)施建設(shè)與運(yùn)營(yíng)合同3篇
- 2025版智能城市基礎(chǔ)設(shè)施建設(shè)招投標(biāo)與合同管理指導(dǎo)文件2篇
- 萬(wàn)科旅游房產(chǎn)買賣合同(2024年專用)3篇
- 二零二五年度專業(yè)配音演員獨(dú)家聘用合同范本4篇
- 二零二五年度太陽(yáng)能熱水系統(tǒng)施工合同規(guī)范文本4篇
- 二零二五年度創(chuàng)業(yè)公司股權(quán)激勵(lì)及期權(quán)授予合同3篇
- 二零二五年度團(tuán)隊(duì)旅游數(shù)據(jù)共享合同
- 2025年度寫字樓退租合同(含辦公家具設(shè)備退還明細(xì))4篇
- 城市微電網(wǎng)建設(shè)實(shí)施方案
- 企業(yè)文化融入中華傳統(tǒng)文化的實(shí)施方案
- 9.1增強(qiáng)安全意識(shí) 教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)上冊(cè)
- 《化工設(shè)備機(jī)械基礎(chǔ)(第8版)》全套教學(xué)課件
- 人教版八年級(jí)數(shù)學(xué)下冊(cè)舉一反三專題17.6勾股定理章末八大題型總結(jié)(培優(yōu)篇)(學(xué)生版+解析)
- 2024屆上海高考語(yǔ)文課內(nèi)古詩(shī)文背誦默寫篇目(精校版)
- DL-T5024-2020電力工程地基處理技術(shù)規(guī)程
- 初中數(shù)學(xué)要背誦記憶知識(shí)點(diǎn)(概念+公式)
- 駕照體檢表完整版本
- 農(nóng)產(chǎn)品農(nóng)藥殘留檢測(cè)及風(fēng)險(xiǎn)評(píng)估
- 農(nóng)村高中思想政治課時(shí)政教育研究的中期報(bào)告
評(píng)論
0/150
提交評(píng)論