資料來源(牛的大腦正規化)
正規化 |
正規化 目的:去除關聯異動的異常現象
正規化過程
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 |
沒有留言:
張貼留言