正規化

正規化
目的:去除關聯異動的異常現象

正規化過程
1NF > 2NF > 3NF > BCNF > 4NF > 5NF
1-3NF為三正規化,由codd於1977年提出,也是最常用的
ps:
BCNF為三正規化加強型,由boyce,codd提出
4NF,依據Multi-Valued Dependency(多重值相依性理論)所提出
5NF,依據Join Dependency(合併相依性理論)所提出

……………………………………..

正規化會使用的特性
F.D(full functional dependency,完全功能相依)
P.D(partial functional dependency,部份功能相依)
T.D(Transitive Functional Dependency,遞移相依性)

Functional Dependence(功能相依性)
若欄位a可以決定欄位b,也就是欄位b相依於欄位a
表示法為a->b
ex
學生(學號,姓名,血型)
學號可決定姓名,表示法為 學號>姓名
學號可決定血型,表示法為 學號>血型
ex:
商品(訂單編號,訂貨日期,客戶,產品代號,產品名稱,單價,數量)
訂單編號可以決定訂貨日期,客戶,產品代號,產品名稱,單價
 表示法為 訂單編號>訂單日期.客戶.產品代號.產品名稱.單價
產品代號可以決定產品名稱,單價
 表示法為 產品代號>產品名稱,單價
訂單編號,產品代號可以決定數量
 表示法為 訂單編號,產品代號>數量

功能相依分為
完全功能相依
部份功能相依

F.D(full functional dependency,完全功能相依)
若x>y , 則x會用到所有KEY
ex
(a,b,c) a->b,c 屬於F.D
(a,b,c) a,b->c 屬於F.D
(a,b,c) a->b屬於F.D

P.D(partial functional dependency,部份功能相依)
若 x>y ,則x只用部份KEY
ex:
(a,b,c) a->c 屬於P.D
(a,b,c,d) a->b,d 屬於P.D

T.D(Transitive Functional Dependency,遞移相依性)
用的不是KEY
ex:
(a,b,c) b->c屬於T.D


…………………..


1NF(first normal form,第一正規化)
去除重複群組
ps:重複群組與multi attribute(多重值屬性)及composite attribute(複合型屬性)是不同的
ps:此階段僅僅把資料填滿,還未折表格
ex:
將具有a,b,c,d,e屬性的資料轉換成以下格式
(a,b,c,d,e)
a,c->b,d,e F.D
a->b P.D
c->d P.D

2NF(second normal form,第二正規化)
分離部份相依性
所有的屬性,完全功能相依於primary key
ps:也就是只可以有完全相依性
ex:
以1NF的(a,b,c,d,e)為example,2NF如下
(a,c,e) a,c->e F.D
(a,b) a->b F.D
(c,d) c->d F.D

3NF(third normal form,第三正規化)
分離遞移相依性
ex:
假如1NF如下
(a,b,c,d)
a->b,c,d F.D
b->c,d T.D
則3NF如下
(b,c,d) b->c,d F.D
(a,b) a->b F.D

BCNF
原本(a,b,c,d) 相依關係為 a,b->c,d FD 和 c->b PD(特殊TD)
推導如下
 step1, a,b->c,d = a,b->b,c,d
 step2, 因c->b ,所以可以改成 a,c -> b,c,d
 step3, a,c -> b,c,d = a,c -> b,d
因此結論為a,b->c,d 和 c->b = a,c->b,d 和 c->b
ex:
(stu_id,staff_id,class_code,grade)
stu_id,staff_id->class_code,grade FD
class_code->staff_id PD(特殊TD)
轉換BCNF如下
(stu_id,class_code,grade) stu_id,class_code->,grade
(class_code,staff_id) class_code->staff_id

4NF
去除多值屬性
ps:常見的多值屬性有學歷,經歷,電話,…等
ex
以下資料表的學歷和經歷為多值屬性
(學號,學歷,經歷) 學號->>學歷,>經歷
99001 和平國小,和平國中,和平高中 和平公司,和平工廠
99002 希望國小,希望國中 希望企業
轉換4NF如下,去除多值屬性
(學號,學歷) 學號->學歷
99001 和平國小
99001 和平國中
99001 和平高中
99002 希望國小
99002 希望國中
(學號,經歷) 學號->經歷
99001 和平公司
99001 和平工廠
99002 希望企業
ex:
1NF,2NF,3NF,BCNF
(a,b,c,d) a->>b,>c,>d FD
轉換4NF如下
(a,b) a->b
(a,c) a->c
(a,d) a->d

…………….

1-3NF範例

1NF
(proj-num,proj-name,emp_num,emp_name,job_class,chg_hour,hours)
proj_num,emp_num->proj_name,emp_name,job_class,chg_hour,hours FD
proj_num->proj-name PD
emp_num -> emp_name,job_class,chg_hour PD
job_class -> chg_hour TD

2NF
(proj_num,emp_num,hours)
proj_num,emp_num->hours FD
(proj_num,proj-name)
proj_num->proj-name FD
(emp_num,emp_name,job_class,chg_hour )
emp_num -> emp_name,,job_class,chg_hour FD
job_class -> chg_hour TD

3NF
(proj_num,emp_num,hours)
proj_num,emp_num->hours FD
(proj_num,proj-name)
proj_num->proj-name FD
(emp_num,emp_name,job_class)
emp_num -> emp_name,,job_class FD
(job_class,chg_hour)
job_class -> chg_hour FD

實做
assign(proj_num.fk,emp_num.fk,hours)
project(proj_num,proj-name)
employee(emp_num,emp_name,job_class.fk)
salary(job_class,chg_hour)
爪圖表示法
project(proj_num,proj-name)1——< assign(proj_num.fk,emp_num.fk,hours)
assign(proj_num.fk,emp_num.fk,hours) >—— 1employee(emp_num,emp_name,job_class.fk)
employee(emp_num,emp_name,job_class.fk)>——-1salary(job_class,chg_hour)

…………………………………………..

1-4NF範例

1NF
(a,b,c,d,e,f,g,h,i, j)
a,c,e->b,d,f,g,h,>i,>j FD
a,c->b PD
c,e->f,g PD
f->e PD(特殊TD)
c->d PD
g->h TD

2NF
(a,b,c) a,c->b FD
(c,d) c->d
(c,e,f,g,h)
c,e->f,g FD
f->e PD(特殊TD)
g->h TD
(a,c,e,i,j) a,c,f->>i,>j

3NF
(a,b,c) a,c->b FD
(c,d) c->d
(g,h) g->h FD
(c,e,f,g)
c,e->f,g FD
f->e PD(特殊TD)
(a,c,e,i,j) a,c,f->>i,>j

BCNF
(a,b,c) a,c->b FD
(c,d) c->d
(g,h) g->h
(c,f,g) c,f->g
(f,e) f->e
(a,c,e,i,j) a,c,f->>i,>j

4NF
(a,b,c) a,c->b
(c,d) c->d
(g,h) g->h
(c,f,g) c,f->g
(f,e) f->e
(a,c,f,i) a,c,f->i
(a,c,f,j) a,c,f->j