認識關聯資料庫 關聯式資料庫的意義除了在資料庫中可存放著許多資料表之外,還可以在資料表中建立資料表與資料表之間之關聯。 關聯必須經由二個資料表中相同意義、相同類型之欄位來建立。
關聯的類型 在ACCESS 中,資料表的關聯有〝一對一關聯〞、〝一對多關聯〞及〝多對多關聯〞三種。但多對多關聯再處理資料時常常會發生一些問題,故先討論以上的兩種關聯的關係。
一對多關聯 這是最常見的一種關聯,用來表示某資料表中的某筆記錄對應到另一個資料表中的多筆記錄。利用這種關聯我們可以得到以下好處: 從客戶資料開始,可以找出任一客戶之所有資料。 從訂單資料開始,可以找出該訂單所屬客戶之相關資料。
一對一關聯 指的是某資料表中的一筆記錄,只能對應到另一資料表中的一筆記錄。
如何建立資料表關聯 為了確保關聯的正確性,再設定關聯時必須符合以下條件: 一、關聯的關係不可以循環 二、關聯的關係不可以中斷 三、任二的資料表的對應路徑是唯一的
關聯的關係不可以循環 資料表之間之關聯不可互相循環,例如A、B、C三個資料表有關聯,則不可以A對B有關聯,B對C有關聯而C和A又有關聯,此時即造成循環效果,這是錯誤的。
關聯的關係不可以中斷 例如:A、B、C、D四個資料表有關聯,A對B有關聯,C對D有關聯,但是B與C之間並無關聯(關聯中斷了),這也是錯誤的。
任二的資料表的對應路徑是唯一 再建立二個資料表之間關聯時,其主索引對應之欄位必須是唯一的。通常我們會以主索引當作其對應路徑,因為主索引通常為值小、且唯一。
收集完整資料集並轉成欄位 當我們面對一個比較複雜的系統時,事前的資料庫規劃顯得非常重要了。例如您要設計一個人事薪資系統,那麼面對各類的員工資料、職級、薪資出勤、休假、獎金、勞健保等資料,就需要仔細考量了。 我們一般在規劃資料庫的結構時,通常都會依照下而二個步驟來進行: 1.收集完整的資料集並轉換成欄位的形式。 2.將這些欄位做適當的分類後,歸入不同的資料表中並建立彼此 的關聯。
收集必要而完整的資料項目 在設計資料庫之前,我們應該先收集所有需要存入資料庫的資料,以建立一個完整的資料集(Complete Set)。若資料庫中的資料不完整,那麼就無法對使用者提供充份的資訊了,例如在一個訂單系統中,若沒有產品的訂價或訂購量等資料項目,就無法算出貨品的總價了。 資料庫設計的先決條件,就是要讓充份、完整的資料可以存入資料庫中!另外,不同的應用系統所需的資料項目是不同的,例如圖書館系統和零售商銷貨系統所需的資料就完全不一樣;所以我們的目的,就是要將所有"必要"。的資料項目,都"完整"地收錄於資料庫中。
將資料項目轉成資料表的欄位 收集好完整的資料集後,我們先將重複的資料過濾掉以免浪費空間,然後便可開始將之何成資料表的欄位了。底下以我們前面使用的書籍訂單系統為例: 訂單序號 日期 客戶名稱 書籍名稱 單價 數量 是否付款 備註 如果資料項目很多,可以將之分門別類,然後劃分至不同的資料表中
將資料項目轉成資料表的欄位2 接著,再決定每個欄位的資料類別、特性: 欄位名稱 資料類型 資料長度 訂單序號 能自動編號的數字 日期 日期/時間 客戶名稱 文字 30個字元 書籍名稱 單價 金額 數量 數字(整數) 是否付款 是/否 備註
分割資料表 如果您之前學過資料庫方面之課程,那麼應該對資料表之『正規化理論』不陌生吧?而此理論正是分割資料表之最佳利器。不過由於正規化理論解釋起來比較枯燥,又不易了解,所以我們採取另一種直覺式的方式與各位一起討論如何分割資料表。以下將以3個主題來探討。
分割與主索引無關之欄位 每一個資料表都應該有個主索引,而此主索引的值可以作為整筆記錄之代表。然而,若是在其他欄位之間也有類似主索引之關係,且具有更強的相依性,以致當某個欄位值被修改時,也必須同時去修改另一個相關之欄位。 數量 單價 書籍名稱 客戶名稱 訂單序號 書籍訂單 主索引關係 另一主索引關係
分割與主索引無關之欄位2 由於同一本書之單價都相同,所以當書名更動時,單價也需跟著變動才行。事實上,單價是由書籍名稱所決定,而非訂單序號來決定,單價與書籍名稱有更強之相依性。因此,應該將書籍名稱與單價二欄分割出來,而成為另一個資料表。 數量 書籍編號 客戶名稱 *訂單序號 訂單 單價 書籍名稱 *書籍 主索引關係 主索引關係
分割欄位值一再重複的欄位 主索引關係 數量 書籍編號 客戶編號 *訂單序號 訂 單 客戶名稱 *客戶編號 客 戶 上述動作將書籍訂單分割成二個之後,奏可以避免一再輸入重複之書名、單價資料。不過在新的訂單中還有一個問題,那就是客戶名稱欄還是要一再輸入重複之值,所以當某欄位中之資料值只有幾種,而且會一再重複出現時,就可以考慮將其分割出去。
判斷欄位是否真的需要分割 通 訊 錄 *員工編號 姓名 性別 地址 郵遞區號 在分割資料表時,也不是矇著眼睛瞎割一通,必須依據實際情況判斷是否有分割之必要,如右方資料表中所示: 雖然性別欄位一再重複出現,但是其只有〝男〞、〝女〞二項可選,而且欄位長度也短,就無須分割了。 通 訊 錄 *員工編號 姓名 性別 地址 郵遞區號 電話
資料表間之永久性關聯 在上堂課中曾經為各位介紹如何在查詢中建立關聯,但是此類之關聯只能運用在查詢資料中使用,此稱之為暫時性之關聯。當然您也可以為此二資料表搭起一座永久性的友誼橋樑,使其關聯永遠存在,這麼做的話,您將可得到兩個好處: 當我們在建立新的查詢、表單或報表時,只要選用到有永久關聯之資料表,ACCESS會直接幫我們套上已經建立好的永久性關聯。 ACCESS 可以依照我們所設定的規則,幫忙維護資料庫中之『資料的參考完整性』。
資料的參考完整性 當兩個資料表之間有關聯時,那麼這個關聯的狀態必須是完整的。例如在『訂單資料表』中有一筆訂單資料的客戶編號竟然在『客戶資料表』中找不到,那麼這筆訂單就成為了孤兒訂單。所謂孤兒訂單即為一筆找不到父親的子資料表。而所謂維護資料參考完整性,便是要在資料庫中防止孤兒資料表之產生。
如何維護資料的參考完整性 在子資料表輸入資料時,要檢查輸入之正確性。 此可以以查閱欄來管制。 管制在父資料表中修改關聯欄位之值。 a.不允許修改 b.一起改 管制刪除父資料表中之紀錄。 a.不允許刪除 b.連子資料表之資料一起刪除
編輯關聯視窗中之選項 當選取強迫參考完整性之稽核方塊時,其下的兩個選項才允許設定,其作用如下介紹: 串接更新欄位 串接刪除相關紀錄 表示關聯不允許修改 表示更改父資料之關聯欄位時,資資料之關聯欄位一併修改。 串接刪除相關紀錄 表示父資料表之紀錄不允許刪除 刪除父資料表之紀錄時,子資料表之際路一並刪除。
何謂連接屬性 當我們要取用兩個關聯資料表中的資料時,連接屬性可用來定義這兩個資料表的資料如何合併。為方便說明,以圖表表示。 訂單細目 1 3 假設有下面兩個資料表 訂單細目 1 3 A B C 訂單 1 2
選項1:僅包含兩個資料表連接欄位的相同的資料 2 訂單 A B C 3 訂單細目 原二資料表 訂單 訂單細目 1 A B
選項2:包括所有來自“訂單”的紀錄和只包括那些連接欄位相等的“訂單細目”欄位 1 2 A B 1 2 訂單 A B C 3 訂單細目 原二資料表
選項3:包括所有來自“訂單細目”的紀錄和只包括那些連接欄位相等的“訂單”欄位。 1 2 訂單 A B C 3 訂單細目 原二資料表 訂單 訂單細目 1 A B C
查詢表中加入運算式 運算式之結構: Int ( [單價] * 0.4) 函式 數值 識別名稱 運算元
函式 可用來幫我們做一些較複雜的運算,如: INT() 可求取數值之整數部分 DATE() 傳回今天之數值 YEAR() 求日期資料中之年份 MONTH() 求日期資料中之月份 UCASE() 將字串中之小寫轉成大寫
識別名稱 可為資料表之欄位名稱或查詢中之參數等。 這些名稱需以方括弧括起來,例如:[單價]、[數量]。若是需要指明所屬之資料表或查詢,則需以句點作為連接,例如: [書籍].[單價]、[訂單細目].[數量]
數值 為一些直接指定之值,包括: 日期: #89/05/05# 字串: 〝一品書店〞 數字: 如2306.8
運算元 用來表明以上三種資料如何運算,可運用運算子中之加減乘除(+、-、*、/、=),邏輯運算元之“且”及“或”(AND、OR)及大於、小於、介於…之間(<、>、Between…And…)等等。