第 9 章 關聯式資料庫的 基本知識 著作權所有 旗標出版股份有限公司
本章提要 9-1 認識 Access 關聯式資料庫 9-2 認識關聯 主鍵 (Primary Key) 與連外鍵 (Foreign Key) 9-3 資料的完整性 9-4 資料表的關聯種類 2
9-1 認識 Access 關聯式資料庫 Access 是一個關聯式資料庫, 所謂 關聯 (Relationship) 是指藉由表格的形式找出資料的方法 例如我們想從下圖查詢訂單序號 4 的訂購數量, 就可由橫的一列 ( 記錄 ) 與縱的一行 ( 欄位 ) 的關聯而取得 : 3
認識 Access 關聯式資料庫 除了每個資料表中行與列的關聯之外, 數個資料表之間也可因為欄位的關係而產生關聯性, 例如 : 4
認識 Access 關聯式資料庫 5
認識 Access 關聯式資料庫 由上面的例子我們可看出, 關聯 必須經由二個資料表中相同的意義及資料類型的欄位來實現 ( 欄位名稱不一定要相同 ) 以下是另外 2 個 " 關聯 " 的例子 : 6
認識 Access 關聯式資料庫 7
認識 Access 關聯式資料庫 8
認識 Access 關聯式資料庫 也許有人會說 : 我直接使用 Excel 的試算表, 也可完成資料庫大部份的功能! 其實這個觀念是不正確的, 因為在 Excel 中, 我們無法建立 試算表之間的關聯性 所以, 關聯式資料庫的強大資料處理功能是完全來自於關聯二字, 也就是先將一堆複雜的資料分類存放, 然後再 " 建立關聯性 " 將資料連接起來, 並靈活應用 9
9-2 認識關聯 主鍵 (Primary Key) 與連外鍵 (Foreign Key) 或許您會覺得建立資料表間的關聯相當容易, 不過這是我們事先設計過的 在實際分析資料表的關聯時, 一般都是用分割資料表的方式, 先將所有需要的欄位大略歸類, 然後再透過正規化分析將重複的資料一一挑出來, 另外產生新的資料表, 並建立與原資料表的關聯 10
分割資料表並建立關聯的優點 我們將所有的資料都集中在一個資料表中, 不是很方便嗎? 而且資料庫還是可正常運作啊! 話雖如此, 不過這樣便喪失關聯式資料庫的優點了 關聯式資料庫的優點如下 : 11
節省儲存空間 因為資料庫中的資料常常會產生重複的情況, 如果每一次都要輸入相同的資料, 容易浪費儲存的空間, 例如下圖的書籍資料表 : 很明顯地在作者及分類欄位中, 有許多資料是重複的, 例如作者 威威研究室 輸入 4 次 分類 Windows 及 影像處理 " 分別輸入 2 12
節省儲存空間 這些重複的資料都會佔用磁碟的空間 若我們將作者及分類欄位抽離, 另外獨立成作者資料表及分類資料表, 並建立這 3 個資料表之間的關聯, 那麼在作者資料表中, 相同的作者就只要建立一筆記錄, 而分類資料表中的每一種類型也只要記錄一次即可 當書籍資料表需要使用到這些作者及分類時, 就可經由關聯, 到作者資料表及分類資料表中選取 13
節省儲存空間 14
節省儲存空間 試想, 在尚未分割資料表前, 若原本有 5000 筆記錄的作者皆為 威威研究室, 那就要在資料表中記錄 5000 次 威威研究室 而經過分割資料表及建立關聯後, 只要在作者資料表中記錄一次就好了, 節省下來的空間非常驚人 15
減少輸入錯誤 若是經常輸入同樣的資料, 難免會有漏打或打錯字的情況發生, 使得原本應該是相同的資料, 卻變成 2 筆不同的資料 : 16
減少輸入錯誤 日後若用 威威研究室 搜尋資料時, Windows 上網影音一把抓 就查不到了 然而若是使用關聯式資料庫, 則作者欄的資料實際是來自作者資料表, 只要確認作者資料表中的 " 威威研究室 " 這筆記錄是正確的, 就不需要重複輸入 " 威威研究室 ", 自然就減少輸入錯誤的機會了 17
方便資料修改 若有一天要將 威威研究室 改為 旗旗研究室 在沒建立關聯的資料表中, 我們必須逐項修改每一筆記錄中的作者欄位 若使用關聯式資料庫, 則只要將作者資料表的 " 威威研究室 " 改為 " 旗旗研究室 ", 書籍資料表中所有關聯到作者欄位的值, 便都會改為 " 旗旗研究室 " 了 18
主鍵 (Primary Key) 資料表之間是由 鍵 (Key) 來建立彼此的關聯 在 Access 中, 我們可為資料表設定主鍵 (Primary Key) 及連外鍵 (Foreign Key) 主鍵是用來辨識記錄的欄位, 具有唯一性, 且不允許重複 例如在書籍資料表中加入書籍編號欄位, 給每一本書一個唯一的編號, 那麼這個書籍編號欄位就可用來當作主鍵, 使用者即可依據此主鍵找到特定書籍的詳細記錄 19
主鍵 (Primary Key) 雖然資料表不一定要有主鍵, 但一般都建議最好要有 不過資料表中並不是每個欄位都適合做為主鍵, 例如書籍資料表中的作者欄位, 因為可能會遇到同名同姓的人, 所以就不具有唯一性了 20
主鍵 (Primary Key) 通常每個資料表只有一個欄位設定為主鍵, 但有時可能沒有一個欄位具有唯一性, 此時可考慮使用兩個或多個欄位組合起來做為主鍵 如下圖的範例 : 21
主鍵 (Primary Key) 上表中好幾筆記錄具有相同的訂單編號或書籍編號, 使得沒有一個欄位具有唯一性, 因此找不到一個單獨的欄位做為主鍵 不過我們發現 : 將訂單編號及書籍編號這 2 個欄位組合起來具有唯一性, 因為同一個訂單不會有 2 個相同的書籍編號 因此, 我們可將這 2 個欄位同時設為主鍵, 那麼就具有辨識唯一一筆記錄的特性了 22
連外鍵 (Foreign Key) 連外鍵 (Foreign Key) 是用來連結其他資料表之用, 如果甲資料表中的某個欄位必須對照到乙資料表中的主鍵, 才會使得該欄位的值變的有意義, 則我們稱該欄位為甲資料表的連外鍵 在關聯式資料庫中, 資料表之間的關係是藉由連外鍵來建立的, 例如 : 23
連外鍵 (Foreign Key) 書籍編號與作者編號欄位分別是書籍資料表與作者資料表的主鍵 24
連外鍵 (Foreign Key) 為了建立兩資料表之間的關聯, 在書籍資料表中需要有一個欄位參考或對應到作者資料表的主鍵, 所以便在書籍資料表中設置了作者編號欄位, 此欄位便是連外鍵 書籍和作者資料表中的作者編號欄位, 前者為連外鍵, 後者為主鍵 兩個欄位的類型 寬度等屬性必須相同, 但名稱不一定要一樣, 只是習慣上都會取相同的名稱 25
連外鍵 (Foreign Key) 此外, 一個資料表中可包含多個連外鍵, 且其資料可重複 ( 例如很多本書的作者可能是同一人 ), 這點和主鍵不同 26
9-3 資料的完整性 對於關聯式資料庫來說, 還有一個重要的觀念就是資料完整性 (Data Integrity) 所謂資料完整性是用來確保資料庫中資料的正確性及可靠性 例如在某一個資料表中更新了一筆資料, 則所有用到此資料的地方也都要更新 尤其在多人使用的系統中, 許多資料都是共用的, 倘若資料不正確或不一致, 那就麻煩了 27
資料的完整性 資料完整性大致分為下列幾種類型 : 實體完整性 (Entity Integrity) 區域完整性 (Domain Integrity) 參考完整性 (Referential Integrity) 使用者定義的完整性 (User-defined Integrity) 28
實體完整性 (Entity Integrity) 實體完整性是為了確保資料表中的記錄是 唯一 的 我們設定主鍵就是為了達成實體完整性 例如每一本書都有一個書籍編號, 不同的書若使用相同的編號是不被允許的, 會被 Access 拒絕 29
區域完整性 (Domain Integrity) 區域完整性是為了確保資料在允許的範圍中 例如限制某一個整數值欄位的資料範圍在 100 ~ 999 之間, 若輸入的資料不在此範圍內, 即不符合區域完整性, 會被 Access 拒絕 30
區域完整性 (Domain Integrity) 31
區域完整性 (Domain Integrity) 32
參考完整性 (Referential Integrity) 參考完整性是用來確保相關資料表間的資料一致, 避免因一個資料表的記錄改變, 而造成另一個資料表的內容變成無效值 33
參考完整性 (Referential Integrity) 上述範例中, 若我們在其關聯上設定了參考完整性, 當要在作者資料表中刪除一筆記錄, 則刪除的動作會失敗, 以免書籍資料表中的資料失去連結 34
使用者定義的完整性 (User-defined Integrity) 顧名思義, 這是由使用者自行定義, 而又不屬於前面三種的完整性 例如某個客戶欠款超過 6 個月, 則下次再下訂單時就不賣他, 這就是由使用者定義的完整性限制 35
9-4 資料表的關聯種類 資料表間的關聯可分為 " 一對一 " " 一對多 " 與 " 多對多 " 等 3 種對應方式, 以下我們分別討論 36
一對一關聯 當兩個資料表之間是一對一關聯時, 表示甲資料表中的一筆記錄, 只能對應到乙資料表中的一筆記錄, 而乙資料表中的一筆記錄也只能對應到甲資料表中的一筆記錄 例如對 員工資料 來說, 我們可以將之分為 " 可公開 " 與 " 機密 " 二類, 然後分別存放在二個資料表中 : 37
一對一關聯 這樣一來, 在平時只需要用到 " 可公開 " 的資料, 若有特殊需要時, 例如計算這個月的薪資, 那麼就可以利用一對一關聯, 由這二個資料表中找出員工的完整資料了 38
一對多關聯 這是最常見的一種關聯, 當兩個資料表之間是一對多關聯時, 表示甲資料表中的一筆記錄可對應到乙資料表中的多筆記錄 ; 而乙資料表中的一筆記錄只能對應甲資料表中的一筆記錄 例如 : 39
一對多關聯 我們對照到實際的資料表 : 40
一對多關聯 在客戶資料表中每個客戶都只有一筆記錄, 但可以對應到訂單資料表中的多筆記錄, 這便是一對多的關聯 利用這種關聯, 我們可以得到以下的好處 : 從客戶資料中, 可找出任一個客戶的所有訂單資料 從訂單資料中, 可找出該訂單所屬客戶的相關資料 41
多對多關聯 當兩個資料表之間是多對多關聯時, 表示甲資料表的一筆記錄能夠對應到乙資料表中的多筆記錄 ; 而乙資料表中的一筆記錄也能對應到甲資料表中的多筆記錄 例如一個客戶可訂購好幾種書, 而一本書也可賣給好幾個客戶, 若要將兩者建立關聯, 那就是多對多關聯了 42
多對多關聯 43
多對多關聯 資料庫在處理多對多關聯時, 因為彼此間的關係太複雜, 較容易發生問題, 因此通常會將這兩個資料表重新設計, 或是在這 2 個資料表之間在加上一個資料表, 使得它們之間成為 2 個一對多的關聯, 以避免發生問題 例如 : 44
多對多關聯 換句話說, 我們是用二個 一對多 關聯及一個中介資料表來解決 " 多對多 " 的問題 45
Access 中關聯的表示方式 在 Access 中, 若建立資料表關聯時若未建立強迫參考完整性, 則不論一對一或一對多的關聯, 都會以下圖的方式表示 : 46
Access 中關聯的表示方式 請雙按關聯, 開啟編輯關聯交談窗 : 47
Access 中關聯的表示方式 48
Access 中關聯的表示方式 當建立了參考完整性後, 在關聯上就會明確標示出兩個資料表間的關聯類型 : 49
Access 中關聯的表示方式 50