第1章關系數據庫設計_第1頁
第1章關系數據庫設計_第2頁
第1章關系數據庫設計_第3頁
第1章關系數據庫設計_第4頁
第1章關系數據庫設計_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第1章關系數據庫設計

SQL語言及采用SQL語言的關系數據庫系統(tǒng)是計算機中重要的基礎技術之一。在使

用任何數據庫之前,都必須設計好數據庫,包括將要存儲的數據的類型,數據之間的相互

關系以及數據的組織形式.本章將對SQL語言進行簡要的介紹,并詳細地介紹如何進行數

據庫的設計。

本章主要內容:

?SQL簡史及功能特性

?關系數據模型

?關系操作

?數據庫設計概述

?概念數據庫設計

?邏輯數據庫設計

?完整性

?數據庫設計的其他問題

?回顧數據庫設計

1.1SQL簡史及功能特性

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

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

1.1.1SQL簡史

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

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

系數據模型”的論文,在該文中描述了關于數據如何在表中存儲和處理的數學理論。70年

代中期,IBMSanJose研究實驗室把SQL作為一種新型關系數據模型的數據庫語言設計出

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

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

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

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

SQL的發(fā)音為sequeL

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

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

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

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

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

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

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

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

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

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

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

解決方案。

關系型數據庫管理系統(tǒng)市場的激烈競爭導致出現了各種各樣的SQL實現版本,每一種

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

國國家標準化學會(AmericanNationalStandardInstitute,ANSI)和國際標準化組織

(InternationalStandardOrganization,ISO)發(fā)布的ANSI/ISO標準正式確認SQL的標準地位,

這是SQL在市場中確定地位最重要的一點。并且在1992年與1999年先后進行了修訂,現

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

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

器結構的關鍵部分,通過網絡實現數據庫的連接與使用變得越來越普遍,現在已經可以基

于Web應用程序來實現遠程訪問數據庫。

1.1.2SQL的功能與特性

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

用戶提供強大的功能,使用戶可以方便地進行數據庫的管理以及數據的操作。通過控制

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

?數據定義:SQL能讓用戶自己定義所存儲數據的結構,以及所存儲數據各項之間

的關系。這樣用戶就可以按自己的需要方便地進行數據的組織。

?數據更新:SQL為用戶和應用程序提供了添加、刪除、修改等數據更新操作,使

用戶或應用程序可以向數據庫中增加新的數據,刪除舊的數據以及修改已有數據,

有效地支持了數據庫數據的更新。

?數據查詢:SQL使用戶或應用程序可以從數據庫中按照自己的需要查詢數據并組

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

嵌套、視圖等復雜的檢索,為用戶和應用程序提供了很好的數據查詢方法。

?數據安全:SQL能對用戶和應用程序訪問數據、添加數據等操作的權限進行限制,

以防止未經授權的訪問,有效地保護數據庫的安全。

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

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

?數據庫結構的修改:SQL使用戶或應用程序可以修改數據庫的結構。

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

很好的可操作性。

SQL是一種易于理解的語言,同時又是綜合管理數據的工具。作為現在數據庫市場普

遍應用的語言,它具有以下一些特性。

?確定的標準:美國國家標準化學會(ANSI)和國際標準化組織(ISO)在1986年制訂

了SQL的標準,并在1989年、1992年與1999年進行了3次擴展,使得所有生產

商都可以按照統(tǒng)一標準實現對SQL的支持,SQL語言在數據庫廠家之間具有廣泛

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

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

?軟件提供商的獨立性:現在所有主流的DBMS軟件提供商均提供對SQL的支持,

SQL標準的確立使不同的生產商可以獨立地進行DBMS軟件的設計,一個基于

SQL的數據庫和使用該數據庫的應用程序能很方便地從一種DBMS系統(tǒng)轉向另一

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

中使用。

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

等各種計算機上運行,也支持在不同的操作系統(tǒng)上運行,同時也可以通過網絡進行

訪問和管理。

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

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

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

?程序化數據庫訪問:SQL語句既能用于交互式訪問也能用于程序化訪問,這樣應

用程序就具有很大的靈活性,可以將這兩種方式結合起來設計更好的程序。

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

隨著計算機技術的發(fā)展,客戶機/服務器體系結構隨著PC革命的到來應運而生,

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

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

作為Internet數據訪問標準,在應用中充當了新的角色,建立了以SQL作為應用程

序和數據庫連接的標準:最新出現的Java也己經引入了SQL,SQL在最新的編程

語言中也有了有效的應用。

?數據的多視化:可以通過使用SQL產生不同的報表和視圖將數據庫中的數據按用

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

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

?可擴展性和對象:面向對象編程技術的興起,數據庫市場也面臨了對象技術的

入,各個SQL數據庫生產商也正在擴展和提高SQL對對象的支持。

SQL的以上特性,使得SQL在個人計算機、小型計算機和大型計算機上作為管理數

據的標準工具出現,占據了大部分的市場。

1.1.3SQL3簡介

SQL標準是為了在各個開發(fā)商之間達成高度的一致性來達到提高市場上所有數據庫

產品的通用性而制定的一個國際標準,每次該標準的更新都為SQL添加了新的特征和新的

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

面向對象數據類型的擴展功能。

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

標準中,SQL語句可以大體分為:數據定義語句(DataDefinitionLanguage,DDL)、數據操

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

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

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

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

而SQL-3標準提出了一種新的語句分類方式,將它所現有的SQL語句分為7種核心

的類型,而這些SQL-3標準的語句類試圖使每一個類型和那些語句能更加準確并且更有邏

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

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

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

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

DISCONNECT語句。

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

語句。

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

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

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

語句。

?模式語句:該類語句可以操作數據庫模式及其內部的元素,如ALTER語句、

CREATE語句和DROP語句。

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

語句。

?事務語句:該語句用來設置一個事務處理的開始點和結束點,如COMMIT語句

和ROLLBACK語句。

從SQL-3標準的這些語句類可以明顯看出,與以前的SQL標準相比,SQL-3標準更

適合對面向對象的數據類型進行處理。

除了上述的語句分類方式的變化,使新的方式更適合處理面向對象的數據,SQL-3標

準還增加了一些新的數據庫元素以增強SQL對面向對象數據類型的處理。這些新增數據庫

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

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

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

的SQL標準中,所有的數據類型都是預定義的,但是,在SQL-3標準中新增的CREATE

TYPE、ALTERTYPE和DROPTYPE語句應用了對象/關系概念,可以使用它們來進行用

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

之前簡單講述了SQL-3標準提供的一系列可以處理面向對象數據類型的擴展功能的

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

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

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

發(fā)商必須達到Entry級別才可以聲明其產品符合ANSI/SQL標準。而SQL-3修訂了關于一

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

強SQL-3標準(EnhancedSQL-3)。其中,CoreSQL-3標準包括SQL-2中的Entry級的特征

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

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

須實現SQL-3的一致性級別的CoreSQL-3級,只要是支持CoreSQL-3一致性級別的數據

庫產品再加上SQL-39個附加特征包中的任意一個或多個就可以說是滿足增強SQL-3標

準。因為一致性級別只與開發(fā)商密切相關,不屬于本書實用教程的討論范圍,所以書中不

進行詳細討論。

除了上面討論的SQL-3標準的特色,新的語句分類形式,新增的數據庫元素和進一步

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

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

個不同的例子,如下。

(1)在SQL-3中,空值NULL的使用方式不同于舊標準。在SQL-3中,約束檢驗時,

NULL的值是UNKNOWN而不是舊標準的TRUE或FALSE。

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

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

有條件的更新操作,例如可以在兩個表的UNIONJOIN結果中進行這些數據的更新操作。

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

JOIN結果中就有11歹下面進行如下操作:

?INSERT一個新記錄行

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

存入第二個表中。

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

存入第一個表中。

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

?UPDATE操作

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

的數據。

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

的數據。

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

?DELETE操作

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

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

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

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

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

SELECTname

FROMEmployee

ORDERBYid

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

SELECTsalary*12

FROMEmployee

ORDERBYsalary*12

1.2關系數據模型

關系數據模型的設計是關系數據庫設計中重要也是基礎的一步。關系數據模型的設計

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

的定義與應用。

1.2.1數據結構

每一個系統(tǒng)都有其自己的數據結構。關系數據庫管理系統(tǒng)組織并構造數據,以使數據

能被用戶或應用程序檢索與更新。由DBMS提供的數據結構和訪問方法被稱為DBMS的

數據模型。數據模型決定了DBMS的性能及其適應的范圍。

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

結構就是關系。在實際表示中,關系可以用一個表來直觀地表示,通常表是以一種矩形數

據行/列的形式表示。表的每一列表示關系的一個屬性,每列的名字即為一個屬性名,每一

行表示一個記錄代表一個物理實體。關系數據庫中,所有的數據都是通過表來進行存儲的,

可以說如果沒有表數據就無法進行存儲和表示。

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

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

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

數據項,記錄工作人員的一部分信息。例如,職員ID列用來存儲每個工作人員的職員ID,

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

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

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

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

表1-1關系模式實例

姓名職員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ī)則是:所有數據都必須在表中所有關系模型中呈現

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

哪種關系數據庫產品,不論其采用的是什么物理存儲方式,查詢和處理數據的方式都是

相同的。

具體來說,數據的獨立性表現在兩個重要的方面:物理獨立性和邏輯獨立性。

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

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

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

詳細介紹)。

邏輯獨立性指的是,可以改變表、行和列之間的相互關系,即對數據結構進行修改而

不會削弱應用程序特別是查詢的功能。

1.2.2鍵與外部鍵

每個表表示的是現實世界中的數據集合,表中有多個列名,需要一個或一組屬性來表

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

?候選鍵:包含獨立的標識數據庫中每一行值的任意一個列或一組列。

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

一個值)。

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

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

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

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

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

性規(guī)則(uniquenessproperty)?

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

(irreducabilityproperty)?

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

標識表中的每一行,都表現出惟一性;但是列{職員ID}顯然是列組{姓名,職員ID,生日}

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

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

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

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

注意:

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

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

表B的主屬性,則稱X是表A關于表B的外部鍵。

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

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

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

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

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

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

1.3關系操作

對所有的關系數據庫來說,有大量的操作方式可以使用,這些實用的操作方式能讓用

戶看到所需要的數據。

由前面介紹的物理獨立性和數據獨立性可以讓用戶不必擔心數據的具體存儲位置,也

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

指定任何關于數據存儲位置和尋找方式的細節(jié)就可以表示需要的內容。

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

SELECTselectjist

FROMtablejist

WHEREsearch_conditions

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

據,WHERE子句則指定檢索條件。

下面介紹關系數據庫中定義的3個具體的操作方式。

注意:

現在不必在意SQL語法的使用,關鍵是要理解所述操作的概念。

1.3.1選擇

選擇操作是從表中返回特定行的集合。選擇操作也可以稱為限制,因為它限制了返回

行集合的標準。限制條件只適合于被返回的行,不適合包括在查詢結果中的列。要指定限

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

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

SELECT*

FROMDepartment

WHEREdnumber<5

下面是選擇結果:

Results

dnumberdnamemgridmgrstrdate

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

2市場部20012002-3-1

3人事部30012001-4-5

4技術部40012001-1-15

[4rows]

1.3.2投影

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

中各列的具體的子集,是通過將具體的列清單傳遞給SELECT語句來實現的,即在SELECT

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

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

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

SELECTdname,mgrid,mgrstrdatc

FROMDepartment

下面是投影結果:

Results

dnumbermgridmgrstrdate

110012001-11-3

220012002-3-1

330012001-4-5

440012001-1-15

550012002-6-5

66(X)12002-3-10

[6rows]

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

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

例如,只想知道部門號小于5的部門的負責人的職員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連接

連接操作是結合多個表的關系操作,為了查詢特定數據而將兩個或更多個表連接起來

形成新的報表或視圖,以便用戶能夠比較和對比數據庫不同表中的數據,為用戶提供了更

多的功能和靈活性??梢酝ㄟ^連接來發(fā)現數據之間的關系,找出數據之間的聯系,而不僅

僅局限于數據庫中已有的一些關系。

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

間相關的列來連接不同表中的數據,用戶可以在其中設定想指定的條件。詳細的連接操作

的實現將在第7章中進行介紹。

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

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

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

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

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

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

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

由于共享列的存在,可以使用下面的語句來實現上面的連接操作:

SELECTname,sex,id,salary,dno

FROMEmployee,Department

WHERE=er

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

相等時進行連接。

下面是連接結果:

Results

namesexidsalarydno

林志千男10016000.001

陳廣海男20015000.002

張宇男30015000.003

張峰男40017000.004

李志深男50015000.005

魏成男60015000.006

[6rows]

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

是因為一致性(即最小冗余性)、方便性及性能的要求,表中的列數必須有限制。在下面的

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

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

作結合起來使用。

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

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

SELECTname,salary

FROMEmployee,Department

WHERE=er

AND<5

下面是連接結果:

Results

namesalary

林志千6000.00

陳廣海5000.00

張宇5000.00

張峰7000.00

[4rows]

1.4數據庫設計概述

在詳細介紹如何進行數據庫的設計之前,我們先介紹一下有關數據庫模型準則及數據

庫設計過程,使讀者對數據庫設計有一個大致的了解。

1.4.1數據庫模型準則

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

論文中提出了數據庫模型定義的12條準則。

?信息準則:關系型數據庫(包括表和列名)中所有的信息都必須清楚地用表中的數

值來表示。

?確保訪問準則:必須保證關系數據庫中的每一個數值都可用表名、主鍵和列名的

組合來訪問。

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

型,如字符串、數字等數據類型)應提供系統(tǒng)支持??罩蹬c默認值不同,它獨立于

任何數據類型。

?數據字典準則:應支持主動的、在線的關系型數據字典。在邏輯上,數據庫的描

述及其內容都被表示為表的形式,并能用數據庫語言進行查詢。

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

語言應具有嚴格、統(tǒng)一的語法格式,而且必須支持數據定義、視圖定義、數據操作、

完整性規(guī)則、授權和事務處理。

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

?集合準則:DBMS應該不僅僅支持集合級上的檢索,而且支持集合級上的插入操

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

?物理數據準則:物理數據必須具有獨立性,即當數據的存儲結構或數據的物理存

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

?邏輯數據準則:邏輯數據應具有獨立性,即當表的結構改變時,應用程序和其他

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

?數據完整性準則:數據庫語言必須能夠定義完整性規(guī)則,這些規(guī)則必須存儲在聯

機數據字典中,不能被忽略。

?分布準則:應支持分布的獨立性,當首次引入分布式數據或數據重新分布時,應

用程序和其他特殊程序在邏輯上應不受影響。

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

事件。

在實現關系數據庫模型時必須滿足上述12條標準。

準則一基本上是有關數據庫信息的定義。

準則二強調表中主鍵的重要性,要求能通過表名正確訪問表,通過列名訪問列,而主

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

準則三強調空值的處理。

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

可以描述數據庫自身的結構。

準則五要求數據庫支持關系數據語言,如SQL.通過SQL語言實現DBMS要求的數

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

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

便地完成特殊功能。

準則七強調對集合的支持,能進行集合運算:交、并、差等。

準則八與準則九強調了應用程序與物理數據、邏輯數據之間的獨立性,以保證低層數

據庫結構發(fā)生改變時,不會影響應用程序對數據的操作。

準則十強調數據庫的完整性,要求保證添加和修改數據時確保數據及數據之間的正確性。

準則十一要求能對分布數據進行處理。

準則十二限制了其他訪問數據庫的方法,以保證數據庫結構不受破壞。

1.4.2數據庫設計過程

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

要有深入的了解,只有一個對所有這些因素都很了解的數據庫設計專家,他設計的數據庫

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

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

關系,在使用SQL進行報表的生成、子查詢及視圖等操作時,可以更好地進行操作。

在開始介紹設計方法之前,先介紹好的數據庫及差的數據庫的一些品質,這將有助于

讀者更好地掌握數據庫的設計。

一般來說,好的數據庫應該滿足以下條件。

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

讀取和理解,數據之間的關系無法在計算機屏幕或輸出頁中完整地顯示,因此好的

數據庫應該便于用戶檢索所需要的數據。

?具有較高的完整性、數據更新的一致性:好的數據庫應該能防止不一致信息的引

入,避免因各種問題而出現的數據的不完整和數據之間的不一致。

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

當然,這3種品質之間也會有一些妥協。

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

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

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

因此在設計數據庫時應該平衡它們中的每一項,使之適合應用程序。當然好數據庫最

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

相對而言,設計得不好的數據庫或多或少與好的數據庫的品質相反,在數據的檢索、

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

征可以幫助用戶判斷什么是設計得不好的數據庫:

?需要多次輸入相同的數據,或需要輸入多余的數據。

?返回不正確的查詢結果。

?數據之間的關系難以確定。

?表或列的名稱不明確。

在數據庫的設計中,應盡量保證設計的數據庫具有好的特征,同時應盡量避免具有上

述一些不好的特征。

下面將詳細地介紹數據庫的設計過程。

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

種信息要求和操作要求進行詳細地分析,了解應用領域中數據項、數據項之間的關系和所

有的數據操作的詳細要求,了解哪些因素對響應時間、可用性和可靠性有較大的影響等各

方面的因素。

這些就需要設計人員與相關人員進行各種交流,了解數據庫需要完成的功能,數據項

的定義等。例如,以本書使用的簡單的數據庫示例為例,設計人員需要與有關人員進行交

流以確定部門與工程、工作人員和部門、工作人員與工程之間的關系,同時確定每個數據

項,如工作人員,應該包含哪些數據等,只有完成這些必要的信息收集后,數據庫的設計

才能順利地進行下去。

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

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

慮屬性與數據類型的關系,應該放置于哪個數據類型中。

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

形成表,如“工作人員”就是一個實體,屬性則為表中的列,如對應于實體“工作人員”

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

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

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

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

接下來就應該確定實體之間的關系,確定是一對一、一對多還是多對多的關系。例如

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

一對多關系。一般來說是根據現實中的情況來確定實體之間的關系,從而形成實體-關系模

型。有關內容將在本章的1.5節(jié)中進行詳細介紹。

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

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

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

體內容將在第11章中介紹。

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

必要修改和完善。

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

記?。悍椒ú⒉皇亲钪饕模匾氖墙Y果。

1.5概念數據庫設計

概念數據庫的設計是進行具體數據庫設計的第一步,概念數據庫設計的好壞直接影響

到邏輯數據庫的設計,影響到整個數據庫的好壞。

1.5.1概述

概念數據庫的設計應該極易于轉換為邏輯數據庫模式,又容易被用戶所理解。概念數

據庫設計中最主要的就是采用實體■?關系數據模型來確定數據庫的結構。

數據是表達信息的一種重要的量化符號,是信息存在的一種重要形式。數據模型則是

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

模型包含兩方面內容。

(1)數據的靜態(tài)特性:主要包括數據的基本結構、數據間的關系和數據之間的相互約

束等特性。

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

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

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

據庫設計人員與用戶之間進行交流的共同基礎。概念數據庫中采用的實體-關系模型,與傳

統(tǒng)的數據模型有所不同。實體-關系模型是面向現實世界,而不是面向實現方法的,它主要

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

學,且使用方便,因而在數據庫系統(tǒng)應用的設計中,得到了廣泛應用。

實體-關系模型可以用來說明數據庫中實體的等級和屬性。以下是實體-關系模型中的

重要標識:

?在數據庫中存在的實體

?實體的屬性

?實體之間的關系

下面就介紹一下實體-關系數據模型中的3個基本要素,即實體、關系和屬性的有關基

本知識。

1.5.2實體

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

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

數據庫中,基本的實體列表如下:

?工作人員

?部門

?工程項目

?工程項目接收方

在繪制實體-關系圖(E-R圖)時,實體出現在矩形中。如圖1-3所示。

部門

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

___________工程項目

項目接收方

圖1-3表示實體的E-R圖

一般來說,每個實體都相當于數據庫中的一個表。

上面介紹的實體都是強實體,每個實體都有自己的鍵。但是在實際領域中,經常存在

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

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

關弱實體的具體問題,本書不作具體介紹,有興趣的讀者可以參考相關數據庫設計書籍。

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

1.5.3屬性

每個實體都有一組特征或性質,稱為實體的屬性。實體的屬性值是數據庫中存儲的主

要數據,一個屬性實際上相當于表中的一個列。

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

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

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

以關于“工作人員”Employee的屬性如下:

?名字(name)

?生日(birthday)

?住址(address)

?目前所在城市(city)

?性別(sex)

?職員ID號(id)

?工資(salary)

?所屬部門號(dno)

實體“部門"Department包含的屬性如下:

?部門名稱(dname)

?部門號(dnumber)

?部門領導ID號(mgrid)

?部門領導開始領導工作日期(mgrstrdate)

實體“項目"Project包含的屬性如下:

?工程名稱(pname)

?工程項目號(pnumber)

?工程項目負責人ID號(pmgrid)

?工程預算(budget)

?工程預計總收入(gross)

?工程開始時間(pstrdate)

?工程預計結束時間(penddate)

實體“項目接收方"Paccepter包含的屬性如下:

?接收方名稱(accepter)

?工程項目號(pnumber)

?接收方所在城市(city)

?預計接收時間(accedate)

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

實體Department為例進行示例,如圖1?4所示。

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

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

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

的主鍵。因為在現實生活中,一家公司內部有兩個員工同名而且同時生日的情況極其少見。

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

確定實體Employee的每個記錄,因為在一家公司中每個職員的ID都是不相同的,也可以

以職員ID作為主屬性,且肯定不可能出現重復。在有更好的主屬性可選擇的情況下,應

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

在實體Deparlment中可以選擇dnumber作為主屬性,而在實體Project中,每個項目

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

pnumber作為主屬性。

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

如圖1-5所示。

有關SQL中主鍵定義的具體實現,將在第3章中介紹。

注意:

在數據庫設計中,選擇和設置列作為主鍵是一個關鍵步驟。

1.5.4一對一關系

在數據庫中,一個表與另一個表之間存在一對一關系是可能的,通常情況下,當一對

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

例如,數據庫中詳細記錄了每個員工的過去表現,以往工作經歷等信息,可以將其也

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

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

關系。

注意:

一般來說,當對數據庫的設計不是非常熟練時,應當盡量避免使用一對一關系。

1.5.5一對多關系

數據庫的數據之間往往具有較多的聯系,一對多關系也是比較多的一種。在上面的設

計中已經為Company數據庫設計了4個實體,每個實體的屬性都已確定,主屬性也進行了

標識。

但是,一個數據庫中僅僅有這4個實體是不夠的,為了實際應用必需發(fā)現實體之間的

聯系,表示出數據間的重要關系。

下面將給出一對多關系的定義,再看一看Company數據庫中存在的一對多關系。

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

多關系。數據間的一對多關系通常簡記為1:N。

在Company數據庫中,部門與工作人員,項目與工作人員之間都具有一對多關系。每

個部門都包含多個工作人員,每項工程也由多個工作人員參加。以工程實體與工作人員實

體為例來介紹一對多關系的實體-關系圖的畫法,如圖1-6所示。

圖1-6一對多關系的E-R圖

1.5.6多對多關系

一對一和一對多關系并不足以涵蓋數據庫中的所有關系,例如部門與項目間并不一定

僅僅是一對一或一對多關系,一個部門可以同時進行一個或多個項目,而一個項目可能也

需要多個部門的配合才能很好地完成。也就是說,部門與項目間存在著多對多的關系。數

據之間的多對多關系通常簡記為N:No圖1-7顯示了多對多關系的實體-關系圖。

圖1-7多對多關系的E-R圖

1.5.7E-R圖的繪制

實體-關系圖是表現實體-關系模型的圖形工具,簡稱E-R圖。首先介紹與E-R模型各

種成分相對應的基本圖形符號,然后以Company數據庫為例,給出一個完整的數據庫的

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

據庫的E-R圖。

實體關系

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

圖1-9Company數據庫的完整E-R圖

在Company數據庫中:

實體之間的關系以菱形表示,關系中各方面的表通過直線與菱形中的關系名稱相連

接,例如項目與部門之間的關系標為p_d;實體與關系相連的直線旁都根據關系的屬性標

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

的連線旁標記“N”,而在部門與關系e_d的連線旁標記“1”。

在建立了實體-關系模型后數據庫的設計就剩下最后的一個步驟了。E-R圖為讀者的數

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

庫完整性的控制權。

1.5.8回顧

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

簡要總結一下實體-關系模型建立的步驟:

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

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

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

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

(4)確定實體之間的關系。

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

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

體與屬性。

1.6邏輯數據庫設計

在邏輯數據庫的設計中主要任務是將概念數據庫轉化為邏輯數據庫及關系模式的規(guī)

范化。本節(jié)中也將主要介紹這兩項內容,有關邏輯數據庫設計的其他內容,有興趣的讀者

可以自己參考一些資料。

1.6.1將實體和關系轉化為關系模式

實體-關系模型建立后,就可以將實體、實體間的關系等模型結構轉變?yōu)殛P系模式,即

生成數據庫中的表,并確定表的列。下述討論由實體-關系模型生成表的方法。

1.實體轉化為表

對實體-關系模型中每個實體,建立一個表,表的列就是實體所具有的屬性,主屬性就

作為表的主鍵,在表中也用下劃線標記表的鍵。如上面建立的實體-關系模型中,所有實體

轉化為表,如圖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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論