第七章 關聯式資料庫設 計
許明宗
大綱
o 建立關聯式資料庫的步驟
o 關聯式資料庫
o 正規化
o 分割資料表
o 資料表的關聯
o 資料表分割精靈
建立關聯式資料庫的步驟
系統規格/需求定義
概念設計
邏輯設計
實體建置
資料庫
資料關聯性(實體-關係)模型
實體資料型態定義 需求及資料的搜集
轉換為資料表及正規化
1
3
2 4
5 6
以實際的資料來建置資料庫
c 依據搜集到的資料以及使用需求,建立資料表
d 將資料輸入資料表中,檢查資料表的欄位、資 料類型等設計是否能夠滿足實際上的使用需求
e 分析資料表的內容,執行正規化
f 分析正規化後資料表之間的關聯性
g 建立正規化後的所有資料表
h 檢查是否滿足資料特性以及使用需求
資料來源與類型
資料庫的資料來源
因應組織未來發展所需要收集、整理的資料 需求訪談、資料庫規劃
目前實際應用的資料或是資料庫 報表(單據)、現有的 Excel 的工作表、或是其它的資料庫
調查、實驗所得到的資料 分析、瞭解資料的結構、類型
資料是由那些欄位(特性)所組成
欄位的特性(資料類型)關聯式資料庫
為何要使用關聯式資料庫
分割資料表的缺點
關聯式資料庫
鍵(Key)
索引(Index)
資料完整性
未分割的資料表
50 10
$500
$300
李華山 開發史
大學路15號 大鳥書局
95/3/2 002
趙得勝 15
$250 北游記
民生路6號 北大書城
95/2/27 001
趙得勝 20
$500 開發史
民生路6號 北大書城
95/2/27 001
20
$300
數量 訂價
李華山 台北雜誌
大學路15號 大鳥書局
95/3/2 002
趙得勝 台北雜誌
民生路6號 北大書城
95/2/27 001
業務 代表 書籍
連絡地址 名稱 訂書 客戶名稱
日期 訂單
編號
訂單及客戶 資料會重複
業務員資料 書籍資料會 會重複
重複
未分割的資料表 - 缺點
浪費儲存空間
部份資料被重複記錄,浪費儲存空間
增加資料輸入錯誤的可能性
因為不同的時間輸入相同的資料,可能產生輸 入錯誤(北大書城 Æ北大書局)
資料的修改不方便
當要修改資料時(台北雜誌 Æ 臺北雜誌),
需要逐筆記錄去尋找、修改
關聯式資料庫
基於關聯式資料模型(Relational Data Model)理 論,所設計的資料庫
其中資料表是由「資料行」(Column)和「資料 列」(Row)所組成
資料行 又稱為欄位(Field) 、屬性(Attribute)
同一個欄位裡的資料都具有相同的特性以及資料類型
可用來做為分類以及識別
資料列 又稱為記錄(Record)
一筆記錄代表一個完整的資料個體,由一個以上的欄位組成
關聯式資料庫 (cont’d)
從使用者的角度來看
資料表中資料的「關聯」
一筆記錄代表一個資料個體
一個欄位代表不同個體間具有的相同特性
透過列和欄的關聯,可以找到資料個體的某個特性 資料表之間的「關聯」
不同的資料表可能本身就有密不可分的關係 訂貨資料表有業務人員,和員工資料表產生關聯
為避免未分割資料的問題,會將資料表分割為許多不 同的資料表(正規化);這些分割出來的資料表之 間,也存在著「關聯」資料表中資料的關聯
50 10
$500
$300 開發史
大學路15號 大鳥書局
95/3/2 002
15
$250 北游記
民生路6號 北大書城
95/2/27 001
20
$500 開發史
民生路6號 北大書城
95/2/27 001
20
$300
數量 訂價
台北雜誌 大學路15號
大鳥書局 95/3/2
002
台北雜誌 民生路6號
北大書城 95/2/27
001
書籍 連絡地址 名稱
訂書 客戶名稱 日期
訂單 編號
一筆記錄代 表一個資料 個體
一個欄位代 表不同個體 間具有的相 同特性
透過列和欄
的關聯,可
以找到資料
個體的特性
資料表之間的關聯
鍵(Key)
關聯式資料庫由「鍵」來識別資料,而且資料表間也是 由「鍵」來建立彼此的關聯
候選鍵(Candidate Key):具有唯一性、最簡性的欄位 或欄位組合
唯一性( uniqueness ):在候選鍵的欄位中,不會有重複的資料
最簡性(irreducibility):由多個欄位組成的候選鍵,當中的任 何欄位組合,都不具有唯一性
資料表中的一個(一組)候選鍵,被用來做為識別記錄 的唯一性,稱為主索引鍵或主鍵(Primary Key)
其他沒被選上的候選鍵,則稱為「替代鍵(Alternate Key )」
外來鍵(Foreign Key)
資料表的欄位資料是來自於其它資料表的某一個欄位資料,則稱 該欄位為「外來鍵」
主索引鍵
主索引鍵是用來辨識記錄的欄位
具有唯一性(不允許重複)
當資料表中沒有一個欄位具有唯一性時,可以 利用多個欄位組合起來做為主索引鍵
具有唯一值的
「員工編號」可 做為主索引鍵
「姓名」可能會有 同名同姓,不適合 做為主索引鍵
「科目」加上「學 號」具有唯一值,
可做為主索引鍵
繼安 S2
大熊 S1
廠商名稱 廠商編號
供應商
P2 麵包 P1 牛奶
產品名稱 產品編號
產品種類
45 P2
S2
25 P1
S2
30 P2
S1
25 P1
S1
售價 產品名稱
廠商編號
產品售價表 主索
引鍵
外來鍵
外來鍵(Foreign Key)
可用來建立起欄位間的「參照」關係
被參照欄位通常是該資料表的主索引鍵
查詢多個資料表的資料時,通常是透過外來鍵來聯結資 料表
需要對外來鍵建立索引,加快查詢速度
索引( Index )
為了加快存取資料的速度
適當的索引可以縮短存取資料表的時間
資料量越大,索引的效益越明顯
不當的索引會增加新增、修改、刪除資料時所須的時 間,因為這些異動也須要一併更新索引 需要建立索引的欄位
主索引鍵、外來鍵、以及其它需要經常作為查詢使用 的欄位 常用的索引技術有
B樹索引 (B-tree Index)
雙向連結串列 (Doubly-Linked List)資料完整性(Data Integrity )
保持資料的完整性(正確、可靠、一致)
是一件重要的事
特別是經過分割後的資料表,資料會被分 散到不同的資料表中;必須確保分散到各 個資料表中的資料仍保持完整性
例如,在某一個資料表中更新了一筆資料,則
所有用到此資料的地方也都要更新
資料完整性的種類
個體完整性(Entity Integrity)為確保資料 表記錄的唯一性(作用於單一資料表)
主索引鍵可以達到個體完整性
不可重複的索引欄位也可以達到個體完整性
區域完整性(Domain Integrity)為確保資 料在允許範圍內(作用於單一資料表)
限制欄位的值必須在某一限制範圍內或限制欄 位的值必須受某些條件之約束
利用驗證規則與文字可以達到區域完整性
資料完整性的種類 (cont’d)
參考完整性( Referential Integrity)為確保兩個 資料表間的資料一致;避免改變某一資料表的記 錄,造成另一資料表的內容失效
藉由主索引鍵和外來鍵的關係,可規範兩資料表間資 料的完整性 使用者定義的完整性( User-defined Integrity)為 依據使用者的實際需求或商業邏輯來規範資料的 完整性(作用於一個或一個以上的資料表)
設定欄位之間的關係(資料表的驗證規則)可以達到 使用者定義的完整性
或是透過條件約束、預存程序、觸發程序達成參考完整性
變成無效 的記錄 S2 繼安
S3 競香 S1 大熊
廠商 名稱 廠商
編號
供應商
P2 麵包
果汁 P3
P1 牛奶
產品 名稱 產品
編號
產品種類
25 P2
S3
20 P1
S3
45 P3
S2
25 P1
S2
50 P3
S1
30 P2
S1
25 P1
S1
售價 產品
名稱 廠商
編號
產品售價表
繼安 S2
大熊 S1
廠商 名稱 廠商
編號
供應商
麵包 P2
果汁 P3
牛奶 P1
產品 名稱 產品
編號
產品種類
25 P2
S3
20 P1
S3
45 P3
S2
25 P1
S2
50 P3
S1
30 P2
S1
25 P1
S1
售價 產品
名稱 廠商
編號
產品售價表
刪除這
筆記錄
正規化(Normalization)
欄位相依
正規化
第一階正規化
第二階正規化
第三階正規化
欄位相依
在一個資料表中,若是 A 欄位的值必須依 據 B 欄位才有意義,則稱:A 欄位相依於 B 欄位
姓名等欄位相依
於員工編號欄位 成績欄位相依於科
目及學號兩個欄位
欄位相依 (cont’d)
10
$300
趙得勝 20
$500 開發史
民生路6號 北大書城
95/2/27 001
20
$300
數量 訂價
李華山 台北雜誌
大學路15號 大鳥書局
95/3/2 002
趙得勝 台北雜誌
民生路6號 北大書城
95/2/27 001
業務 代表
書籍連絡地址
名稱訂書 客戶名稱
日期
訂單編號
訂單編號 書籍名稱 訂書日期
訂價 數量 業務代表
客戶名稱
客戶地址
正規化
在設計資料庫時,為了降低資料的重覆性以及避 免「更新異常」等狀況;所進行分割資料表的動 作,就稱為正規化
避免資料重複或是產生相互矛盾的情形(插入、刪 除、更改異常)
讓資料庫能夠在使用上更有效率、更容易進行維護 正規化共可分為 1NF(Normal Form)、2NF、
3NF、BCNF(Boyce-Codd Normal Form)、
4NF、5NF 等階段
主要以欄位相依性,做為分割資料表的依據
正規化 (cont’d)
消除遞移相關性 1、資料表為 2NF
2、欄位不具有遞移相關性 第三階正規化
消除和主索引鍵只有部份 功能相依的欄位
1、資料表為 1NF
2、欄位都完全相依於主索 引鍵
第二階正規化
1、去除性質相同的欄位 2、將有多個值的欄位分 成多筆記錄
3 、建立主索引鍵 1、欄位只存放單一資料值
2、沒有重複出現的欄位 3、欄位都和主索引鍵相依 第一階正規化
操作方式 定義及條件
正規化型式
正規化 (cont’d)
未經正規化的關聯表
第一正規化型式
第二正規化型式
第三正規化型式
除去重複群
除去部份相依
除去遞移相依
第一階正規化(1NF)
資料表符合下面的條件,則稱該資料表符 合第一階正規化的形式(First Normal
Form,1NF)
每個欄位中都只能存放單一值
沒有重複出現(意義相同)的欄位
所有的欄位都相依於主索引鍵
不符合 1NF 資料表的缺點
欄位的大小無法確定
降低查詢資料的效率
不符合 1NF 的資料表
台北雜誌
$300 10本 李華山 開發史 $500 50本 三峽鎮大學路15號 大鳥書局
95/3/2 002
趙得勝 台北雜誌 $300 20本
北游記 $250 15本 開發史 $500 20本 北市民生
北大書城 東路6號 95/2/27
001
業務 書籍資料 代表
連絡地址 訂書 客戶名稱
日期 訂單
編號
同一個欄位中有多個值,
欄位的大小無法確定,不
容易找到要的資料
不符合 1NF 的資料表 (cont’d)
$500
$250 訂價2
開發 50 史
$300 10 天下
雜誌 三峽鎮大
學路15號 大鳥
002 書局
東游
記 15
20 天下 $300
雜誌 北市民生
東路6號 北大
001 書城
數量2 書籍2
數量1 訂價1
連絡 書籍1 地址 客戶
名稱 訂單
編號
書籍、訂價和數量各
用一個欄位代表即可
建構 1NF 資料表的方法
將具有相同特性的欄位合併
重複的資料項分別儲存到不同的記錄中
將資料表加上適當的主索引鍵
符合 1NF 的資料表
50 10
$500
$300
李華山 開發史
大學路15號 大鳥書局
95/3/2 002
趙得勝 15
$250 北游記
民生路6號 北大書城
95/2/27 001
趙得勝 20
$500 開發史
民生路6號 北大書城
95/2/27 001
20
$300
數量 訂價
李華山 台北雜誌
大學路15號 大鳥書局
95/3/2 002
趙得勝 台北雜誌
民生路6號 北大書城
95/2/27 001
業務 代表
書籍連絡地址
名稱訂書 客戶名稱
日期
訂單編號
以訂單編號和書籍編號 為主索引鍵
資料重複:訂書日期、客戶名稱、連絡地址等資料
更改異常:北大書城改為大學書城,需同時更改多筆記錄 插入異常:新書除非有人訂購,否則無法將資料輸入
刪除異常:當只有北大書城訂購北游記時;北大不訂時北游記資 料會被刪除
第二階正規化(2NF)
只有第一階正規化資料表的缺點
浪費儲存的空間
容易造成更新、新增、刪除資料時產生異常
若資料表符合以下的條件,則稱該資料表 符合第二階正規化的形式(Second Normal Form,2NF)
符合 1NF 的格式
各欄位與主索引鍵間沒有部分相依的關係
部分相依
主索引鍵由多個欄位組成時,欄位只與主索引鍵 中的部分欄位有相依性,而與另一部分的欄位沒 有相依性
數量和書籍編號有相依性,和訂單編號沒有相依性
訂書日期、業務代表、客戶名稱和和訂單編號,和書 籍編號沒有相依性訂單編號 書籍名稱 訂書日期
訂價 數量 業務代表
客戶名稱
客戶地址 主索引鍵
建構 2NF 資料表的方法
要消除資料表的部分相依問題,只需要將部份相 依的欄位分割成另外的資料表即可
臺北發展史 250
書籍名稱 訂價 台北雜誌 300
書籍資料表 95/02/27 訂書日期 業務代表
趙得勝
民生路6號
001 北大書城
連絡地址 客戶名稱
訂單號碼
訂書記錄表
北游記 台北雜誌 書籍名稱
15 001
訂單號碼 數量
20 001
訂購數量表
更改異常:地址改為民生東路17號,需同時更改多筆記錄 插入異常:新客戶除非該客戶訂購書籍,否則無法輸入資料 刪除異常:若北大書城只有一筆訂單;刪除訂單會把它的資 料刪除
第三階正規化(3NF)
只有第二階正規化資料表的缺點
還是會有更改、新增、刪除異常
資料表符合以下的條件,則稱該資料表符 合第三階正規化的形式(Third Normal
Form,3NF)
符合 2NF 的格式
各欄位與主索引鍵間沒有遞移相依關係
遞移相依
遞移相依是指在二個欄位間並非直接相 依,而是借由第三個欄位來達成資料的相 依關係
客戶地址和訂單編號之間有遞移相依性
訂單編號 訂書日期
業務代表 客戶名稱 客戶地址
主索引鍵
建構 3NF 資料表的方法
要消除資料表中的遞移相依性,和消除資 料表的部分相依性方式相同
將資料表再分割成不同的資料表
95/02/27 訂書日期 業務代表
趙得勝 001 北大書城
客戶名稱 訂單號碼
訂書記錄表
民生路6號
北大書城連絡地址 客戶名稱
客戶資料表
設計完成的資料表
95/02/27 訂書日期 業務代表
趙得勝 北大書城
001
客戶名稱 訂單號碼
訂書記錄表
民生路6號
北大書城連絡地址 客戶名稱
客戶資料表
臺北發展史 250
書籍名稱 訂價 台北雜誌 300
書籍資料表 北游記
台北雜誌 書籍名稱
15 001
訂單號碼 數量
20 001
訂購數量表
正規化的另類思考
不必要的分割
正規化的工作有時不必要做的太徹底,因為過 多的資料表可能會降低系統執行的效能
在上例中,要查詢訂單的訂購書籍和數量需透過 兩個資料表的關聯
95/02/27 200
訂書日期 數量
業務代表 趙得勝 北大書城
001 台北雜誌
客戶名稱 書籍名稱
訂單號碼
訂書記錄表
台北雜誌
書籍名稱 訂價 300 書籍資料表
大學路15號 連絡地址 客戶名稱
北大書城
客戶資料表
正規化的另類思考
人工的分割
有時為了增加資料處理的效率,可將正規化後 的資料表再做分割
例如,一個資料表擁有許多的欄位,這些欄位中 又有很多欄位根本很少用到;就可將這些很少用 到的欄位分離出來,存放到另外一個資料表中
分割資料表
對於一般簡單的資料庫設計而言,通常只 需要執行下列的檢查,而無需透過正規化 過程
找出資料表中的主索引鍵以及欄位和主索引鍵 之間的關係
以欄位和主索引鍵之間的關係為基礎,分割出 可自行識別的資料表
分割欄位值一再重複的欄位
判斷欄位是否真的需要分割
找出主索引鍵以及欄位和主索引鍵 之間的關係
50 10
$500
$300
李華山 開發史
大學路15號 大鳥書局
95/3/2 002
趙得勝 15
$250 北游記
民生路6號 北大書城
95/2/27 001
趙得勝 20
$500 開發史
民生路6號 北大書城
95/2/27 001
20
$300
數量 訂價
李華山 台北雜誌
大學路15號 大鳥書局
95/3/2 002
趙得勝 台北雜誌
民生路6號 北大書城
95/2/27 001
業務 代表
書籍連絡地址
名稱訂書 客戶名稱
日期
訂單編號
訂單編號 書籍名稱 訂書日期
訂價 數量 業務代表
客戶名稱
客戶地址 主索引鍵
分割出可個別識別的資料表
訂單編號 書籍名稱
訂書日期 業務代表 訂價 客戶名稱 客戶地址
主索引鍵
訂單編號 書籍名稱
數量
主索引鍵
主索引鍵
分割欄位值一再重複的欄位
訂單編號 訂書日期
業務代表 客戶名稱 客戶地址
主索引鍵
訂單編號 訂書日期
業務代表
客戶名稱 主索引鍵
客戶名稱 客戶地址
主索引鍵
判斷欄位是否真的需要分割
當資料表中欄位值非常簡單(例如,資料 類型為「是/否」的欄位),雖然欄位值會 一再的重複出現,這個時候就需要考慮是 否還要再分割資料表
訂單編號 訂書日期
業務代表
客戶名稱 主索引鍵
性別
性別欄位非常的
簡單,可以不用
再分割
資料表的關聯
一對多關聯
資料表中的外來鍵欄位(多)和參照的資料表(一)的關聯
一對一關聯
將不常用(特殊)的欄位分割的兩個資料表的關聯 多對多關聯
書籍(可以被多個多個客戶訂購)和客戶之間的關聯(可以訂購不同的書籍)
多對多關聯較不易處理,通常會轉換為兩個一對多關 聯一對多關聯
臺北發展史 250
書籍名稱 訂價 台北雜誌 300
書籍資料表
台北雜誌 台北雜誌 書籍名稱
15 002
訂單號碼 數量
20 001
訂購數量表
一對一關聯
發展史 250
書籍名稱 訂價 台北雜誌 300
書籍資料表1
臺北發展史 450g
書籍名稱 重量 台北雜誌 500g
書籍資料表2
多對多關聯
95/02/27 200
訂書日期 數量
業務代表 趙得勝 北大書城
001 台北雜誌
客戶名稱 書籍名稱
訂單號碼
訂書記錄表
台北雜誌
書籍名稱 訂價 300 書籍資料表
大學路15號 連絡地址 客戶名稱
北大書城
客戶資料表