Ch05 實體關圖與正規化分析 資料庫管理
本章大綱 本章內容包含課本第10章: 實體關聯模型與實體關聯圖 將實體關聯圖轉換成關聯表綱要 關聯式資料庫的正規化分析
實體關聯模型與實體關聯圖 在進行資料庫設計(Database Design)時,因為資料庫技術並非一般使用者可以快速了解,為了能夠與使用者溝通,資料庫設計通常使用高階的抽象圖形化模型來幫助我們進行資料庫設計,稱為「商業模型」(Business Model)。 目前最常使用的商業模型就是「實體關聯圖」(Entity-Relationship Diagram),這是使用圖形符號來表示的「實體關聯模型」(Entity-Relationship Model)。
實體關聯模型 實體關聯模型(Entity-Relationship Model)是1976年Peter Chen開發的資料塑模化方法,這是目前進行資料庫系統分析和設計最常使用的方法,實體關聯模型使用實體(Entity)與關聯性(Relationship)來描述資料和資料間的關係,如下圖所示:
實體關聯圖-說明 實體關聯圖(Entity-Relationship Diagram,簡稱ERD)是一種圖形化的模型,使用圖形符號表示實體關聯模型,其主要目的是顯示資料庫關聯表間的關聯性。實體關聯圖的基本建立步驟,如下所示: Step 1:從系統需求找出實體。 Stpe 2:找出實體與其它實體間的關聯性(Relationship)。 Step 3:定義實體間的關聯性種類是:一對一、一對多或多對多關聯性。 Step 4:定義實體的屬性與主鍵。
實體關聯圖-符號
實體關聯圖-實體 實體(Entity) 實體是一存在的東西,其圖形符號是長方形節點,內為實體的名稱,例如:【學生】實體是代表扮演學生角色,屬於此角色的東西,就稱為學生實體。例如:陳會安是本書的作者,如果在學校上課,他就是學生,如下圖所示:
實體關聯圖-弱實體 弱實體(Weak Entity) 弱實體需要依賴其它實體才能存在,簡單的說,它是一種沒有主鍵的實體。例如:【學生家長】是一種弱實體,因為只有【學生】實體存在,【學生家長】實體才會存在。
實體關聯圖-關聯性(說明) 關聯性(Relationship) 關聯性的基數比限制條件可以限制關聯實體連接的實體個數,這是在實線連接菱形節點端所標示的1、N和M等個數值,分為三種。
實體關聯圖-一對一關聯性 一對一關聯性(One-to-one Relationship, 1:1):指一個實體只關聯到另一個實體。例如:學校目前只有一個社團,此時一位【學生】實體只能擁有一個【社團活動成員】實體,如下圖所示:
實體關聯圖-一對多關聯性 一對多關聯性(One-to-many Relationship, 1:N):指一個實體關聯到多個實體。例如:學校的每門課程都只有一位教授開課,所以一位【教授】實體可以教多門不同的【課程】實體,而每門課程一定屬於一位教授,如下圖所示:
實體關聯圖-多對多關聯性 多對多關聯性(Many-to-many Relationship, M:N):指多個實體關聯到多個其它實體。例如:【學生】實體可以選修多門【課程】實體,反過來,【課程】實體可以讓多位【學生】實體來選課,如下圖所示:
實體關聯圖-識別關聯性 識別關聯性(Identifying Relationship) 弱實體一定需要關聯到一個實體,以便識別其身份,這個實體也稱為「識別實體」(Identifying Entity),其連結使用的關聯性稱為識別關聯性(Identifying Relationship),以雙框的菱形圖形符號來表示。
實體關聯圖-屬性 屬性(Attribute) 屬性是一組值的集合,這些值是屬性可能的值,稱為值集合(Value Set),即定義域。實體與關聯性的最基本屬性是單元值屬性(Atomic Attribute),只擁有單元值。例如:【學生】實體的【學號】、【姓名】和【電話】屬性。
實體關聯圖-鍵屬性 鍵屬性(Key Attribute) 如果屬性是實體中用來識別實體的屬性,其角色相當於是關聯表的主鍵,鍵屬性是在名稱下加上底線來標示。例如:【學生】實體的主鍵是【學號】屬性。
實體關聯圖-複合屬性 複合屬性(Composite Attribute) 複合屬性是由多個單元值屬性組成,可以使用樹狀的單元值屬性圖形符號來表示。例如:【員工】實體的【地址】複合屬性是由【街】、【城市】和【郵遞區號】等單元值屬性所組成的屬性。
實體關聯圖-多重值屬性 多重值屬性(Multivalued Attribute) 屬性值不是單元值,而是多重值,也就是說,同一個屬性擁有多種值,這是使用雙線的橢圓形節點符號標示。例如:【學生】實體的【地址】屬性是用來記錄學生多個通訊地址的多重值屬性。
實體關聯圖-導出屬性 導出屬性(Derived Attribute) 這是一種由其它屬性計算出的屬性,使用虛線的橢圓形節點符號來標示。例如:【考試】實體的【到考學生數】屬性記錄參加考試的學生數,屬性值是可以從【考試結果】實體計算而得的屬性值,稱為導出屬性。
實體關聯圖-本章範例 高海科大有很多的學生,學生入學時要填寫資料包括:姓名、生日、連絡電話、地址、電子郵件地址,學校會指定給每一個學生一個學號;學生要修習多門課程,一門課會有多名學生來修習,學校會開出許多課程,課程有課程編號、課程名稱、學分數;每一門課由一名教授來上課,每一名教授要教多門課,而每位老師有一個編號、姓名、專長。學校目前只有一個社團,學生也會參與社團活動,並且成為社團裏的一員,社團活動成員會有職稱、暱稱。
實體關聯圖-本章範例
將實體轉換成關聯表-步驟 在實體關聯圖的實體是對應關聯表,即Access的資料表,將實體轉換成關聯表綱要的規則,如下所示: 建立新的關聯表綱要,其名稱是實體名稱。 在關聯表綱要包含單元值屬性和複合屬性。 關聯表綱要不包含多重值屬性、外來鍵和導出屬性。 將鍵屬性(Key Attribute)指定為關聯表綱要的主鍵。
將實體轉換成關聯表-範例
將關聯性轉換成外來鍵-說明 實體關聯圖的關聯性可以轉換成關聯表綱要的外來鍵,在關聯表綱要新增參考到其它實體的外來鍵,可以分為3種:一對一、一對多和多對多關聯性。
將關聯性轉換成外來鍵-一對一關聯性(步驟) 一對一關聯性轉換成關聯表綱要的規則,如下所示: 在參與關聯性的關聯表綱要新增參考到另一個關聯表綱要的外來鍵(FK)。 若關聯性本身如果擁有單元值屬性,也一併加入新增外來鍵的關聯表綱要。
將關聯性轉換成外來鍵-一對一關聯性(範例)
將關聯性轉換成外來鍵-一對多關聯性(步驟) 一對多關聯性轉換成關聯表綱要的規則,如下所示: 在N端的關聯表綱要新增參考到1端關聯表綱要的外來鍵(FK)。 若關聯性本身擁有單元值屬性,也一併加入新增外來鍵的關聯表綱要。
將關聯性轉換成外來鍵-一對多關聯性(範例)
將關聯性轉換成外來鍵-多對多關聯性(步驟) 多對多關聯性轉換成關聯表綱要,需要使用一個結合資料表來建立的,其規則如下所示: 將關聯性本身建立成新的關聯表綱要,即結合資料表,名稱為關聯性名稱,在新關聯表綱要擁有2個外來鍵(FK),分別參考其關聯到的實體。 若關聯性本身如果擁有單元值屬性,也一併加入新的關聯表綱要。 關聯性建立的關聯表綱要主鍵是2個外來鍵的組合鍵,有時,可能需要以關聯性的屬性作為主鍵(如果有的話)。
將關聯性轉換成外來鍵-多對多關聯性(範例)
多重值屬性轉換成關聯表-步驟 實體如果擁有多重值屬性,多重值屬性也需要轉換成關聯表綱要,其規則如下所示: 建立新的關聯表綱要,名稱可以是屬性名稱或實體與屬性結合的名稱。 在新關聯表綱要新增參考到實體主鍵的外來鍵。 新關聯表綱要的主鍵是外來鍵加上多重值屬性,如果多重值屬性是複合屬性,可能需要加上其中一個屬性或是全部屬性。
多重值屬性轉換成關聯表-範例
Step3: 合併有相同的PK的關聯表 Step1: 將實體轉成關聯表 Step2: 將關係轉成關聯表 課程_教課(課程編號,課程名稱, 學分,教授編號) Step1: 將實體轉成關聯表 學生(學號*,姓名,生日,電話,地址,電子郵件地址,修課學分,暱稱,職稱) 課程(課程編號*,課程名稱,學分) 教授(教授編號*,教授名稱,專長) Step2: 將關係轉成關聯表 選課(學號*,課程編號*,成績) 教課(課程編號*,教授編號)
弱實體轉換成關聯表-步驟 弱實體如同實體也是轉換成關聯表綱要,只是弱實體一定擁有一個對應的實體,所以在轉換上稍有不同,其規則如下所示: 建立新的關聯表綱要,其名稱為弱實體名稱。 新關聯表綱要包含單元值屬性。 在新關聯表綱要新增其識別實體的主鍵作為參考的外來鍵。 將弱實體的「部分鍵」(Partial Key),類似主鍵其目的只在分辨不同的弱實體,所以需要加上外來鍵指定成新關聯表綱要的主鍵。
弱實體轉換成關聯表-範例
關聯式資料庫的正規化分析 在大部分資料庫案例的正規化過程中都只會使用前三個階段1NF、2NF和3NF。首先我們來看看需要儲存到資料庫的資料,例如:系上甲班學生選課資料的報表,其內容如下圖所示:
第一階正規化型式-說明 第一階正規化型式(First Normal Form,1NF)只是在處理資料表本身,簡單的說是指資料表沒有多重值欄位,如果資料表擁有多重值欄位,就需要將這些欄位分割成資料表、記錄或欄位。
第一階正規化型式-範例 例如:選課資料報表轉換成的【學生】資料表,主鍵是【學號】欄位,如下圖所示:
第一階正規化型式-方法一(說明) 方法一:分割成資料表 從【學生】資料表的內容來分析,第一階正規化可以將這些多重值欄位連同主鍵分割成新的資料表,也就是分割成學生與選課2個資料表,在選課資料表的每一位學生選擇1到3門課。
第一階正規化型式-方法一(圖例)
第一階正規化型式-方法二(說明) 方法二:分割成記錄 符合1NF資料表的每一個欄位只能儲存單元值,所以第一階正規化可以將多重值欄位改成重複記錄,欄位的每一個多重值新增一筆記錄。
第一階正規化型式-方法二(圖例)
第一階正規化型式-方法三(說明) 方法三:分割成不同欄位 第一階正規化還可以將多重值欄位配合空值NULL分割成為資料表的多個欄位,不過其先決條件是多重值個數是有限的,例如:一位學生規定只能修2門課程。
第一階正規化型式-方法三(圖例)
第二階正規化型式-說明 第二階正規化型式(Second Normal Form, 2NF)的目的是讓每一個資料表只儲存同類資料,也就是單純化資料表儲存的資料,所有非主鍵的欄位都功能相依於主鍵。
第二階正規化型式-功能相依 功能相依(Functional Dependency,簡稱FD)是一種欄位間的關係,簡單的說,知道欄位A的值,就可以知道欄位B的值。 例如:【學生】資料表的主鍵是【學號】欄位,知道學號S0201,就可以決定其姓名是周傑倫和電話為02-11111111,反之知道電話,並不一定知道學生的學號,因為多位學生可能擁有相同的電話號碼。
第二階正規化型式-範例1 當資料表符合1NF後,就可以進行第二階正規化,因為在上一節分割成的【學生】和【選課】資料表中,【學生】資料表的所有欄位都功能相依於主鍵,已經滿足2NF,換句話說,第二階正規化主要是針對【選課】資料表,如下圖所示:
第二階正規化型式-範例2 因為欄位都功能相依於【課程編號】欄位,所以擁有重複記錄,我們可以將子集合獨立成【課程】資料表,然後在【選課】資料表新增【課程編號】欄位的外來鍵,如下圖所示:
第三階正規化型式-說明 當資料表符合2NF後,我們就可以進行第三階正規化,第三階正規化型式(Third Normal Form, 3NF)的目的是移除哪些欄位是借由另一個欄位來功能相依於主鍵,稱為遞移相依(Transitive Dependency)。
第三階正規化型式-範例1 例如:在【課程】資料表的教授資料擁有遞移相依的欄位,如下圖所示:
第三階正規化型式-範例2 【教授姓名】欄位是借由【教授編號】欄位來功能相依於【課程編號】欄位的主鍵,這就是遞移相依,如下圖所示:
第三階正規化型式-範例3 遞移相依表示資料表仍然隱藏著其它資料的子集合,在執行第三階正規化時,就是將遞移相依的欄位獨立成資料表,如下圖所示:
練習一 課本p.10-24, p.10-25, p.10-26 實作題6~10
練習二 設計一銷售資料庫: X公司雇有多位業務代表,每位業務人員有代號及姓名。公司有銷售多項產品,產品有代號、產品名稱、定價。公司的客戶資料包含編號、名稱、地址、電話、傳真、連絡人、分機、電子郵件信箱。客戶向X公司訂貨,每一個訂單可以有多項產品,並由一位業務人員負責處理,訂單有唯一的編號、訂貨日期及送貨日期,而且訂單中的每一項產品包含訂貨數量及折扣