资料库系统课程课件.ppt
第 四 章資料庫正規化,課程名稱:資料庫系統授課老師:李春雄 博士,本章學習目標,1.讓讀者瞭解資料庫正規化的概念及目的。2.讓讀者瞭解資料庫正規化(Normalization)程序及規則。,本章內容,4-1 正規化的概念4-2 正規化的目的4-3 功能相依(Functional Dependence;FD)4-4 資料庫正規化(Normalization)4-5 反正規化(De-normalization)4-6 結語,前言,一般的初學者在進行資料庫設計時,以為用一個資料表就可以儲存全部的資料,或憑著自己的直覺而沒有經過完整的規劃,就隨意的將資料表分割成許多小的資料表,這種設計方法,不但浪費儲存空間,更嚴重影響到資料庫不一致的現象,以致於DBA(資料庫管理師)維護困難。為了避免以上的問題產生,唯一的方法,就是在設計關聯式資料庫之前,一定先要完成資料的正規化(Normalization)。,4-1 正規化的概念,資料庫是用來存放資料的地方,因此,如何妥善的規劃資料庫綱要(Database Schema)是一件很重要的工作,但是,資料庫綱要的設計必須要配合實務上的需要,因此,當資料庫綱要設計完成後,如何檢視設計是否良好,就必需要使用正規化(Normalization)的方法論了。何謂正規化(Normalization)?就是結構化分析與設計中,建構資料模式所運用的一個技術,其目的是為了降低資料的重覆性與避免更新異常的情況發生。因此,就必須將整個資料表中重複性的資料剔除,否則在關聯表中會造成新增異常、刪除異常、修改異常的狀況發生。,4-2 正規化的目的,一般而言,正規化的精神就是讓資料庫中重複的欄位資料減到最少,並且能快速的找到資料,以提高關聯性資料庫的效能。【目的】1.降低資料重複性(Data Redundancy)。2.避免資料更新異常(Anomalies)。,一、降低資料重複性(Data Redundancy),正規化的目的是什麼呢?簡單來說,就是降低資料重複的狀況發生。試想,當校務系統的學籍資料分別存放在教務處與學務處時,不僅資料重覆儲存,浪費空間,更嚴重的是,當學生姓名變更時,就必須要同時更改教務處與學務處的學籍資料,否則將導致資料不一致的現象,因此,資料庫如果沒有事先進行正規化,將會增加應用系統撰寫的困難,同時也會增加資料庫的處理負擔,所以降低資料重複性是正規化的重要工作。,【方法】,將教務處與學務處中,把相同的資料項,抽出來組成一個新的資料表(學籍資料表),如下圖所示:正規化:將兩個表格切成三個資料表說明:在正規化之後,學籍資料表的主鍵(P.K.)分別與學務處資料表的 外鍵(F.K.)及教務處資料表的外鍵(F.K.)進行關聯,以產生關聯式資料庫。,二、避免資料更新異常(Anomalies),(一)新增異常(Insert Anomalies)新增某些資料時必須同時新增其他的資料,否則會產生新增異常現象。亦即在另一個實體的資料尚未插入之前,無法插入目前這個實體的資料。(二)修改異常(Update Anomalies)修改某些資料時必須一併修改其他的資料,否則會產生修改異常現象。(三)刪除異常(Delete Anomalies)刪除某些資料時必須同時刪除其他的資料,否則會產生刪除異常現象。亦即刪除單一資料列造成多個實體的資訊遺失。,【實例】,假設某國立大學開設網路碩士學分班,其學員課程收費表如下所示。學員課程收費表【說明】在上面的學員課程收費表中雖然僅僅只有三個欄位,但是已不算是 一個良好的儲存結構,因為此表格中有資料重覆現象。【例如】有些課程的費用在許多學員身上重覆出現(S0001與S0003;S0002與 S0005),因此可能會造成錯誤或不一致的異常(Anomalies)現象。【分析】從下一頁開始,學員的選課需知如下:1.每一位學員只能選修一門課程。2.每一門課程均有收費標準。(C001為3000元,C002為4000元,C003為5000元),【分析】三種可能的異常(Anomalies)現象,(一)新增異常 假設學校又要新增C004課程,但此課程無法立即新增到資料表中,除非至少有一位學員選修了C004這門課程。,(二)修改異常 假如C002課程的學分費由4000元調整為4500元時,若C002課程有多位學員選修時,因此,修改S0002學員的學分費時,可能有些記錄未修改到(S0005),造成資料的不一致現象。,(三)刪除異常 假設學員S0004退選時,同時也刪除C003這門課程,由於該課程只有S0004這位學員選修,因此若把這一筆記錄刪除,從此我們將失去C003這門課程及其學分費的資訊。,【解決方法】正規化,由於上述的分析,發現學員課程收費表並不是一個良好的儲存結構,因此,我們就必須要採用4-4節所要討論的正規化,將學員課程收費表分割成兩個資料表,即選課表與課程收費對照表,因此,才不會發生上述的異常現象。,課程收費表,選課表,課程收費對照表,正規化,正規化,題目:建立選課表與課程收費對照表的關聯圖先備技能:1.參考附錄一 Access 2010的基本操作 2.建立關聯式資料庫實作步驟:步驟一:開啟資料庫 開啟附書光碟中 01_Access 2010(範例資料庫)ch4素材檔 ch4-2B.accdb 步驟二:資料庫工具資料庫關聯圖選課表的課號外鍵拖曵到課程收費對照表的課號主鍵,此外,在編輯關聯對話方塊中,說明關聯類型:一對多,其中一的那方代表主鍵,而多的那方代表外鍵。步驟三:測試三種可能的異常現象。1.新增異常測試 2.修改異常測試 3.刪除異常測試您可以參考完成檔 ch4-2B.accdb,【Access上機實作1】,【Access 上機實作】,請建立正規化後的兩個表格,選課表與課程收費對照表,並建立關聯圖,選課表,課程收費對照表,資料庫名稱:ch4-2B.accdb,4-3 功能相依(Functional Dependence;FD),一、功能相依的概念【定義】是指資料表中各欄位之間的相依性。亦即某欄位不能單獨存在,必須要和其他欄位一起存在時才有意義,稱這兩個欄位具有功能相依。【例如】學生資料表【說明】在上面的資料表中,姓名欄位的值必須搭配學號欄位才有意義,則我們說姓名欄位相依於學號欄位。,換言之,在學生資料表中,學號決定了姓名,也決定了性別、系所、電話、地址等資訊,我們可以用以下圖示的方法來表示這些功能相依性。【分析】1.學號 姓名 2.學號 姓名,性別,系所,電話,地址 3.學號:為決定因素(學號姓名)4.姓名,性別,系所,電話,地址:為相依因素 因此,學號欄位為主鍵,做為唯一辨識該筆記錄的欄位。姓名欄位必須要相依於學號欄位,對此資料表來說姓名欄位才有意義;同理可證,地址欄位亦必須相依於學號欄位,才有意義。,二、功能相依(FD)的表示方式1.假設有一個資料表R,並且有三個欄位,分別為X,Y,Z,因此,我們就 可以利用一條數學式來表示:R=X,Y,Z2.假設在R=X,Y,Z數學式中,X和Y之間存在功能相依時,並且 存在Y功能相依於X,則我們可以利用以下的表示式:(1)Y X(Y功能相依於X)(2)XY(X決定Y)若XY時,在FD的左邊X稱為決定因素(Determinant)在FD的右邊Y稱為相依因素(Dependent)3.示意圖:,4-3.1 完全功能相依(Full Functional Dependency),【定義】假設在關聯表R(X,Y,Z)中,包含一組功能相依(X,Y)Z,如果我們從關聯表R中移除任一屬性X或Y時,則使得這個功能相依(X,Y)Z不存在,此時我們稱Z為完全功能相依於(X,Y)。反之,若(X,Y)Z存在,我們稱Z為部份功能相依於(X,Y)。【例如】學號(X),課號(Y)成績(Z)這是完全功能相依如果從關聯表中移除課號(Y),則功能相依(X)Z不存在因為,學號和課號兩者一起決定了成績,缺一不可。否則,只有一個學號對應一個成績,無法得知該成績是那一門課程的分數。亦即成績(Z)完全功能相依於學號(X),課號(Y),4-3.2 部份功能相依(Partial Functional Dependency),【定義】假設在關聯表R(X,Y,Z)中包含一組功能相依(X,Y)Z,如果我們從關聯表R中移除任一屬性X或Y時,則使得這個功能相依(X,Y)Z存在,此時我們稱Z為部份功能相依於(X,Y)。【例如】學號(X),身份證字號(Y)姓名(Z)這是部份功能相依如果從關聯表中移除身份證字號(Y),則功能相依(X)Z存在因為,學號也可以決定姓名,他們之間也具有功能相依性。,4-3.3 遞移相依(Transitive Dependency),【定義】是指在二個欄位間並非直接相依,而是借助第三個欄位來達成資料 相依的關係。【例如】Y 相依於 X;而 Z 又相依於Y,如此 X 與 Z 之間就是遞移相依的關係。【示意圖】在上面的關聯表R(X,Y,Z)中包含一組相依XY,YZ,則XZ,此時我們稱Z遞移相依於X。,【舉例】,課程代號 老師編號老師編號 老師姓名 這是遞移相依因為,課程代號可以決定老師編號,並且老師編號又可以決定老師姓名,因此,課程代號與老師姓名之間存在遞移相依性。,遞移相依性,4-4 資料庫正規化(Normalization),【定義】是指將原先關聯(表格)的所有資訊,在分解之後,仍能由數個新關聯(表格)中經過合併得到相同的資訊。即所謂的無損失分解(Lossless decomposition)的觀念。【無損失分解觀念】當關聯表R被分解成數個關聯表R1,R2,Rn 時,則可以再透過合併R1 R2 Rn得到相同的資訊R。如下圖所示。,分解,合併,合併,合併,分解,分解,【實例】,分解,合併,註:分解:是指透過正規化技術,將一個大資料表分割成二個小資料表。本章介紹 合併:是指透過合併理論,將數個小資料表整合成一個大資料表。第八章介紹,題目:利用分割後的表格,再進行合併先備技能:1.參考附錄一 Access 2010的基本操作 2.建立關聯式資料庫實作步驟:步驟一:開啟資料庫 開啟附書光碟中 01_Access 2010(範例資料庫)ch4素材檔 ch4-4.accdb 步驟二:將分割後的兩個表格,利用SQL合併(已完成)步驟三:以證明無損失分解觀念,亦即將原先關聯(表格)的所有資訊,在分解之後,仍能由數個新 關聯(表格)中經過合併得到相同的資訊。您可以參考完成檔 ch4-4.accdb,【Access上機實作2】,4-4.1 正規化示意圖,正規化就是對一個非正規化的原始資料表,進行一連串的分割,並且分割成數個不重複儲存的資料表。如下圖所示:在上圖中,利用一連串的分割,亦即利用所謂的正規化的規則,循序漸進的將一個重複性高的資料表分割成數個重複性低或沒有重複性的資料表。,分割,4-4.2 正規化的規則,引言 資料庫在正規化時會有一些規則,並且每條規則都稱為正規形式。如果符合第一條規則,則資料庫就稱為第一正規化形式(1NF)。如果符合前二條規則,則資料庫就被視為屬於第二正規化形式(2NF)。雖然資料庫的正規化最多可以進行到第五正規化形式,但是在實務上,BCNF被視為大部分應用程式所需的最高階正規形式。,從上圖中,我們可以清楚得知,正規化是循序漸進的過程,亦即資料表必須滿足第一正規化的條件之後,才能進行第二正規化。換言之,第二正規化必須建立在符合第一正規化的資料表上,依此類推。,正規化步驟,在資料表正規化的過程(1NF 到 BCNF)中,每一個階段都是以欄位的相依性,做為分割資料表的依據之一。其完整的正規化步驟如下圖所示:,正規化步驟,1.第一正規化(First Normal Form;1NF):由 E.F.Codd 提出。滿足所有記錄中的屬性內含值都是基元值(Atomic Value)。即無重覆項目群。2.第二正規化(Second Normal Form;2NF):由 E.F.Codd 提出。符合1NF且每一非鍵值欄位完全功能相依於主鍵。即不可部分功能相依於主鍵。3.第三正規化(Third Normal Form;3NF):由 E.F.Codd 提出。符合2NF且每一非鍵值欄位非遞移相依於主鍵。即除去遞移相依問題。,正規化步驟,4.Boyce-Codd正規化型式(Boyce-Codd Normal Form;BCNF):由 R.F.Boyce 與 E.F.Codd 共同提出。符合3NF且每一決定因素(Determinant)皆是候選鍵,簡稱為BCNF。5.第四正規化(Fourth Normal Form;4NF):由 R.Fagin 提出。符合BCNF,再除去所有的多值相依。6.第五正規化(Fifth Normal Form;5NF):由 R.Fagin 提出。符合4NF,且沒有合併相依。,4-4.3 第一正規化(1NF),【定義】是指在資料表中的所有記錄之屬性內含值都是基元值(Atomic Value)。亦即無重覆項目群。【實例】假設現在有一份某某科技大學的學生選課資料表,如表4-1(a)所示:表4-1(a)學生選課資料表,我們可以將表4-1(a)的原始資料利用二維表格來儲存,如表4-1(b)。表4-1(a)學生選課資料表表4-1(b)未正規化的資料表:學生選課資料報表,二維表格來儲存,因此,我們發現有許多屬性的內含值都具有二個或二個以上的值(亦稱為重複資料項目),其原因:尚未進行第一正規化。表4-1(b)未正規化的資料表:學生選課資料報表未符合 1NF 資料表的缺點以上資料表中的課程代碼、課程名稱、學分數、必選修、成績、老師編號及老師姓名欄位的長度無法確定,因為學生要選修多少門課程,無法事先得知(李碩安同學選了2門,李碩崴同學選了3門),因此,必須要預留很大的空間給這七個欄位,如此反而造成儲存空間的浪費。,重複資料項目,第一正規化的規則,1.每一個欄位只能有一個基元值(Atomic)即單一值。例如:課程名稱欄位中不能存入兩科或兩科以上的課程名稱。2.沒有任何兩筆以上的資料是完全重覆。3.資料表中有主鍵,而其他所有的欄位都相依於主鍵。例如1:姓名與性別欄位都相依於學號欄位。例如2:課程名稱、學分數、必選修、老師編號及老師姓名相依於課程代 碼欄位。例如3:成績欄位相依於學號與課程代碼欄位。深入探討在下一頁,深入探討,Q:為什麼成績欄位一定要相依於學號與課程代碼欄位?分析一:如果成績欄位本身單獨存在時,則沒有意義,因為只有成績卻無法讓同學或老師清楚得知該成績是屬於哪一位學生的哪一門課的成績。分析二:如果成績欄位只相依於課程編號也是沒有意義的,因為只有成績也是無法讓同學或老師清楚得知該成績是屬於哪一位學生所修課的成績。,沒有意義,沒有意義,分析三:如果成績欄位只相依於學號也是沒有意義的,因為只有成績也是無法讓同學或老師清楚得知該成績是屬於哪一門課的成績。分析四:但是,如果成績欄位相依於課程編號及學號二個欄位時,就可以了解某個學生修某堂課的成績,這樣的成績資料才有意義。,有意義,沒有意義,第一正規化的作法:,【作法】將重複的資料項分別儲存到不同的記錄中,並加上適當的主鍵。步驟一:檢查是否存在重複資料項,步驟二:將重複資料項分別儲存到不同的記錄中,並加上適當的主鍵未經正規化前的學生選課表經過正規化後的學生選課表(1NF),重複資料項,儲存到不同的記錄,經過正規化後的學生選課表(1NF)在經由第一正規化之後,使得每一個欄位內只能有一個資料(基元值)。雖然增加了許多記錄,但每一個欄位的長度及數目都可以固定,而且我們可用課程代碼欄位加上學號欄位當作主鍵,使得在查詢某學生修某課程的成績時,就非常方便而快速了。,題目:第一正規化後的結果先備技能:1.參考附錄一 Access 2010的基本操作 2.建立關聯式資料庫實作步驟:步驟一:開啟資料庫 開啟附書光碟中 01_Access 2010(範例資料庫)ch4素材檔 ch4-4-3(1NF)步驟二:以證明在1NF之後,1.每一個欄位只能有一個基元值。例如:課程名稱欄位中不能存入兩科或兩科以上的課程名稱。2.沒有任何兩筆以上的資料是完全重覆。3.資料表中有主鍵,而其他所有的欄位都相依於主鍵您可以參考完成檔 ch4-4-3(1NF),【Access上機實作3】,4-4.4 第二正規化(2NF),在完成了第一正規化之後,讀者是否發現在資料表中產生許多重複的資料。如此,不但浪費儲存的空間,更容易造成新增、修改及刪除資料時的異常狀況,說明如下。(1)新增異常檢查(Insert Anomaly)無法先新增課程資料,如課程代碼及課程名稱,要等選課之後,才能新增。原因:以上的新增動作違反實體完整性規則,因為,主鍵或複合主鍵不可以為空值 NULL。,(2)修改異常檢查(Update Anomaly)網頁設計課程重覆多次,因此,修改網頁設計課程的成績時,可能有些記錄未修改到,造成資料的不一致現象。例如:有選網頁設計課程的同學之成績各加5分,可能會有些同學 有加分,而有些同學卻沒有加分,導致資料不一致的情況。,(3)刪除異常檢查(Delete Anomaly)當刪除#4學生的記錄時,同時也會刪除課程名稱、學分數及相關的資料。所以導致計概課程的2學分數也同時被刪除了。綜合上述的三種異常現象,所以,我們必須進行第二階正規化,來消除這些問題。,第二正規化的規則,如果資料表符合以下的條件,我們說這個資料表符合第二階正規化的形式(Second Normal Form,簡稱 2NF):符合1NF每一非鍵屬性(如:姓名、性別)必須完全相依於主鍵(學號);即不可部分功能相依於主鍵。換言之,部分功能相依只有當主鍵是由多個欄位組成時才會發生(亦即複合主鍵),也就是當某些欄位只與主鍵中的部分欄位有相依性,而與另一部分的欄位沒有相依性。,第二正規化的作法,分割資料表;亦即將部分功能相依的欄位分割出去,再另外組成新的資料表。其步驟如下:步驟一:檢查是否存在部分功能相依姓名只相依於學號 課程名稱只相依於課程代碼 在上面的資料表中,主鍵是由學號+課程代碼兩個欄位所組成,但姓名和性別只與學號有相依性,亦即(姓名,性別)相依於學號,而課程名稱只與課程代碼有相依性,亦即(課程名稱,學分數,必選修,老師編號,老師姓名)相依於課程代碼。因此,學號是複合主鍵(學號,課程代碼)的一部份。存在部分功能相依。,步驟二:將部分功能相依的欄位分割出去,再另外組成新的資料表我們將選課資料表分割成三個較小的資料表(加底線的欄位為主鍵):一、學生資料表(學號,姓名,性別)二、成績資料表(學號,課程代碼,成績),三、課程資料表(課程代碼,課程名稱,學分數,必選修,老師編號,老師姓名)在第二正規化之後,產生三個資料表,分別為學生資料表、成績資料表及課程資料表,除了課程資料表之外,其餘兩個資料表(學生資料表與成績資料表)都已符合2NF,3NF及BCNF。,題目:第二正規化後的結果先備技能:1.參考附錄一 Access 2010的基本操作 2.建立關聯式資料庫實作步驟:步驟一:開啟資料庫 開啟附書光碟中 01_Access 2010(範例資料庫)ch4素材檔 ch4-4-3(2NF)步驟二:以證明在2NF之後,將部分功能相依的欄位分割出去,另外分割成三個資料表學生資料表、成績資料表及課程資料表。您可以參考完成檔 ch4-4-3(2NF),【Access上機實作4】,4-4.5 第三正規化(3NF),在完成了第二正規化之後,其實還存在以下三種異常現象,亦即新增、刪除或更新資料時的異常狀況,說明如下:(1)新增異常(Insert Anomaly)以上無法先新增老師資料,要等確定課程代碼之後,才能輸入。原因為:新增動作違反實體完整性規則,因為主鍵或複合主鍵不可以為空值NULL。,(2)修改異常(Update Anomaly)假如李安老師開設多門課程時,則欲修改李安老師姓名為李碩安時,可能有些記錄未修改到,造成資料的不一致現象。,未修改到,(3)刪除異常(Delete Anomaly)當刪除#1課程的記錄時,同時也刪除老師編號T001。所以導致老師編號T001及老師姓名的資料也同時被刪除了。綜合上述的三種異常現象,所以,我們必須進行第三階正規化,來消除這些問題。,第三正規化的規則,如果資料表符合以下條件,我們就說這個資料表符合第三階正規化的形式(Third Normal Form,簡稱 3NF):符合2NF各欄位與主鍵之間沒有遞移相依的關係。【如何找遞移相依呢?】若要找出資料表中各欄位與主鍵之間的遞移相依性,最簡單的方法就是從左到右掃瞄資料表中各欄位有沒有與主鍵無關的相依性存在。可能的情況如下:如果有存在時,則代表有遞移相依的關係2.如果有不存在時,則代表沒有遞移相依的關係,第三正規化的作法,分割資料表;亦即將遞移相依或間接相依的欄位分割 出去,再另外組成新的資料表。其步驟如下:步驟一:檢查是否存在遞移相依由於每一門課程都會有授課的老師,因此,老師編號相依於課程代碼。並且老師姓名相依於教師編號,因此,存在有與主鍵無關的相依性。亦即存在老師姓名與主鍵(課程代碼)無關的相依性。存在遞移相依。,上述課程資料表中的課程名稱、學分數、必選修、老師編號都直接相依於主鍵課程代碼(簡單的說,這些都是課程資料的必需欄位),而老師姓名是直接相依於老師編號,然後才間接相依於課程代碼,它並不是直接相依於課程代碼,稱為遞移相依Transitive Dependency或間接相依。例如:當AB,BC,則AC(稱為遞移相依)。因此,在課程資料表中存在遞移相依關係現象,,步驟二:將遞移相依的欄位分割出去,再另外組成新的資料表 因此,我們將課程資料表分割為二個資料表,並且利用外鍵(F.K.)來連接二個資料表。如下圖所示。,在我們完成第三正規化後,共產生了四個表格,如下表所示:,第三正規化後的四個表格,第二正規化產生的表格,第三正規化產生的表格,題目:第三正規化後的結果,並建立關聯圖先備技能:1.參考附錄一 Access 2010的基本操作 2.建立關聯式資料庫實作步驟:步驟一:開啟資料庫 開啟附書光碟中 01_Access 2010(範例資料庫)ch4素材檔 ch4-4-3(3NF)步驟二:以證明在3NF之後,將遞移相依的欄位分割出去,再另外組成新的資料表。因此,我們將課程資 料表分割為二個資料表,分別為課程資料表與老師資料表。步驟三:在3NF之後,總共產生了四個資料表(學生資料表、成績資料表、課程資料表 與老師資料表)您可以參考完成檔 ch4-4-3(3NF),【Access上機實作5】,4-4.6 BCNF正規化,是由Boyce和Codd於1974年所提出來的3NF的改良式。其條件比3NF更加嚴苛。因此每一個符合BCNF的關聯一定也是3NF。對於大部分資料庫來說,通常只需要執行到第三階段的正規化就足夠了。【適用時機】如果資料表的主鍵是由多個欄位組成的,則必須再執行 Boyce-Codd 正規化。,BCNF的規則,如果資料表的主鍵只由單一欄位組合而成,則符合第三階正 規化的資料表,亦符合 BCNF(Boyce-Codd Normal Form)正規化。如果資料表的主鍵由多個欄位組成(又稱為複合主鍵),則資料 表就必須要符合以下條件,我們就說這個資料表符合BCNF(Boyce-Codd Normal Form)正規化的形式。1.符合3NF 的格式。2.主鍵中的各欄位不可以相依於其他非主鍵的欄位。,檢驗成績資料表是否滿足 BCNF 規範,由於在我們完成第三正規化之後,已經分割成四個資料表,其中成績資料表的主鍵是由多個欄位組成(又稱為複合主鍵)。因此,我們利用BCNF(Boyce-Codd Normal Form)正規化的條件,來檢驗成績資料表:成績資料表(學號,課程代碼,成績)說明:成績欄位相依於課程代碼及學號欄位,對課程代碼欄位而言,並沒有相依於成績欄位;對學號欄位而言,也沒有相依於成績欄位。所以成績資料表是符合Boyce-Codd 正規化的形式的資料表。,4-4.7 怎樣才叫做是好的關聯?,正規化就是將一個大資料表分割成數個不重複的小資料表。從1NF到3NF,再利用BCNF來逐步檢驗資料表中主鍵由多個欄位組成的相依性問題,這是一連串改良關聯的過程。可是,究竟要做到哪一個程度才算足夠好呢?通常我們會要求:就算不能作到BCNF,也要做到3NF才可以。,4-5 反正規化,【引言】正規化只是建立資料表的原則,而非鐵律。如果過度正規化,反而導致資料存取的效率下降。因此,如果要以執行效率(查詢速度)為優先考量時,則我們還必須適當的反正規化(De-normalization)。有時,過度的正規化,反而會造成資料處理速度上的困擾,因此,當我們在進行資料庫正規化的同時,可能也必須要測試系統執行效率,當效率不理想時,必須做適當的反正規化,亦即將原來的第三階正規化降級為第二階正規化,甚至降到第一階正規化。但是,在進行反正規化的同時,可能也會造成的資料重覆性問題。,4-5 反正規化,【定義】將原來的第三階正規化降級為第二階正規化,甚至降到第一階 正規化。【使用時機】查詢比例較大的環境。【分析】1.對資料異動觀點 當正規化愈多層,愈有利於資料的異動(包括:新增、修改及刪除),因為異動時只需針對某一個較小的資料表,可以避免資料的異常現象。2.對資料查詢觀點 當正規化愈多層,愈不利於資料的查詢功能,因為資料查詢時往往 會合併許多個資料表,導致查詢效能降低。因此,正規化論理與查詢合併原理是存在相互衝突。,【舉例】假設我們在進行正規化時,特別將客戶資料表中的地址分割成以下欄位:正規化關聯客戶資料表(編號,姓名,郵遞區號)地址明細表(郵遞區號、城市、路名)【優點】可以直接從每一個欄位當作關鍵字來查詢。【例如】查詢高雄市或查詢806或查詢和平路等。【適用時機】租屋網站;可以讓使用者進行進階查詢。【缺點】如果要查詢的資訊是要合併多個資料表時,將會影響執行效率。因此,一般的做法還是讓地址反正規化。反正規化關聯客戶資料表(編號,姓名,郵遞區號、城市、路名),4-6 結語,基本上,建立E-R Model後已經可以達到正規化的前三階(1NF,2NF,3NF)或是BCNF的步驟。因此,我們必須瞭解建立完整的資料庫結構,可以用兩種方法來建構:1.E-R Model(第三章介紹)2.資料庫正規化(第四章介紹)驗證E-R Model是否達到最佳化,4-6 結語,1.如果是剛成立的企業想要電腦化,則是要從需求訪談開始,將訪談的資料需求進行分析(情境),然後建立實體關係模式(ER圖),接下來依照關聯式的規則,對映成資料表。筆者認為如果步驟一到步驟三都有確實時,對映後的資料表會與正規化的表格是一樣的。所以,正規化的步驟就不一定要進行。如下圖所示:,4-6 結語,2.如果某一企業早期已經人工作業,並且使用許多表單,筆者建議,可以直接進行正規化。但是,如果人工作業的表單沒有完全依照企業的需求的設計時,則筆者建議,還是要依照步驟一到步驟三來進行。如下圖所示:,