天天看點

mysql資料庫設計執行個體_Mysql資料庫設計三範式執行個體解析

三範式

1NF:字段不可分;

2NF:有主鍵,非主鍵字段依賴主鍵;

3NF:非主鍵字段不能互相依賴;

解釋:

1NF:原子性 字段不可再分,否則就不是關系資料庫;

2NF:唯一性 一個表隻說明一個事物;

3NF:每列都與主鍵有直接關系,不存在傳遞依賴;

第一範式(1NF)

即表的列的具有原子性,不可再分解,即列的資訊,不能分解, 隻要資料庫是關系型資料庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1NF。資料庫表的每一列都是不可分割的原子資料項,而不能是集合,數組,記錄等非原子資料項。如果實體中的某個屬性有多個值時,必須拆分為不同的屬性 。通俗了解即一個字段隻存儲一項資訊。

mysql資料庫設計執行個體_Mysql資料庫設計三範式執行個體解析

關系型資料庫: mysql/oracle/db2/informix/sysbase/sql server 非關系型資料庫: (特點: 面向對象或者集合) NoSql資料庫: MongoDB/redis(特點是面向文檔)

第二範式(2NF)

第二範式(2NF)是在第一範式(1NF)的基礎上建立起來的,即滿足第二範式(2NF)必須先滿足第一範式(1NF)。第二範式(2NF)要求資料庫表中的每個執行個體或行必須可以被惟一地區分。為實作區分通常需要我們設計一個主鍵來實作(這裡的主鍵不包含業務邏輯)。

即滿足第一範式前提,當存在多個主鍵的時候,才會發生不符合第二範式的情況。比如有兩個主鍵,不能存在這樣的屬性,它隻依賴于其中一個主鍵,這就是不符合第二範式。通俗了解是任意一個字段都隻依賴表中的同一個字段。(涉及到表的拆分)

看下面的學生選課表:

學号

課程

成績

課程學分

10001

數學

100

6

10001

國文

90

2

10001

英語

85

3

10002

數學

90

6

10003

數學

99

6

10004

國文

89

2

表中主鍵為 (學号,課程),我們可以表示為 (學号,課程) -> (成績,課程學分), 表示所有非主鍵列 (成績,課程學分)都依賴于主鍵 (學号,課程)。 但是,表中還存在另外一個依賴:(課程)->(課程學分)。這樣非主鍵列 ‘課程學分‘ 依賴于部分主鍵列 '課程‘, 是以上表是不滿足第二範式的。

我們把它拆成如下2張表:

學生選課表:

學号

課程

成績

10001

數學

100

10001

國文

90

10001

英語

85

10002

數學

90

10003

數學

99

10004

國文

89

課程資訊表:

課程

課程學分

數學

6

國文

3

英語

2

那麼上面2個表,學生選課表主鍵為(學号,課程),課程資訊表主鍵為(課程),表中所有非主鍵列都完全依賴主鍵。不僅符合第二範式,還符合第三範式。

再看這樣一個學生資訊表:

學号

姓名

性别

班級

班主任

10001

張三

一班

小王

10002

李四

一班

小王

10003

王五

二班

小李

10004

張小三

二班

小李

上表中,主鍵為:(學号),所有字段 (姓名,性别,班級,班主任)都依賴與主鍵(學号),不存在對主鍵的部分依賴。是以是滿足第二範式。

第三範式(3NF)

滿足第三範式(3NF)必須先滿足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個資料庫表中不包含已在其它表中已包含的非主鍵字段。就是說,表的資訊,如果能夠被推導出來,就不應該單獨的設計一個字段來存放(能盡量外鍵join就用外鍵join)。很多時候,我們為了滿足第三範式往往會把一張表分成多張表。

即滿足第二範式前提,如果某一屬性依賴于其他非主鍵屬性,而其他非主鍵屬性又依賴于主鍵,那麼這個屬性就是間接依賴于主鍵,這被稱作傳遞依賴于主屬性。 通俗解釋就是一張表最多隻存兩層同類型資訊。

mysql資料庫設計執行個體_Mysql資料庫設計三範式執行個體解析

反三範式

沒有備援的資料庫未必是最好的資料庫,有時為了提高運作效率,提高讀性能,就必須降低範式标準,适當保留備援資料。具體做法是: 在概念資料模型設計時遵守第三範式,降低範式标準的工作放到實體資料模型設計時考慮。降低範式就是增加字段,減少了查詢時的關聯,提高查詢效率,因為在資料庫的操作中查詢的比例要遠遠大于DML的比例。但是反範式化一定要适度,并且在原本已滿足三範式的基礎上再做調整的。

以上就是本文的全部内容,希望對大家的學習有所幫助,也希望大家多多支援腳本之家。