我們都知道在建立數(shù)據(jù)表中需要遵循一定的規(guī)則,在運用關(guān)系型數(shù)據(jù)庫中的這種規(guī)則就稱為范式,所以要建立合理的數(shù)據(jù)表就需要遵循這些規(guī)則。
首先先來說說數(shù)據(jù)庫設(shè)計中存在哪些設(shè)計范式:最多使用的是3NF,除此之外還有針對多值依賴的第四范式,連接依賴的第五范式,DK范式和第六范式。
好了,廢話不多說了,今天重點介紹下數(shù)據(jù)庫設(shè)計中的三大范式:
第一范式
1NF 屬性的原子性
舉個例子:
ID? 學(xué)號? 姓名? 地址? 出生年月日? ? 這個還可以 將 地址 和? 出生年月日進行拆分? 不符合第一范式?
ID? 學(xué)號? 姓名? 省份 市區(qū) 縣區(qū)? ? 年 月? 日? ? 字段不能再拆分? ? 這就是符合第一范式? ?
第一范式作為數(shù)據(jù)庫中最基本的范式,要求數(shù)據(jù)表中所有的字段都是不可分割的基本數(shù)據(jù)項,也就是原子性的特征,比如上例中的地址可以再拆分為 省 市 縣區(qū)。
第二范式
2NF 實體唯一性
同樣也是來個例子:
學(xué)號? 課程號? 姓名? 學(xué)分? ? ? 這里邊? 學(xué)號 依賴于姓名? ? 學(xué)分 依賴于 課程號?
? 問題:
? 1.每行會存在相同信息?
? 2.刪除 成績?nèi)菀装颜n程信息干掉
3.如果學(xué)生沒選課程? 數(shù)據(jù)庫中就不存在該學(xué)生的姓名?
? 4.調(diào)整學(xué)分? 所有的行都得更新?
正確的做法? Student (學(xué)號? 姓名)
Course(課程號 學(xué)分? )
? ? ? ? 選課表(學(xué)號? 課程號? 成績? )
第二范式首先遵循 第一范式? ? 記錄要有唯一的標識 實體唯一性? 不存在部分依賴。也就是說一個數(shù)據(jù)庫表中,一個表只能保存一種數(shù)據(jù),不能將同一種數(shù)據(jù)保存在同一張表中
第三范式
3NF 不存在傳遞依賴
哈哈,還是以例子來說明吧:
學(xué)號? 姓名? 年齡? 學(xué)院? 學(xué)院電話?
? 學(xué)號 ->學(xué)生姓名? ->所在學(xué)院 ->學(xué)院電話?
正確的做法 是? ?
? 學(xué)生 (學(xué)號 姓名? 年齡 所在學(xué)院)
? 學(xué)院? (學(xué)院名稱? 學(xué)院電話)
第三范式就是任何字段不能由其他字段派生出來 也就是說 不存在傳遞依賴
再舉另外一個例子說明:
比如在設(shè)計一張訂單數(shù)據(jù)表的時候,可以將商品的編號和訂單的編號建立相應(yīng)的關(guān)系,而不是將商品的信息和訂單的信息放在同一張表中進行存儲。
當然可以進行反范式的設(shè)計:為了提高查詢? 更新效率? 可以適當增加冗余字段 以 空間? 換時間
范式和非范式的區(qū)別:
范式?
減少數(shù)據(jù)的冗余?
更新 快? 表 體積小?
范式 比反范式 更新起來快?
缺點:
? 查詢? 表關(guān)聯(lián)?
? 索引優(yōu)化 難度 大?
反范式
減少表關(guān)聯(lián)? ?
索引優(yōu)化 比 范式優(yōu)化方便?
缺點
數(shù)據(jù)冗余? ?
更新數(shù)據(jù) 成本大? ? ? ?
如果 表? 讀的多? 適當反范式設(shè)計? ? 以空間 換時間? ? 如果更新的 多? 那么 遵循第三范式? ? ?
從性能上講,范式有更好的寫性能,飯范式有更好的讀性能。