- SQL Server 2008實用教程(第3版)
- 蔣文沛
- 1767字
- 2021-01-15 19:06:17
1.4 數(shù)據(jù)庫設(shè)計
1.4.1 關(guān)系數(shù)據(jù)庫設(shè)計原則
SQL Server是典型的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。關(guān)系數(shù)據(jù)庫的設(shè)計是為了生成一組關(guān)系模式,使人們既不需存儲不必要的冗余信息,又方便獲取信息。數(shù)據(jù)庫設(shè)計的方法是首先建立 E-R 模型,然后將E-R模型轉(zhuǎn)換為關(guān)系模型,最后對關(guān)系模型進(jìn)行規(guī)范化處理。
本節(jié)以一個簡化的銷售數(shù)據(jù)庫為實例,講解了數(shù)據(jù)庫的設(shè)計和規(guī)范化過程,目的是使讀者了解這一設(shè)計過程。讀者可以在學(xué)習(xí)之后再對該數(shù)據(jù)庫進(jìn)行適當(dāng)?shù)臄U(kuò)充和完善。
1.4.2 關(guān)系規(guī)范化
1.建立E-R模型
E-R(Entity-Relationship,實體-聯(lián)系)模型是用E-R圖來表示的,它是企業(yè)運(yùn)營方式的信息化描述。企業(yè)規(guī)則的變化直接影響著E-R圖的結(jié)構(gòu)和實體間的聯(lián)系。E-R圖直觀易懂,是系統(tǒng)開發(fā)人員和企業(yè)客戶之間很好的溝通媒介。E-R圖有3個要素。
(1)實體。實體指客觀存在并可相互區(qū)分的事物,可以是人、物,也可以是某些概念或事物與事物之間的聯(lián)系,例如員工、商品、銷售等實體。在E-R圖中使用矩形框表示,框內(nèi)寫上實體名。
(2)屬性。屬性指實體具有的特征。例如,員工實體的屬性有編號、姓名、性別、部門、電話、地址等;銷售實體的屬性有銷售編號、商品編號、數(shù)量、售出時間等。在 E-R 圖中使用橢圓框表示,框內(nèi)寫上屬性名,并用無向邊與其實體相連。
(3)聯(lián)系。聯(lián)系指實體之間的相互關(guān)聯(lián),實體間的聯(lián)系可以分為一對一、一對多、多對多3種類型。例如,員工實體和銷售實體之間的聯(lián)系是“員工進(jìn)貨”,這是一對多的聯(lián)系,即一個員工可以有多次銷售記錄,一次銷售記錄只可以由一個員工完成。聯(lián)系在 E-R 圖中使用用菱形框表示,并以適當(dāng)?shù)暮x命名,名字寫在菱形框中,用無向連線將參加聯(lián)系的實體矩形框分別與菱形框相連,并在連線上標(biāo)明聯(lián)系的類型,即1-1、1-N或N-M。
銷售數(shù)據(jù)庫的E-R圖表示如圖1.1所示。

圖1.1 銷售數(shù)據(jù)庫的E-R圖
2.E-R圖轉(zhuǎn)換為關(guān)系模型
在關(guān)系數(shù)據(jù)庫中,關(guān)系模型就是用二維表格來表示實體及實體之間聯(lián)系的模型。將 E-R 圖轉(zhuǎn)換為關(guān)系模型的方法是:將一個實體或一個聯(lián)系轉(zhuǎn)換為一個表,實體的屬性以及聯(lián)系的屬性就是表中的列,實體標(biāo)識符就是表的主關(guān)鍵字。
將圖1.1所示的銷售數(shù)據(jù)庫的E-R圖轉(zhuǎn)換為關(guān)系模型,則有以下3個表。
(1)用Employees表表示員工實體,該表有編號、姓名、性別、部門、電話、地址等列。編號是該表的主鍵,能唯一地標(biāo)識表中的每一行。
(2)用 Goods 表表示員工進(jìn)貨聯(lián)系,該表有商品編號、商品名稱、生產(chǎn)廠商、進(jìn)貨價、零售價、數(shù)量、進(jìn)貨時間、進(jìn)貨員工編號等列。商品編號是該表的主鍵,能唯一地標(biāo)識表中的每一行。
(3)用Sell表表示商品銷售表實體,該表有銷售編號、商品編號、商品名稱、生產(chǎn)廠商、數(shù)量、售出時間、售貨員工編號等列。銷售編號是該表的主鍵,能唯一地標(biāo)識表中的每一行。
3.關(guān)系模型的規(guī)范化
規(guī)范化的目的是使表的結(jié)構(gòu)更加合理,消除存儲異常,減少數(shù)據(jù)冗余,便于插入、刪除和更新數(shù)據(jù),提高存儲效率。關(guān)系數(shù)據(jù)庫中可以使用3個規(guī)范化模式(范式)來對關(guān)系模型進(jìn)行規(guī)范化處理。3個范式如表1.1所示。
表1.1 規(guī)范化模式

下面對銷售數(shù)據(jù)庫關(guān)系模型中建立的3個表進(jìn)行規(guī)范化處理。
(1)是否滿足第一范式。Employees 表中的所有屬性都是不可再分割的數(shù)據(jù)項。例如,不能將員工的編號和姓名兩個屬性放在同一列中顯示,也不能將編號分割為“編”和“號”兩個列。Goods表和Sell表也都滿足第一范式的要求。
(2)在滿足第一范式的前提下,是否滿足第二范式。在Employees表中,每一行只表示一個員工的信息,通過主鍵編號可以唯一地確定一個員工的姓名、性別、部門、電話或地址等非主屬性,即Employees表的所有非主屬性都完全函數(shù)依賴于主鍵,所以Employees表滿足第二范式的要求。同樣分析Goods表和Sell表,也都滿足第二范式的要求。
注意,銷售數(shù)據(jù)庫中各個表的主鍵都只由一個屬性構(gòu)成,分析起來比較簡單。如果一個表的主鍵由兩個屬性構(gòu)成,則要判斷每一個非主屬性是完全函數(shù)依賴還是部分依賴于主鍵,如果是部分依賴,就要刪除產(chǎn)生部分依賴的非主屬性。例如,假設(shè)學(xué)生成績表的屬性為課程編號、學(xué)號、成績、考試時間,其中主鍵是“課程編號,學(xué)號”,而考試時間只依賴于主鍵中的“課程編號”這一部分,所以考試時間屬性是部分依賴于主鍵,應(yīng)該在此表中刪除。
(3)在滿足第二范式的前提下,是否滿足第三范式。在Sell表中,商品編號依賴于銷售編號,而商品名稱則依賴于商品編號,所以商品名稱傳遞依賴于銷售編號。Sell表不滿足第三范式的要求,應(yīng)該刪除商品名稱屬性,消除傳遞依賴關(guān)系。同樣分析Employees表和Goods表,也都滿足第三范式的要求。
- Puppet 4 Essentials(Second Edition)
- Java完全自學(xué)教程
- VSTO開發(fā)入門教程
- INSTANT CakePHP Starter
- App Inventor 2 Essentials
- Drupal 8 Development Cookbook(Second Edition)
- JBoss AS 7 Development
- Java Web開發(fā)任務(wù)教程
- Ajax與jQuery程序設(shè)計
- 自學(xué)Python:編程基礎(chǔ)、科學(xué)計算及數(shù)據(jù)分析
- 梔子貓的奇幻編程之旅:21天探索信息學(xué)奧賽C++編程
- RabbitMQ Essentials
- Unreal Engine Game Development Blueprints
- Deep Learning with TensorFlow(Second Edition)
- Python 3 Text Processing with NLTK 3 Cookbook