第1章關(guān)系數(shù)據(jù)庫設(shè)計(jì)_第1頁
第1章關(guān)系數(shù)據(jù)庫設(shè)計(jì)_第2頁
第1章關(guān)系數(shù)據(jù)庫設(shè)計(jì)_第3頁
第1章關(guān)系數(shù)據(jù)庫設(shè)計(jì)_第4頁
第1章關(guān)系數(shù)據(jù)庫設(shè)計(jì)_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第1章關(guān)系數(shù)據(jù)庫設(shè)計(jì)

SQL語言及采用SQL語言的關(guān)系數(shù)據(jù)庫系統(tǒng)是計(jì)算機(jī)中重要的基礎(chǔ)技術(shù)之一。在使

用任何數(shù)據(jù)庫之前,都必須設(shè)計(jì)好數(shù)據(jù)庫,包括將要存儲的數(shù)據(jù)的類型,數(shù)據(jù)之間的相互

關(guān)系以及數(shù)據(jù)的組織形式.本章將對SQL語言進(jìn)行簡要的介紹,并詳細(xì)地介紹如何進(jìn)行數(shù)

據(jù)庫的設(shè)計(jì)。

本章主要內(nèi)容:

?SQL簡史及功能特性

?關(guān)系數(shù)據(jù)模型

?關(guān)系操作

?數(shù)據(jù)庫設(shè)計(jì)概述

?概念數(shù)據(jù)庫設(shè)計(jì)

?邏輯數(shù)據(jù)庫設(shè)計(jì)

?完整性

?數(shù)據(jù)庫設(shè)計(jì)的其他問題

?回顧數(shù)據(jù)庫設(shè)計(jì)

1.1SQL簡史及功能特性

與其他編程語言類似,SQL語言也有一個從簡單到復(fù)雜的發(fā)展過程。同時,所提供的

功能也逐步強(qiáng)大。本節(jié)中簡單介紹一下SQL語言的歷史與功能特性。

1.1.1SQL簡史

SQL語言的歷史與關(guān)系數(shù)據(jù)庫的發(fā)展密切聯(lián)系在一起。關(guān)系數(shù)據(jù)庫的概念是由IBM

的研究員Dr.E.F.Codd提出的,他在1970年6月發(fā)表了一篇題為“大型共享數(shù)據(jù)銀行的關(guān)

系數(shù)據(jù)模型”的論文,在該文中描述了關(guān)于數(shù)據(jù)如何在表中存儲和處理的數(shù)學(xué)理論。70年

代中期,IBMSanJose研究實(shí)驗(yàn)室把SQL作為一種新型關(guān)系數(shù)據(jù)模型的數(shù)據(jù)庫語言設(shè)計(jì)出

來,其含義是結(jié)構(gòu)化查詢語言(StructedQueryLanguage)。SQL語言不同于C、JAVA等其

他程序設(shè)計(jì)語言,它屬于一種描述性的語言,描述的是檢索、刪除或插入何種數(shù)據(jù),而不

是說明如何去執(zhí)行它,SQL的出現(xiàn)使得建立關(guān)系數(shù)據(jù)庫成為可能。它的正式發(fā)音是

ess-cue-ell(按照AmericanNationalStandardsInstitute),但許多人發(fā)音為sequelo在本書中,

SQL的發(fā)音為sequeL

七十年代后期,IBM準(zhǔn)備開發(fā)一個關(guān)系數(shù)據(jù)庫系統(tǒng):SQL/DSRDBMS,其他開發(fā)商也

迅速準(zhǔn)備開發(fā)他們的RDBMSo但是低性能的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)制約了他們的商業(yè)生

存能力。在早期關(guān)系系統(tǒng)中,關(guān)系模型的重要問題,“數(shù)學(xué)上的有效描述和直觀的顯示”

沒有有效的處理方法,導(dǎo)致了大型數(shù)據(jù)庫管理系統(tǒng)速度慢又難以使用。直到大容量、高速

度的計(jì)算機(jī)出現(xiàn)和開發(fā)了優(yōu)秀的數(shù)據(jù)檢索、數(shù)據(jù)存儲和數(shù)據(jù)訪問方法,這些方法有效地支

持了關(guān)系系統(tǒng)的后臺處理功能,才在一定程度上解決了這個問題。

1981年,IBM發(fā)布了它的第一個基于SQL的商業(yè)產(chǎn)品SQL/DSo在八十年代早期,

Oracle,RelationalTechnology等其他幾個開發(fā)商也紛紛發(fā)布了各自的基于SQL的關(guān)系型數(shù)

據(jù)庫管理系統(tǒng)。到1989年,市場上出現(xiàn)了許多種SQL或類似于SQL的數(shù)據(jù)庫管理系統(tǒng),

這些系統(tǒng)運(yùn)行在從個人計(jì)算機(jī)到處理多用戶計(jì)算機(jī)等各種計(jì)算機(jī)上。在市場的推動下SQL

得到了普及。同時IBM公司加快了對SQL的普及,并把DB2定位為九十年代數(shù)據(jù)管理的

解決方案。

關(guān)系型數(shù)據(jù)庫管理系統(tǒng)市場的激烈競爭導(dǎo)致出現(xiàn)了各種各樣的SQL實(shí)現(xiàn)版本,每一種

版本都代表了開發(fā)商在開發(fā)完整和高效關(guān)系模型表達(dá)語言方面所做的最大努力。1986年美

國國家標(biāo)準(zhǔn)化學(xué)會(AmericanNationalStandardInstitute,ANSI)和國際標(biāo)準(zhǔn)化組織

(InternationalStandardOrganization,ISO)發(fā)布的ANSI/ISO標(biāo)準(zhǔn)正式確認(rèn)SQL的標(biāo)準(zhǔn)地位,

這是SQL在市場中確定地位最重要的一點(diǎn)。并且在1992年與1999年先后進(jìn)行了修訂,現(xiàn)

在的正式版本是SQL3版本。從九十年代初起,SQL性能便開始穩(wěn)步提高,處理器速度明

顯加快,使SQL成為事務(wù)處理程序的有效工具,隨著網(wǎng)絡(luò)的發(fā)展,SQL成為客戶機(jī)/服務(wù)

器結(jié)構(gòu)的關(guān)鍵部分,通過網(wǎng)絡(luò)實(shí)現(xiàn)數(shù)據(jù)庫的連接與使用變得越來越普遍,現(xiàn)在已經(jīng)可以基

于Web應(yīng)用程序來實(shí)現(xiàn)遠(yuǎn)程訪問數(shù)據(jù)庫。

1.1.2SQL的功能與特性

SQL是與DBMS進(jìn)行通信的一種語言和工具,將DBMS的組件聯(lián)系在一起??梢詾?/p>

用戶提供強(qiáng)大的功能,使用戶可以方便地進(jìn)行數(shù)據(jù)庫的管理以及數(shù)據(jù)的操作。通過控制

DBMS,SQL能提供給用戶如下的功能。

?數(shù)據(jù)定義:SQL能讓用戶自己定義所存儲數(shù)據(jù)的結(jié)構(gòu),以及所存儲數(shù)據(jù)各項(xiàng)之間

的關(guān)系。這樣用戶就可以按自己的需要方便地進(jìn)行數(shù)據(jù)的組織。

?數(shù)據(jù)更新:SQL為用戶和應(yīng)用程序提供了添加、刪除、修改等數(shù)據(jù)更新操作,使

用戶或應(yīng)用程序可以向數(shù)據(jù)庫中增加新的數(shù)據(jù),刪除舊的數(shù)據(jù)以及修改已有數(shù)據(jù),

有效地支持了數(shù)據(jù)庫數(shù)據(jù)的更新。

?數(shù)據(jù)查詢:SQL使用戶或應(yīng)用程序可以從數(shù)據(jù)庫中按照自己的需要查詢數(shù)據(jù)并組

織使用它們。其中SQL不僅支持簡單條件的檢索操作,而且支持子查詢、查詢的

嵌套、視圖等復(fù)雜的檢索,為用戶和應(yīng)用程序提供了很好的數(shù)據(jù)查詢方法。

?數(shù)據(jù)安全:SQL能對用戶和應(yīng)用程序訪問數(shù)據(jù)、添加數(shù)據(jù)等操作的權(quán)限進(jìn)行限制,

以防止未經(jīng)授權(quán)的訪問,有效地保護(hù)數(shù)據(jù)庫的安全。

?數(shù)據(jù)完整性:SQL使用戶可以定義約束規(guī)則,定義的規(guī)則將存在數(shù)據(jù)庫內(nèi)部,可

以防止因數(shù)據(jù)庫更新過程中的意外事件或系統(tǒng)錯誤導(dǎo)致的數(shù)據(jù)庫崩潰。

?數(shù)據(jù)庫結(jié)構(gòu)的修改:SQL使用戶或應(yīng)用程序可以修改數(shù)據(jù)庫的結(jié)構(gòu)。

可見,SQL為用戶提供了完整的數(shù)據(jù)庫操作、安全及維護(hù)的各種操作,為用戶提供了

很好的可操作性。

SQL是一種易于理解的語言,同時又是綜合管理數(shù)據(jù)的工具。作為現(xiàn)在數(shù)據(jù)庫市場普

遍應(yīng)用的語言,它具有以下一些特性。

?確定的標(biāo)準(zhǔn):美國國家標(biāo)準(zhǔn)化學(xué)會(ANSI)和國際標(biāo)準(zhǔn)化組織(ISO)在1986年制訂

了SQL的標(biāo)準(zhǔn),并在1989年、1992年與1999年進(jìn)行了3次擴(kuò)展,使得所有生產(chǎn)

商都可以按照統(tǒng)一標(biāo)準(zhǔn)實(shí)現(xiàn)對SQL的支持,SQL語言在數(shù)據(jù)庫廠家之間具有廣泛

的適用性。雖然在不同廠家之間SQL語言的實(shí)現(xiàn)方式存在某些差異,但是通常情

況下無論選擇何種數(shù)據(jù)庫平臺,SQL語言都保持相同。這就是SQL的最大優(yōu)點(diǎn)。

?軟件提供商的獨(dú)立性:現(xiàn)在所有主流的DBMS軟件提供商均提供對SQL的支持,

SQL標(biāo)準(zhǔn)的確立使不同的生產(chǎn)商可以獨(dú)立地進(jìn)行DBMS軟件的設(shè)計(jì),一個基于

SQL的數(shù)據(jù)庫和使用該數(shù)據(jù)庫的應(yīng)用程序能很方便地從一種DBMS系統(tǒng)轉(zhuǎn)向另一

種DBMS系統(tǒng)。查詢、報(bào)表生成器等數(shù)據(jù)庫工具能在許多不同類型的SQL數(shù)據(jù)庫

中使用。

?跨計(jì)算機(jī)系統(tǒng)的移植性:基于SQL的數(shù)據(jù)庫產(chǎn)品能夠在大型計(jì)算機(jī)、個人計(jì)算機(jī)

等各種計(jì)算機(jī)上運(yùn)行,也支持在不同的操作系統(tǒng)上運(yùn)行,同時也可以通過網(wǎng)絡(luò)進(jìn)行

訪問和管理。

?各大公司的支持:SQL最初由IBM研究人員發(fā)明,已經(jīng)成為IBM數(shù)據(jù)庫產(chǎn)品DB2

的戰(zhàn)略性產(chǎn)品,同時也得到了Microsoft公司、Oracle公司等數(shù)據(jù)庫市場各大軟件

公司的支持,這就保證了SQL今后的發(fā)展。

?程序化數(shù)據(jù)庫訪問:SQL語句既能用于交互式訪問也能用于程序化訪問,這樣應(yīng)

用程序就具有很大的靈活性,可以將這兩種方式結(jié)合起來設(shè)計(jì)更好的程序。

?應(yīng)用程序傳送的支持:在數(shù)據(jù)庫發(fā)展的最初時期,SQL支持基于主機(jī)的應(yīng)用程序;

隨著計(jì)算機(jī)技術(shù)的發(fā)展,客戶機(jī)/服務(wù)器體系結(jié)構(gòu)隨著PC革命的到來應(yīng)運(yùn)而生,

SQL作為優(yōu)化用戶相互作用的前端計(jì)算機(jī)系統(tǒng)和專為數(shù)據(jù)庫管理設(shè)計(jì)的后端系統(tǒng)

的橋梁,使每個系統(tǒng)處于最佳工作狀態(tài);隨著Internet和WWW的迅速發(fā)展,SQL

作為Internet數(shù)據(jù)訪問標(biāo)準(zhǔn),在應(yīng)用中充當(dāng)了新的角色,建立了以SQL作為應(yīng)用程

序和數(shù)據(jù)庫連接的標(biāo)準(zhǔn):最新出現(xiàn)的Java也己經(jīng)引入了SQL,SQL在最新的編程

語言中也有了有效的應(yīng)用。

?數(shù)據(jù)的多視化:可以通過使用SQL產(chǎn)生不同的報(bào)表和視圖將數(shù)據(jù)庫中的數(shù)據(jù)按用

戶所需的角度顯示在用戶面前,供用戶使用,具有很大的靈活性。同時,SQL的

視圖功能也能提高數(shù)據(jù)庫的安全性并且能滿足特定用戶的需要。

?可擴(kuò)展性和對象:面向?qū)ο缶幊碳夹g(shù)的興起,數(shù)據(jù)庫市場也面臨了對象技術(shù)的

入,各個SQL數(shù)據(jù)庫生產(chǎn)商也正在擴(kuò)展和提高SQL對對象的支持。

SQL的以上特性,使得SQL在個人計(jì)算機(jī)、小型計(jì)算機(jī)和大型計(jì)算機(jī)上作為管理數(shù)

據(jù)的標(biāo)準(zhǔn)工具出現(xiàn),占據(jù)了大部分的市場。

1.1.3SQL3簡介

SQL標(biāo)準(zhǔn)是為了在各個開發(fā)商之間達(dá)成高度的一致性來達(dá)到提高市場上所有數(shù)據(jù)庫

產(chǎn)品的通用性而制定的一個國際標(biāo)準(zhǔn),每次該標(biāo)準(zhǔn)的更新都為SQL添加了新的特征和新的

命令與功能。最新的ANSI/ISO的SQL-3即SQL99標(biāo)準(zhǔn)的特色就是提供了一系列可以處理

面向?qū)ο髷?shù)據(jù)類型的擴(kuò)展功能。

可以通過簡單地比較SQL-2和SQL-3的語句種類來感受SQL-3的新特色。在SQL-2

標(biāo)準(zhǔn)中,SQL語句可以大體分為:數(shù)據(jù)定義語句(DataDefinitionLanguage,DDL)、數(shù)據(jù)操

作語句(DataManipulationLanguage,DML)以及數(shù)據(jù)控制語句(DataControlLanguage,

DCL),其中,DDL包括了處理數(shù)據(jù)庫元素的命令,如CREATE和DROP;DML提供了

特定的數(shù)據(jù)操作命令,如SELECT、INSERT、UPDATEDELETE;而DCL則包括了處

理權(quán)限(Permission)的命令,如GRANT利REVOKE。

而SQL-3標(biāo)準(zhǔn)提出了一種新的語句分類方式,將它所現(xiàn)有的SQL語句分為7種核心

的類型,而這些SQL-3標(biāo)準(zhǔn)的語句類試圖使每一個類型和那些語句能更加準(zhǔn)確并且更有邏

輯性地結(jié)合在一起,在某種程度上也更易于理解。這樣一套新的語句類型允許將來新產(chǎn)生

的且不適于任何己有類型的語句能夠合理地進(jìn)行單獨(dú)分類,因此這種做法非常有益于SQL

將來的發(fā)展。SQL-3包含的語句類如下。

?連接語句:使用該類語句可以開始和結(jié)束一個客戶連接,如CONNECT語句和

DISCONNECT語句。

?控制語句:該類語句用來控制一組SQL語句的執(zhí)行,如CALL語句和RETURN

語句。

?數(shù)據(jù)語句:使用該類語句可以直接對數(shù)據(jù)產(chǎn)生持續(xù)的作用,如SELECT語句、

INSERT語句、UPDATE語句和DELETE語句。

?診斷語句:該類語句可以提供診斷信息并指出異?;蝈e誤,如GETDIAGNOSTIC

語句。

?模式語句:該類語句可以操作數(shù)據(jù)庫模式及其內(nèi)部的元素,如ALTER語句、

CREATE語句和DROP語句。

?會話語句:使用該類語句可以在一次會話中控制默認(rèn)操作和其他的參數(shù),如SET

語句。

?事務(wù)語句:該語句用來設(shè)置一個事務(wù)處理的開始點(diǎn)和結(jié)束點(diǎn),如COMMIT語句

和ROLLBACK語句。

從SQL-3標(biāo)準(zhǔn)的這些語句類可以明顯看出,與以前的SQL標(biāo)準(zhǔn)相比,SQL-3標(biāo)準(zhǔn)更

適合對面向?qū)ο蟮臄?shù)據(jù)類型進(jìn)行處理。

除了上述的語句分類方式的變化,使新的方式更適合處理面向?qū)ο蟮臄?shù)據(jù),SQL-3標(biāo)

準(zhǔn)還增加了一些新的數(shù)據(jù)庫元素以增強(qiáng)SQL對面向?qū)ο髷?shù)據(jù)類型的處理。這些新增數(shù)據(jù)庫

元素有角色、觸發(fā)器和用戶定義類型。角色是指定的一種或一組權(quán)限,是一個單獨(dú)的成分,

是一個對象。角色具有的分組權(quán)限功能為數(shù)據(jù)庫系統(tǒng)的安全性管理提供了許多便利的條件;

觸發(fā)器是指當(dāng)在指定的表上發(fā)生一個特定的操作事件時,將被調(diào)用的一個程序段;在以前

的SQL標(biāo)準(zhǔn)中,所有的數(shù)據(jù)類型都是預(yù)定義的,但是,在SQL-3標(biāo)準(zhǔn)中新增的CREATE

TYPE、ALTERTYPE和DROPTYPE語句應(yīng)用了對象/關(guān)系概念,可以使用它們來進(jìn)行用

戶定義類型(UDT)的操作。這3種新的數(shù)據(jù)元素將在本書的12.1.3小節(jié)中予以介紹。

之前簡單講述了SQL-3標(biāo)準(zhǔn)提供的一系列可以處理面向?qū)ο髷?shù)據(jù)類型的擴(kuò)展功能的

特色,下面來了解一下SQL-3相對SQL-2的最重要改變一進(jìn)一步闡述了SQL-2的一致

性級別(levelofconformance)。SQL-2標(biāo)準(zhǔn)定義了3類級別:Entry(入門)、Intermediate(中等)

和Full(完全),此標(biāo)準(zhǔn)的每一個較高的級別都包括了其較低一致性級別的所有特征,而開

發(fā)商必須達(dá)到Entry級別才可以聲明其產(chǎn)品符合ANSI/SQL標(biāo)準(zhǔn)。而SQL-3修訂了關(guān)于一

致性的基本級別,不再使用SQL-2的3個級別,而使用核心SQL-3標(biāo)準(zhǔn)(CoreSQL-3)、增

強(qiáng)SQL-3標(biāo)準(zhǔn)(EnhancedSQL-3)。其中,CoreSQL-3標(biāo)準(zhǔn)包括SQL-2中的Entry級的特征

集和其他級別中的一些特征以及其他一些全新的特征;而EnhancedSQL-3則對應(yīng)于SQL-2

的Intermediate和Full級的部分特征以及其他一些全新的特征。ANSI/SQL則要求開發(fā)商必

須實(shí)現(xiàn)SQL-3的一致性級別的CoreSQL-3級,只要是支持CoreSQL-3一致性級別的數(shù)據(jù)

庫產(chǎn)品再加上SQL-39個附加特征包中的任意一個或多個就可以說是滿足增強(qiáng)SQL-3標(biāo)

準(zhǔn)。因?yàn)橐恢滦约墑e只與開發(fā)商密切相關(guān),不屬于本書實(shí)用教程的討論范圍,所以書中不

進(jìn)行詳細(xì)討論。

除了上面討論的SQL-3標(biāo)準(zhǔn)的特色,新的語句分類形式,新增的數(shù)據(jù)庫元素和進(jìn)一步

闡述的SQL一致性級別以外,SQL-3還在多個細(xì)節(jié)上對SQL-2進(jìn)行了改進(jìn)。本書后面的

章節(jié)中所有的內(nèi)容都是基于SQL-3標(biāo)準(zhǔn)的,為了說明SQL-3與舊標(biāo)準(zhǔn)的不同,在這先舉幾

個不同的例子,如下。

(1)在SQL-3中,空值NULL的使用方式不同于舊標(biāo)準(zhǔn)。在SQL-3中,約束檢驗(yàn)時,

NULL的值是UNKNOWN而不是舊標(biāo)準(zhǔn)的TRUE或FALSE。

(2)在SQL-2中,基于多表連接的視圖和含有集合算符的查詢的視圖都不能作為

INSERT.UPDATE和DELETE語句的操作對象,但是在SQL-3中可以對這幾類視圖進(jìn)行

有條件的更新操作,例如可以在兩個表的UNIONJOIN結(jié)果中進(jìn)行這些數(shù)據(jù)的更新操作。

舉一個例子,假設(shè)有兩個表,第一個表有5個字段,第二個表有6個字段,在它們的UNION

JOIN結(jié)果中就有11歹下面進(jìn)行如下操作:

?INSERT一個新記錄行

如果新行的前5列為空,后6列非空,則該操作去掉前面5個NULL,將剩余的數(shù)據(jù)

存入第二個表中。

如果新行的前5列非空,后6列為空,則該操作去掉后面6個NULL,將剩余的數(shù)據(jù)

存入第一個表中。

新行的前5列非空,后6列也有非空值,則該操作不能進(jìn)行。

?UPDATE操作

如果需要更新的行來自第一個表(后6列為空值),則該操作修改第一個表中的對應(yīng)行

的數(shù)據(jù)。

如果需要更新的行來自第二個表(前5列為空值),則該操作修改第二個表中的對應(yīng)行

的數(shù)據(jù)。

新行的前5列非空,后6列也有非空值,則該操作不能進(jìn)行。

?DELETE操作

如果需要刪除的行來自第一個表(后6列為空值),則該操作刪除第一個表中的對應(yīng)行。

如果需要刪除的行來自第二個表(前5列為空值),則該操作刪除第二個表中的對應(yīng)行。

新行的前5列非空,后6列也有非空值,則該操作不能進(jìn)行。

(3)下面舉兩條語句,在SQL-2中不合法,但是在SQL-3中是合法的。

SELECT語句中使用的ORDERBY子句后的表列存在,但是不在SELECT清單中:

SELECTname

FROMEmployee

ORDERBYid

在SELECT清單和ORDERBY子句中同時使用未命名的表達(dá)式:

SELECTsalary*12

FROMEmployee

ORDERBYsalary*12

1.2關(guān)系數(shù)據(jù)模型

關(guān)系數(shù)據(jù)模型的設(shè)計(jì)是關(guān)系數(shù)據(jù)庫設(shè)計(jì)中重要也是基礎(chǔ)的一步。關(guān)系數(shù)據(jù)模型的設(shè)計(jì)

主要包含兩個方面:數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)以及鍵與外部鍵的定義。本節(jié)將介紹這兩個方面設(shè)計(jì)

的定義與應(yīng)用。

1.2.1數(shù)據(jù)結(jié)構(gòu)

每一個系統(tǒng)都有其自己的數(shù)據(jù)結(jié)構(gòu)。關(guān)系數(shù)據(jù)庫管理系統(tǒng)組織并構(gòu)造數(shù)據(jù),以使數(shù)據(jù)

能被用戶或應(yīng)用程序檢索與更新。由DBMS提供的數(shù)據(jù)結(jié)構(gòu)和訪問方法被稱為DBMS的

數(shù)據(jù)模型。數(shù)據(jù)模型決定了DBMS的性能及其適應(yīng)的范圍。

在關(guān)系數(shù)據(jù)庫系統(tǒng)中,關(guān)系是關(guān)系數(shù)據(jù)模型的核心。關(guān)系數(shù)據(jù)庫系統(tǒng)中最主要的數(shù)據(jù)

結(jié)構(gòu)就是關(guān)系。在實(shí)際表示中,關(guān)系可以用一個表來直觀地表示,通常表是以一種矩形數(shù)

據(jù)行/列的形式表示。表的每一列表示關(guān)系的一個屬性,每列的名字即為一個屬性名,每一

行表示一個記錄代表一個物理實(shí)體。關(guān)系數(shù)據(jù)庫中,所有的數(shù)據(jù)都是通過表來進(jìn)行存儲的,

可以說如果沒有表數(shù)據(jù)就無法進(jìn)行存儲和表示。

表1-1給出了一個關(guān)系模式”工作人員(名字,職員ID,生日,性別,工資)”的實(shí)例。

表的每一行表示一個物理實(shí)體一工作人員。表中有6行,代表6個工作人員。例如,第

一行記錄的是工作人員“林志千”的信息。工作人員表的每一列代表一個工作人員的一個

數(shù)據(jù)項(xiàng),記錄工作人員的一部分信息。例如,職員ID列用來存儲每個工作人員的職員ID,

生日列用來存儲每個工作人員的生日。第一行的職員ID列記錄了工作人員“林志千”的

職員ID1001,生日列記錄了工作人員“林志千”的生日1962年11月25號。第二行記錄

的是工作人員“李明”的信息。第二行的職員ID列記錄了工作人員“李明”的職員ID1002,

生日列記錄了工作人員“李明”的生日1976年5月23號。

表1-1關(guān)系模式實(shí)例

姓名職員ID生日性另IJ工資

林志千10011962-11-25男6000.00

李明10021976-05-23男5000.00

李大平10031978-12-20男3000.00

林國榮10041977-06-14男4000.00

劉燕20021971-12-26女3000.00

魏箸30031977-05-17女4000.00

關(guān)系數(shù)據(jù)模型中數(shù)據(jù)結(jié)構(gòu)的核心規(guī)則是:所有數(shù)據(jù)都必須在表中所有關(guān)系模型中呈現(xiàn)

給用戶。它提供了數(shù)據(jù)表達(dá)和存儲之間的一級抽象概念,使數(shù)據(jù)具有獨(dú)立性,無論是用

哪種關(guān)系數(shù)據(jù)庫產(chǎn)品,不論其采用的是什么物理存儲方式,查詢和處理數(shù)據(jù)的方式都是

相同的。

具體來說,數(shù)據(jù)的獨(dú)立性表現(xiàn)在兩個重要的方面:物理獨(dú)立性和邏輯獨(dú)立性。

各開發(fā)商之間,甚至同一開發(fā)商的不同版本之間的物理存儲體系結(jié)構(gòu)都是不相同的。

物理獨(dú)立性是指用戶所看到的數(shù)據(jù)與數(shù)據(jù)的物理存儲是完全獨(dú)立的,即可以改變或重新安

排物理存儲而不會影響到數(shù)據(jù)的使用和邏輯數(shù)據(jù)庫的設(shè)計(jì)(邏輯數(shù)據(jù)庫的設(shè)計(jì)將在1.6節(jié)中

詳細(xì)介紹)。

邏輯獨(dú)立性指的是,可以改變表、行和列之間的相互關(guān)系,即對數(shù)據(jù)結(jié)構(gòu)進(jìn)行修改而

不會削弱應(yīng)用程序特別是查詢的功能。

1.2.2鍵與外部鍵

每個表表示的是現(xiàn)實(shí)世界中的數(shù)據(jù)集合,表中有多個列名,需要一個或一組屬性來表

示表中元組的惟一性,接下來將介紹兩個基本概念。

?候選鍵:包含獨(dú)立的標(biāo)識數(shù)據(jù)庫中每一行值的任意一個列或一組列。

?主鍵:獨(dú)立的標(biāo)識存儲在表中的每個記錄或潛在記錄的一組列(一組中可能只包含

一個值)。

一個表中可能具有多個候選鍵,這時可以選擇一個作為該表的主鍵,即主鍵是從候選

鍵中選出,剩下的候選鍵稱為備用鍵。候選鍵中的屬性稱為鍵屬性,其他屬性則稱為非鍵

屬性。主鍵中的屬性稱為主屬性,其他屬性則稱為非主屬性。

判斷一組值是否具有候選鍵的資格有兩條嚴(yán)格的規(guī)則:

?表中任意兩個記錄在他們的由候選鍵組成的列的組合中都不具有相同的值,即惟一

性規(guī)則(uniquenessproperty)?

?作為候選鍵的列的組合中,沒有一個列的子集表現(xiàn)出惟一性,即不可簡化性規(guī)則

(irreducabilityproperty)?

例如,在表1-1中可以看列組{姓名,職員ID,生日}和列{職員ID},二者均可獨(dú)立地

標(biāo)識表中的每一行,都表現(xiàn)出惟一性;但是列{職員ID}顯然是列組{姓名,職員ID,生日}

的子集,即列組中的子集{職員ID}表現(xiàn)出惟一性,所以列組{姓名,職員ID,生日}不滿

足不可簡化性,因此列組{姓名,職員ID,生日}不是候選鍵。在表“工作人員(姓名,職

員ID,生日,住址,性別)”中,由于生日和姓名都有可能重復(fù),所以{職員ID}是惟一的

一個主鍵,“職員ID”是這個主鍵的主屬性,表中其他的屬性稱為非主屬性。

注意:

鍵必須滿足惟一性和不可簡化性規(guī)則!

下面介紹一下外部鍵的概念,假設(shè)X是表A中的一個屬性集合,若X同時是另一個

表B的主屬性,則稱X是表A關(guān)于表B的外部鍵。

例如,與表“工作人員(姓名,職員ID,生日,住址,性別,所屬部門號)”相應(yīng)的有

一個表“部門(部門名稱,部門號,部門所在地)”,在表“部門(部門名稱,部門號,部門所

在地)”中一般來說一家公司內(nèi)各部門的部門號都是惟一的,因此可以把“部門號”作為一

個主鍵,同時“部門號”是表“工作人員(姓名,職員ID,生日,住址,性別,所屬部門

號)”中的一個屬性,所以“部門號”是表“工作人員(姓名,職員ID,生日,住址,性另I」,

所屬部門號)”關(guān)于表“部門(部門名稱,部門號,部門所在地)”的外部鍵。

1.3關(guān)系操作

對所有的關(guān)系數(shù)據(jù)庫來說,有大量的操作方式可以使用,這些實(shí)用的操作方式能讓用

戶看到所需要的數(shù)據(jù)。

由前面介紹的物理獨(dú)立性和數(shù)據(jù)獨(dú)立性可以讓用戶不必?fù)?dān)心數(shù)據(jù)的具體存儲位置,也

不必關(guān)心如何才能找到所需的數(shù)據(jù)。這些,數(shù)據(jù)庫管理系統(tǒng)可以幫用戶完成。SQL允許不

指定任何關(guān)于數(shù)據(jù)存儲位置和尋找方式的細(xì)節(jié)就可以表示需要的內(nèi)容。

為了便于本節(jié)的介紹,下面就先給出關(guān)于SELECT語句的簡單語法:

SELECTselectjist

FROMtablejist

WHEREsearch_conditions

在SELECT子句中指定要返回的表的屬性,在FROM子句中指定從哪個表中檢索數(shù)

據(jù),WHERE子句則指定檢索條件。

下面介紹關(guān)系數(shù)據(jù)庫中定義的3個具體的操作方式。

注意:

現(xiàn)在不必在意SQL語法的使用,關(guān)鍵是要理解所述操作的概念。

1.3.1選擇

選擇操作是從表中返回特定行的集合。選擇操作也可以稱為限制,因?yàn)樗拗屏朔祷?/p>

行集合的標(biāo)準(zhǔn)。限制條件只適合于被返回的行,不適合包括在查詢結(jié)果中的列。要指定限

制條件,可以將條件寫在WHERE子句中。

例如,如果只需要返回有關(guān)于部門號小于5的部門的信息,可以使用下面的語句:

SELECT*

FROMDepartment

WHEREdnumber<5

下面是選擇結(jié)果:

Results

dnumberdnamemgridmgrstrdate

1開發(fā)部1(X)12001-11-3

2市場部20012002-3-1

3人事部30012001-4-5

4技術(shù)部40012001-1-15

[4rows]

1.3.2投影

投影操作限制了查詢返回的列,允許用戶列出所要查看的列。投影操作只允許返回表

中各列的具體的子集,是通過將具體的列清單傳遞給SELECT語句來實(shí)現(xiàn)的,即在SELECT

列表中列出需要查看的列的名稱。

例如,要查看部門的部門號、部門負(fù)責(zé)人ID號、部門負(fù)責(zé)人開始工作時間這3個列

的信息,可以使用投影操作:

SELECTdname,mgrid,mgrstrdatc

FROMDepartment

下面是投影結(jié)果:

Results

dnumbermgridmgrstrdate

110012001-11-3

220012002-3-1

330012001-4-5

440012001-1-15

550012002-6-5

66(X)12002-3-10

[6rows]

用戶可以同時使用選擇和投影來查詢所要查看的表的列和行。選擇用來限制返回的記

錄數(shù)目,而投影用來列出要查看的具體的字段。

例如,只想知道部門號小于5的部門的負(fù)責(zé)人的職員ID號和開始工作時間,可以同

時使用選擇和投影操作:

SELECTmgrid,mgrstrdate

FROMDepartment

WHEREdnumber<5

Results

mgridmgrstrdate

10012001-11-3

20012(X)2-3-l

30012001-4-5

40012001-1-15

[4rows]

1.3.3連接

連接操作是結(jié)合多個表的關(guān)系操作,為了查詢特定數(shù)據(jù)而將兩個或更多個表連接起來

形成新的報(bào)表或視圖,以便用戶能夠比較和對比數(shù)據(jù)庫不同表中的數(shù)據(jù),為用戶提供了更

多的功能和靈活性??梢酝ㄟ^連接來發(fā)現(xiàn)數(shù)據(jù)之間的關(guān)系,找出數(shù)據(jù)之間的聯(lián)系,而不僅

僅局限于數(shù)據(jù)庫中已有的一些關(guān)系。

連接操作是通過在WHERE子句中設(shè)定特定的條件,或者使用JOIN關(guān)鍵字通過表之

間相關(guān)的列來連接不同表中的數(shù)據(jù),用戶可以在其中設(shè)定想指定的條件。詳細(xì)的連接操作

的實(shí)現(xiàn)將在第7章中進(jìn)行介紹。

例如,想知道各部門的部門負(fù)責(zé)人的具體情況,每個工作人員的情況都存儲在

Employee表中,Employee表中也包含了工作人員的職員ID號,但是誰是部門負(fù)責(zé)人并沒

有記錄在Employee表中,而是記錄在Department表中,如圖1-1所示。

圖1-1在Employee表和Department表中的歹U

在Employee表中的dno就是工作人員所在部門號,而Department表中也記錄了部門

的部門號dnumber,所以可以用連接這兩個表來實(shí)現(xiàn)用戶想實(shí)現(xiàn)的操作,如圖1?2所示。

圖1-2在Employee表和D叩artment表中的共享列

由于共享列的存在,可以使用下面的語句來實(shí)現(xiàn)上面的連接操作:

SELECTname,sex,id,salary,dno

FROMEmployee,Department

WHERE=er

FROM子句表示要連接的兩個表,WHERE子句指明這些表中的行在兩個表中部門號

相等時進(jìn)行連接。

下面是連接結(jié)果:

Results

namesexidsalarydno

林志千男10016000.001

陳廣海男20015000.002

張宇男30015000.003

張峰男40017000.004

李志深男50015000.005

魏成男60015000.006

[6rows]

讀者可能有疑問,為什么不首先將這些列放置在同一個表中而要使用連接操作呢?這

是因?yàn)橐恢滦裕醋钚∪哂嘈裕⒎奖阈约靶阅艿囊螅碇械牧袛?shù)必須有限制。在下面的

章節(jié)中將介紹表中列的確定準(zhǔn)則。

前面說過可以將選擇和投影操作結(jié)合起來使用。同樣,也可以將選擇、投影和連接操

作結(jié)合起來使用。

例如,只想知道部門號小于5的部門負(fù)責(zé)人的名字和工資,就必須將3個操作結(jié)合起

來,可以使用下面的語句:

SELECTname,salary

FROMEmployee,Department

WHERE=er

AND<5

下面是連接結(jié)果:

Results

namesalary

林志千6000.00

陳廣海5000.00

張宇5000.00

張峰7000.00

[4rows]

1.4數(shù)據(jù)庫設(shè)計(jì)概述

在詳細(xì)介紹如何進(jìn)行數(shù)據(jù)庫的設(shè)計(jì)之前,我們先介紹一下有關(guān)數(shù)據(jù)庫模型準(zhǔn)則及數(shù)據(jù)

庫設(shè)計(jì)過程,使讀者對數(shù)據(jù)庫設(shè)計(jì)有一個大致的了解。

1.4.1數(shù)據(jù)庫模型準(zhǔn)則

E.F.Codd博士于1970年在一篇名為“一種存儲大型共享數(shù)據(jù)的關(guān)系模型”的歷史性

論文中提出了數(shù)據(jù)庫模型定義的12條準(zhǔn)則。

?信息準(zhǔn)則:關(guān)系型數(shù)據(jù)庫(包括表和列名)中所有的信息都必須清楚地用表中的數(shù)

值來表示。

?確保訪問準(zhǔn)則:必須保證關(guān)系數(shù)據(jù)庫中的每一個數(shù)值都可用表名、主鍵和列名的

組合來訪問。

?空值準(zhǔn)則:DBMS對空值(表示未知或不可使用數(shù)據(jù),不同于其他任何一種數(shù)據(jù)類

型,如字符串、數(shù)字等數(shù)據(jù)類型)應(yīng)提供系統(tǒng)支持??罩蹬c默認(rèn)值不同,它獨(dú)立于

任何數(shù)據(jù)類型。

?數(shù)據(jù)字典準(zhǔn)則:應(yīng)支持主動的、在線的關(guān)系型數(shù)據(jù)字典。在邏輯上,數(shù)據(jù)庫的描

述及其內(nèi)容都被表示為表的形式,并能用數(shù)據(jù)庫語言進(jìn)行查詢。

?廣泛的數(shù)據(jù)子語言準(zhǔn)則:具有統(tǒng)一的數(shù)據(jù)子語言,同時至少有一種支持語言,該

語言應(yīng)具有嚴(yán)格、統(tǒng)一的語法格式,而且必須支持?jǐn)?shù)據(jù)定義、視圖定義、數(shù)據(jù)操作、

完整性規(guī)則、授權(quán)和事務(wù)處理。

?視圖更新準(zhǔn)則:所有理論上可更新的視圖,在實(shí)際操作中也可以被系統(tǒng)更新。

?集合準(zhǔn)則:DBMS應(yīng)該不僅僅支持集合級上的檢索,而且支持集合級上的插入操

作、更新操作與刪除操作。

?物理數(shù)據(jù)準(zhǔn)則:物理數(shù)據(jù)必須具有獨(dú)立性,即當(dāng)數(shù)據(jù)的存儲結(jié)構(gòu)或數(shù)據(jù)的物理存

取方法改變時,應(yīng)用程序和其他特殊程序在邏輯上應(yīng)保持不受影響。

?邏輯數(shù)據(jù)準(zhǔn)則:邏輯數(shù)據(jù)應(yīng)具有獨(dú)立性,即當(dāng)表的結(jié)構(gòu)改變時,應(yīng)用程序和其他

特殊程序應(yīng)盡可能地保持在邏輯上不受影響。

?數(shù)據(jù)完整性準(zhǔn)則:數(shù)據(jù)庫語言必須能夠定義完整性規(guī)則,這些規(guī)則必須存儲在聯(lián)

機(jī)數(shù)據(jù)字典中,不能被忽略。

?分布準(zhǔn)則:應(yīng)支持分布的獨(dú)立性,當(dāng)首次引入分布式數(shù)據(jù)或數(shù)據(jù)重新分布時,應(yīng)

用程序和其他特殊程序在邏輯上應(yīng)不受影響。

?無損害準(zhǔn)則:絕不能發(fā)生用一種低級的語言繞過數(shù)據(jù)庫語言定義的完整性規(guī)則的

事件。

在實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫模型時必須滿足上述12條標(biāo)準(zhǔn)。

準(zhǔn)則一基本上是有關(guān)數(shù)據(jù)庫信息的定義。

準(zhǔn)則二強(qiáng)調(diào)表中主鍵的重要性,要求能通過表名正確訪問表,通過列名訪問列,而主

鍵值能區(qū)分表中的行。

準(zhǔn)則三強(qiáng)調(diào)空值的處理。

準(zhǔn)則四要求數(shù)據(jù)庫能自我描述,即數(shù)據(jù)庫應(yīng)該包含一定的系統(tǒng)表(數(shù)據(jù)字典),系統(tǒng)表

可以描述數(shù)據(jù)庫自身的結(jié)構(gòu)。

準(zhǔn)則五要求數(shù)據(jù)庫支持關(guān)系數(shù)據(jù)語言,如SQL.通過SQL語言實(shí)現(xiàn)DBMS要求的數(shù)

據(jù)庫的創(chuàng)建、數(shù)據(jù)的輸入與更新等。

準(zhǔn)則六支持視圖的使用,在實(shí)際使用過程中,視圖提供了很大的靈活性,可以用來方

便地完成特殊功能。

準(zhǔn)則七強(qiáng)調(diào)對集合的支持,能進(jìn)行集合運(yùn)算:交、并、差等。

準(zhǔn)則八與準(zhǔn)則九強(qiáng)調(diào)了應(yīng)用程序與物理數(shù)據(jù)、邏輯數(shù)據(jù)之間的獨(dú)立性,以保證低層數(shù)

據(jù)庫結(jié)構(gòu)發(fā)生改變時,不會影響應(yīng)用程序?qū)?shù)據(jù)的操作。

準(zhǔn)則十強(qiáng)調(diào)數(shù)據(jù)庫的完整性,要求保證添加和修改數(shù)據(jù)時確保數(shù)據(jù)及數(shù)據(jù)之間的正確性。

準(zhǔn)則十一要求能對分布數(shù)據(jù)進(jìn)行處理。

準(zhǔn)則十二限制了其他訪問數(shù)據(jù)庫的方法,以保證數(shù)據(jù)庫結(jié)構(gòu)不受破壞。

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

數(shù)據(jù)庫的設(shè)計(jì)中有許許多多需要考慮的因素,如數(shù)據(jù)庫的背景、應(yīng)用環(huán)境等方面都需

要有深入的了解,只有一個對所有這些因素都很了解的數(shù)據(jù)庫設(shè)計(jì)專家,他設(shè)計(jì)的數(shù)據(jù)庫

才能易于使用和維護(hù),并且具有高效和一致的特征。雖然這樣只對數(shù)據(jù)庫設(shè)計(jì)過程有一個

概要的了解,但是仍然有助于讀者了解和掌握SQL,使讀者可以很好地分析數(shù)據(jù)間的相互

關(guān)系,在使用SQL進(jìn)行報(bào)表的生成、子查詢及視圖等操作時,可以更好地進(jìn)行操作。

在開始介紹設(shè)計(jì)方法之前,先介紹好的數(shù)據(jù)庫及差的數(shù)據(jù)庫的一些品質(zhì),這將有助于

讀者更好地掌握數(shù)據(jù)庫的設(shè)計(jì)。

一般來說,好的數(shù)據(jù)庫應(yīng)該滿足以下條件。

?便于檢索所需要的數(shù)據(jù):在大型的數(shù)據(jù)庫中,由于表的增加,多表中的數(shù)據(jù)很難

讀取和理解,數(shù)據(jù)之間的關(guān)系無法在計(jì)算機(jī)屏幕或輸出頁中完整地顯示,因此好的

數(shù)據(jù)庫應(yīng)該便于用戶檢索所需要的數(shù)據(jù)。

?具有較高的完整性、數(shù)據(jù)更新的一致性:好的數(shù)據(jù)庫應(yīng)該能防止不一致信息的引

入,避免因各種問題而出現(xiàn)的數(shù)據(jù)的不完整和數(shù)據(jù)之間的不一致。

?使系統(tǒng)具有盡可能良好的性能。

當(dāng)然,這3種品質(zhì)之間也會有一些妥協(xié)。

例如,將數(shù)據(jù)分割存儲在多個表中對數(shù)據(jù)完整性的支持較好,但對數(shù)據(jù)進(jìn)行檢索或更

新時需要進(jìn)行更多的操作,不僅麻煩,而且對性能有害;若將數(shù)據(jù)都存儲在一個表中,雖

然進(jìn)行數(shù)據(jù)檢索或更新變得比較方便,性能也較好,但是又會降低數(shù)據(jù)庫的完整性。

因此在設(shè)計(jì)數(shù)據(jù)庫時應(yīng)該平衡它們中的每一項(xiàng),使之適合應(yīng)用程序。當(dāng)然好數(shù)據(jù)庫最

根本就是能提供用戶高滿意度而且能可靠地滿足要求。

相對而言,設(shè)計(jì)得不好的數(shù)據(jù)庫或多或少與好的數(shù)據(jù)庫的品質(zhì)相反,在數(shù)據(jù)的檢索、

數(shù)據(jù)的完整性、數(shù)據(jù)更新的一致性及良好的性能上都具有較大的缺陷。還有一些具體的特

征可以幫助用戶判斷什么是設(shè)計(jì)得不好的數(shù)據(jù)庫:

?需要多次輸入相同的數(shù)據(jù),或需要輸入多余的數(shù)據(jù)。

?返回不正確的查詢結(jié)果。

?數(shù)據(jù)之間的關(guān)系難以確定。

?表或列的名稱不明確。

在數(shù)據(jù)庫的設(shè)計(jì)中,應(yīng)盡量保證設(shè)計(jì)的數(shù)據(jù)庫具有好的特征,同時應(yīng)盡量避免具有上

述一些不好的特征。

下面將詳細(xì)地介紹數(shù)據(jù)庫的設(shè)計(jì)過程。

(1)信息的收集:研究和考慮所要建立的數(shù)據(jù)庫的信息環(huán)境,對數(shù)據(jù)庫應(yīng)用領(lǐng)域中各

種信息要求和操作要求進(jìn)行詳細(xì)地分析,了解應(yīng)用領(lǐng)域中數(shù)據(jù)項(xiàng)、數(shù)據(jù)項(xiàng)之間的關(guān)系和所

有的數(shù)據(jù)操作的詳細(xì)要求,了解哪些因素對響應(yīng)時間、可用性和可靠性有較大的影響等各

方面的因素。

這些就需要設(shè)計(jì)人員與相關(guān)人員進(jìn)行各種交流,了解數(shù)據(jù)庫需要完成的功能,數(shù)據(jù)項(xiàng)

的定義等。例如,以本書使用的簡單的數(shù)據(jù)庫示例為例,設(shè)計(jì)人員需要與有關(guān)人員進(jìn)行交

流以確定部門與工程、工作人員和部門、工作人員與工程之間的關(guān)系,同時確定每個數(shù)據(jù)

項(xiàng),如工作人員,應(yīng)該包含哪些數(shù)據(jù)等,只有完成這些必要的信息收集后,數(shù)據(jù)庫的設(shè)計(jì)

才能順利地進(jìn)行下去。

(2)確定數(shù)據(jù):這是數(shù)據(jù)庫設(shè)計(jì)最基本而且最重要的工作,在收集到所需的全部相關(guān)

信息后,將所有找到的數(shù)據(jù)的類型和這些類型的屬性進(jìn)行明確的定義,同時需要仔細(xì)地考

慮屬性與數(shù)據(jù)類型的關(guān)系,應(yīng)該放置于哪個數(shù)據(jù)類型中。

(3)建立實(shí)體-關(guān)系模型:按照定義的數(shù)據(jù)類型和屬性創(chuàng)建實(shí)體和實(shí)體屬性列表。實(shí)體

形成表,如“工作人員”就是一個實(shí)體,屬性則為表中的列,如對應(yīng)于實(shí)體“工作人員”

屬性包含“姓名”、“職員ID”等。

在定義完實(shí)體和屬性后,就要確保每個實(shí)體都由一個或一組屬性惟一地標(biāo)識表中的任

何記錄,即確定每個表的主鍵。例如在“工作人員”表中,屬性“職員ID”就可以惟一地

標(biāo)識“工作人員”中的任何記錄,因此將屬性“職員ID”確定為該表的主鍵。

接下來就應(yīng)該確定實(shí)體之間的關(guān)系,確定是一對一、一對多還是多對多的關(guān)系。例如

一個部門有多個工作人員,但每個工作人員只屬于一個部門,因此部門與工作人員之間是

一對多關(guān)系。一般來說是根據(jù)現(xiàn)實(shí)中的情況來確定實(shí)體之間的關(guān)系,從而形成實(shí)體-關(guān)系模

型。有關(guān)內(nèi)容將在本章的1.5節(jié)中進(jìn)行詳細(xì)介紹。

(4)進(jìn)行規(guī)范化:按照規(guī)范化準(zhǔn)則對數(shù)據(jù)進(jìn)行整體分析,以找到邏輯上的錯誤,更正

任何違背了規(guī)范化形式的做法,使數(shù)據(jù)符合規(guī)范化的要求。

(5)編寫組建數(shù)據(jù)庫的SQL代碼,同時使用查詢等操作進(jìn)行一些檢測,有關(guān)測試的具

體內(nèi)容將在第11章中介紹。

(6)根據(jù)測試結(jié)果對已完成的數(shù)據(jù)庫進(jìn)行檢查,在覺得有問題或需要完善的地方進(jìn)行

必要修改和完善。

上面介紹的是數(shù)據(jù)庫設(shè)計(jì)的一般過程,如果讀者有更好的方法,可以按照自己的方法。

記?。悍椒ú⒉皇亲钪饕?,重要的是結(jié)果。

1.5概念數(shù)據(jù)庫設(shè)計(jì)

概念數(shù)據(jù)庫的設(shè)計(jì)是進(jìn)行具體數(shù)據(jù)庫設(shè)計(jì)的第一步,概念數(shù)據(jù)庫設(shè)計(jì)的好壞直接影響

到邏輯數(shù)據(jù)庫的設(shè)計(jì),影響到整個數(shù)據(jù)庫的好壞。

1.5.1概述

概念數(shù)據(jù)庫的設(shè)計(jì)應(yīng)該極易于轉(zhuǎn)換為邏輯數(shù)據(jù)庫模式,又容易被用戶所理解。概念數(shù)

據(jù)庫設(shè)計(jì)中最主要的就是采用實(shí)體■?關(guān)系數(shù)據(jù)模型來確定數(shù)據(jù)庫的結(jié)構(gòu)。

數(shù)據(jù)是表達(dá)信息的一種重要的量化符號,是信息存在的一種重要形式。數(shù)據(jù)模型則是

數(shù)據(jù)特征的一種抽象。它描述的是數(shù)據(jù)的共性,而不是描述個別的數(shù)據(jù)。一般來說,數(shù)據(jù)

模型包含兩方面內(nèi)容。

(1)數(shù)據(jù)的靜態(tài)特性:主要包括數(shù)據(jù)的基本結(jié)構(gòu)、數(shù)據(jù)間的關(guān)系和數(shù)據(jù)之間的相互約

束等特性。

(2)數(shù)據(jù)的動態(tài)特性:主要包括對數(shù)據(jù)進(jìn)行操作的方法。

在數(shù)據(jù)庫系統(tǒng)設(shè)計(jì)中,建立反映客觀信息的數(shù)據(jù)模型,是設(shè)計(jì)中最為重要的,也最基

本的步驟之一。數(shù)據(jù)模型是連接客觀信息世界和數(shù)據(jù)庫系統(tǒng)數(shù)據(jù)邏輯組織的橋梁,也是數(shù)

據(jù)庫設(shè)計(jì)人員與用戶之間進(jìn)行交流的共同基礎(chǔ)。概念數(shù)據(jù)庫中采用的實(shí)體-關(guān)系模型,與傳

統(tǒng)的數(shù)據(jù)模型有所不同。實(shí)體-關(guān)系模型是面向現(xiàn)實(shí)世界,而不是面向?qū)崿F(xiàn)方法的,它主要

是用于描述現(xiàn)實(shí)信息世界中數(shù)據(jù)的靜態(tài)特性。而不涉及數(shù)據(jù)的處理過程。但由于它簡單易

學(xué),且使用方便,因而在數(shù)據(jù)庫系統(tǒng)應(yīng)用的設(shè)計(jì)中,得到了廣泛應(yīng)用。

實(shí)體-關(guān)系模型可以用來說明數(shù)據(jù)庫中實(shí)體的等級和屬性。以下是實(shí)體-關(guān)系模型中的

重要標(biāo)識:

?在數(shù)據(jù)庫中存在的實(shí)體

?實(shí)體的屬性

?實(shí)體之間的關(guān)系

下面就介紹一下實(shí)體-關(guān)系數(shù)據(jù)模型中的3個基本要素,即實(shí)體、關(guān)系和屬性的有關(guān)基

本知識。

1.5.2實(shí)體

實(shí)體是實(shí)體-關(guān)系模型的基本對象,是現(xiàn)實(shí)世界中各種事物的抽象。凡是可以相互區(qū)別

開并可以被識別的事、物、概念等對象均可認(rèn)為是實(shí)體。在本書示例的簡單的Company

數(shù)據(jù)庫中,基本的實(shí)體列表如下:

?工作人員

?部門

?工程項(xiàng)目

?工程項(xiàng)目接收方

在繪制實(shí)體-關(guān)系圖(E-R圖)時,實(shí)體出現(xiàn)在矩形中。如圖1-3所示。

部門

工作人員-----------

___________工程項(xiàng)目

項(xiàng)目接收方

圖1-3表示實(shí)體的E-R圖

一般來說,每個實(shí)體都相當(dāng)于數(shù)據(jù)庫中的一個表。

上面介紹的實(shí)體都是強(qiáng)實(shí)體,每個實(shí)體都有自己的鍵。但是在實(shí)際領(lǐng)域中,經(jīng)常存在

一些實(shí)體,它們沒有自己的鍵,這樣的實(shí)體稱為弱實(shí)體。弱實(shí)體中不同的記錄有可能完全

相同,難以區(qū)別,這些值依賴于另一個實(shí)體(強(qiáng)實(shí)體)的意義,必須與強(qiáng)實(shí)體聯(lián)合使用。有

關(guān)弱實(shí)體的具體問題,本書不作具體介紹,有興趣的讀者可以參考相關(guān)數(shù)據(jù)庫設(shè)計(jì)書籍。

在創(chuàng)建了實(shí)體之后,就可以標(biāo)識各個實(shí)體的屬性了。

1.5.3屬性

每個實(shí)體都有一組特征或性質(zhì),稱為實(shí)體的屬性。實(shí)體的屬性值是數(shù)據(jù)庫中存儲的主

要數(shù)據(jù),一個屬性實(shí)際上相當(dāng)于表中的一個列。

下面來看看“工作人員”(Employee)實(shí)體。這個實(shí)體具有哪些屬性呢?對每個工作人

員來說,都具有名字(name)、生日(birthday)、住址(address)、目前所在城市(city)、性別(sex)。

同時在公司中每個工作人員還有職員ID號(id)、工資(salary)和所屬部門號(dno)等屬性。所

以關(guān)于“工作人員”Employee的屬性如下:

?名字(name)

?生日(birthday)

?住址(address)

?目前所在城市(city)

?性別(sex)

?職員ID號(id)

?工資(salary)

?所屬部門號(dno)

實(shí)體“部門"Department包含的屬性如下:

?部門名稱(dname)

?部門號(dnumber)

?部門領(lǐng)導(dǎo)ID號(mgrid)

?部門領(lǐng)導(dǎo)開始領(lǐng)導(dǎo)工作日期(mgrstrdate)

實(shí)體“項(xiàng)目"Project包含的屬性如下:

?工程名稱(pname)

?工程項(xiàng)目號(pnumber)

?工程項(xiàng)目負(fù)責(zé)人ID號(pmgrid)

?工程預(yù)算(budget)

?工程預(yù)計(jì)總收入(gross)

?工程開始時間(pstrdate)

?工程預(yù)計(jì)結(jié)束時間(penddate)

實(shí)體“項(xiàng)目接收方"Paccepter包含的屬性如下:

?接收方名稱(accepter)

?工程項(xiàng)目號(pnumber)

?接收方所在城市(city)

?預(yù)計(jì)接收時間(accedate)

在繪制E-R圖中,屬性由橢圓包圍,在屬性和它所屬的實(shí)體間使用直線進(jìn)行連接,以

實(shí)體Department為例進(jìn)行示例,如圖1?4所示。

圖1-4包含屬性的Department的E-R圖

對于每個實(shí)體,都有其確定的主屬性(實(shí)體中的主屬性實(shí)際上相當(dāng)于表中的主鍵)。以

Employee實(shí)體為例,在其屬性中可以以name和birthday的組合作為主屬性,即表Employee

的主鍵。因?yàn)樵诂F(xiàn)實(shí)生活中,一家公司內(nèi)部有兩個員工同名而且同時生日的情況極其少見。

這個組合是惟一可以確定實(shí)體Employee中的每個記錄的。但是僅用職員ID就可以惟一地

確定實(shí)體Employee的每個記錄,因?yàn)樵谝患夜局忻總€職員的ID都是不相同的,也可以

以職員ID作為主屬性,且肯定不可能出現(xiàn)重復(fù)。在有更好的主屬性可選擇的情況下,應(yīng)

該盡量選擇更好的主屬性,最好是創(chuàng)建一個單獨(dú)的屬性作為主屬性。

在實(shí)體Deparlment中可以選擇dnumber作為主屬性,而在實(shí)體Project中,每個項(xiàng)目

的名稱肯定是不會重復(fù)的,因此選擇pnumber作為主屬性,在實(shí)體Paccepter中也選擇

pnumber作為主屬性。

在繪制E-R圖中,主屬性在屬性下加下劃線來說明。以實(shí)體Department為例進(jìn)行示例,

如圖1-5所示。

有關(guān)SQL中主鍵定義的具體實(shí)現(xiàn),將在第3章中介紹。

注意:

在數(shù)據(jù)庫設(shè)計(jì)中,選擇和設(shè)置列作為主鍵是一個關(guān)鍵步驟。

1.5.4一對一關(guān)系

在數(shù)據(jù)庫中,一個表與另一個表之間存在一對一關(guān)系是可能的,通常情況下,當(dāng)一對

一關(guān)系在兩個表中存在時,為了簡便起見一般將兩個表合成一個表。

例如,數(shù)據(jù)庫中詳細(xì)記錄了每個員工的過去表現(xiàn),以往工作經(jīng)歷等信息,可以將其也

放在Employee表中,但是這些信息不常使用,可以將其存放在一個單獨(dú)的表中,以便在

進(jìn)行普通的查詢時不必訪問這些信息,以提高查詢速度。這樣這兩個表就具有了一對一的

關(guān)系。

注意:

一般來說,當(dāng)對數(shù)據(jù)庫的設(shè)計(jì)不是非常熟練時,應(yīng)當(dāng)盡量避免使用一對一關(guān)系。

1.5.5一對多關(guān)系

數(shù)據(jù)庫的數(shù)據(jù)之間往往具有較多的聯(lián)系,一對多關(guān)系也是比較多的一種。在上面的設(shè)

計(jì)中已經(jīng)為Company數(shù)據(jù)庫設(shè)計(jì)了4個實(shí)體,每個實(shí)體的屬性都已確定,主屬性也進(jìn)行了

標(biāo)識。

但是,一個數(shù)據(jù)庫中僅僅有這4個實(shí)體是不夠的,為了實(shí)際應(yīng)用必需發(fā)現(xiàn)實(shí)體之間的

聯(lián)系,表示出數(shù)據(jù)間的重要關(guān)系。

下面將給出一對多關(guān)系的定義,再看一看Company數(shù)據(jù)庫中存在的一對多關(guān)系。

在一個表中一個記錄可以與另一個表的若干記錄相對應(yīng)時就說兩個表之間存在一對

多關(guān)系。數(shù)據(jù)間的一對多關(guān)系通常簡記為1:N。

在Company數(shù)據(jù)庫中,部門與工作人員,項(xiàng)目與工作人員之間都具有一對多關(guān)系。每

個部門都包含多個工作人員,每項(xiàng)工程也由多個工作人員參加。以工程實(shí)體與工作人員實(shí)

體為例來介紹一對多關(guān)系的實(shí)體-關(guān)系圖的畫法,如圖1-6所示。

圖1-6一對多關(guān)系的E-R圖

1.5.6多對多關(guān)系

一對一和一對多關(guān)系并不足以涵蓋數(shù)據(jù)庫中的所有關(guān)系,例如部門與項(xiàng)目間并不一定

僅僅是一對一或一對多關(guān)系,一個部門可以同時進(jìn)行一個或多個項(xiàng)目,而一個項(xiàng)目可能也

需要多個部門的配合才能很好地完成。也就是說,部門與項(xiàng)目間存在著多對多的關(guān)系。數(shù)

據(jù)之間的多對多關(guān)系通常簡記為N:No圖1-7顯示了多對多關(guān)系的實(shí)體-關(guān)系圖。

圖1-7多對多關(guān)系的E-R圖

1.5.7E-R圖的繪制

實(shí)體-關(guān)系圖是表現(xiàn)實(shí)體-關(guān)系模型的圖形工具,簡稱E-R圖。首先介紹與E-R模型各

種成分相對應(yīng)的基本圖形符號,然后以Company數(shù)據(jù)庫為例,給出一個完整的數(shù)據(jù)庫的

E-R圖。圖1-8給出了在E-R圖中使用的各種元素的圖形符號。圖1-9給出了Company數(shù)

據(jù)庫的E-R圖。

實(shí)體關(guān)系

圖1-8E-R圖中使用的各種元素的圖形符號

圖1-9Company數(shù)據(jù)庫的完整E-R圖

在Company數(shù)據(jù)庫中:

實(shí)體之間的關(guān)系以菱形表示,關(guān)系中各方面的表通過直線與菱形中的關(guān)系名稱相連

接,例如項(xiàng)目與部門之間的關(guān)系標(biāo)為p_d;實(shí)體與關(guān)系相連的直線旁都根據(jù)關(guān)系的屬性標(biāo)

注有“1”或“N”,例如工作人員與部門之間為多對一關(guān)系,因此在工作人員與關(guān)系e_d

的連線旁標(biāo)記“N”,而在部門與關(guān)系e_d的連線旁標(biāo)記“1”。

在建立了實(shí)體-關(guān)系模型后數(shù)據(jù)庫的設(shè)計(jì)就剩下最后的一個步驟了。E-R圖為讀者的數(shù)

據(jù)庫提供了一個不錯的藍(lán)圖,設(shè)計(jì)過程的最后一步使用規(guī)范化對數(shù)據(jù)進(jìn)行處理獲得對數(shù)據(jù)

庫完整性的控制權(quán)。

1.5.8回顧

在進(jìn)入下一節(jié)之前,先回顧一下概念數(shù)據(jù)庫的設(shè)計(jì),其中主要是實(shí)體-關(guān)系模型的建立。

簡要總結(jié)一下實(shí)體-關(guān)系模型建立的步驟:

(1)對需求進(jìn)行分析,從而確定系統(tǒng)中所包含的實(shí)體。

(2)分析得出每個實(shí)體所具有的屬性。

(3)保證每個實(shí)體有一個主屬性,該主屬性可以是實(shí)體的一個屬性或多個屬性的組合。

主屬性必須能惟一地描述每個記錄.

(4)確定實(shí)體之間的關(guān)系。

經(jīng)過這些步驟后,讀者就可以繪制出E-R圖。之后可以再看看數(shù)據(jù)庫的需要,判斷是

否獲取了所需的信息,是否有遺漏信息等,讀者可以再對E-R圖進(jìn)行修改,添加或刪除實(shí)

體與屬性。

1.6邏輯數(shù)據(jù)庫設(shè)計(jì)

在邏輯數(shù)據(jù)庫的設(shè)計(jì)中主要任務(wù)是將概念數(shù)據(jù)庫轉(zhuǎn)化為邏輯數(shù)據(jù)庫及關(guān)系模式的規(guī)

范化。本節(jié)中也將主要介紹這兩項(xiàng)內(nèi)容,有關(guān)邏輯數(shù)據(jù)庫設(shè)計(jì)的其他內(nèi)容,有興趣的讀者

可以自己參考一些資料。

1.6.1將實(shí)體和關(guān)系轉(zhuǎn)化為關(guān)系模式

實(shí)體-關(guān)系模型建立后,就可以將實(shí)體、實(shí)體間的關(guān)系等模型結(jié)構(gòu)轉(zhuǎn)變?yōu)殛P(guān)系模式,即

生成數(shù)據(jù)庫中的表,并確定表的列。下述討論由實(shí)體-關(guān)系模型生成表的方法。

1.實(shí)體轉(zhuǎn)化為表

對實(shí)體-關(guān)系模型中每個實(shí)體,建立一個表,表的列就是實(shí)體所具有的屬性,主屬性就

作為表的主鍵,在表中也用下劃線標(biāo)記表的鍵。如上面建立的實(shí)體-關(guān)系模型中,所有實(shí)體

轉(zhuǎn)化為表,如圖1-10所示。

表Employee表Project表Department表Paccepter

namepnamedname^number

birthday

◎numberdnumberaccepter

address

pmgridmgridaddress

city

budgetmgrstrdatc

sexgross

溫馨提示

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

評論

0/150

提交評論