面試被問到過很多次,遂總結一下!!!
工作中相信很多人在設計數據庫表時其實都或多或少的遵循了三範式和反三範式的設計規則,但是有些東西就是這樣,它明明在你面前,你卻不知道它就是它!!!
1 三範式
將如下表按照三範式進行重新設計。
1.1 第一範式(1NF)
數據庫表的每一列都是不可分割的原子數據項。
爲了滿足第一範式,系
這個列應該拆分爲系名
和系主任
兩個列,在實際工作中我們也會經常碰到這種情況,比如說地址常常拆分成省、市、區/縣。。。 這樣可以使數據使用起來更靈活。
學號 | 姓名 | 系名 | 系主任 | 課程名稱 | 分數 |
---|---|---|---|---|---|
841001 | 張三 | 經濟系 | 郎鹹平 | 高等數學 | 88 |
841001 | 張三 | 經濟系 | 郎鹹平 | 線性代數 | 95 |
841001 | 張三 | 經濟系 | 郎鹹平 | 概率論 | 94 |
841002 | 李四 | 數學系 | 華羅庚 | 高等數學 | 79 |
841002 | 李四 | 數學系 | 華羅庚 | 線性代數 | 89 |
841002 | 李四 | 數學系 | 華羅庚 | 概率論 | 86 |
上訴表存在的問題:
- 存在非常嚴重的數據冗餘:學號、姓名、系別、系主任
- 數據添加存在問題:添加新開設的系和系主任時,數據不合法
- 數據刪除存在問題:張三同學畢業了,刪除數據,會將系的數據一起刪除
1.2 第二範式(2NF)
在1NF的基礎上,非碼屬性必須完全依賴於碼 (在1NF基礎上消除非主屬性對碼的部分函數依賴)
幾個概念:
- 函數依賴: A --> B。如果通過A屬性(屬性組)的值,可以唯一確定B屬性的值, 則稱B依賴於A。
- 例如:學號–>姓名。(學號,課程名稱) --> 分數
- 完全函數依賴: A --> B。如果A是一個屬性組,B屬性值的確定依賴於A屬性組中所有的屬性值。
- 例如: (學號, 課程名稱) --> 分數
- 部分函數依賴: A --> B。如果A是一個屬性組,B屬性值的確定只需要依賴於A屬性組中某一些值即可。
- 例如:(學號,課程名稱) – > 姓名
- 傳遞函數依賴: A --> B,B --> C。如果通過A屬性(屬性組)的值,可以唯一確定B屬性的值,再通過B屬性(屬性組)的值可以唯一確定C屬性的值,則稱C傳遞函數依賴於A。
- 例如:學號–>系名,系名–>系主任
- 碼: 如果在一張表中, 一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性性(屬性組)爲該表的碼
- 例如:1.1表中的碼爲: (學號, 課程名稱)
- 主屬性: 碼屬性組中的所有屬性
- 非主屬性: 除去碼屬性組的屬性
表1.1種的碼爲 (學號, 課程名稱),除了分數完全依賴於碼以外,其他屬性都是非完全依賴。表拆分後如下:
- 課程分數表
學號 | 課程名稱 | 分數 |
---|---|---|
841001 | 高等數學 | 88 |
841001 | 線性代數 | 95 |
841001 | 概率論 | 94 |
841002 | 高等數學 | 79 |
841002 | 線性代數 | 89 |
841002 | 概率論 | 86 |
- 學生表
學號 | 姓名 | 系名 | 系主任 |
---|---|---|---|
841001 | 張三 | 經濟系 | 郎鹹平 |
841002 | 李四 | 數學系 | 華羅庚 |
上訴表存在的問題:
- 數據添加存在問題:添加新開設的系和系主任時,數據不合法
- 數據刪除存在問題:張三同學畢業了,刪除數據,會將系的數據一起刪除
1.3 第三範式(3NF)
在2NF的基礎上,任何非主屬性不依賴於其他非主屬性(在2NF的基礎上消除傳遞依賴)
學號–>系名,系名–>系主任間 存在傳遞依賴,繼續對錶進行拆分,如下:
- 課程分數表
學號 | 課程名稱 | 分數 |
---|---|---|
841001 | 高等數學 | 88 |
841001 | 線性代數 | 95 |
841001 | 概率論 | 94 |
841002 | 高等數學 | 79 |
841002 | 線性代數 | 89 |
841002 | 概率論 | 86 |
- 學生表
學號 | 姓名 | 系名 |
---|---|---|
841001 | 張三 | 經濟系 |
841002 | 李四 | 數學系 |
- 系表
系名 | 系主任 |
---|---|
經濟系 | 郎鹹平 |
數學系 | 華羅庚 |
2 範式化設計 、反範式化設計優缺點簡析
- 反範式化是針對範式化而言得
- 反範式化是爲了性能和讀取效率的考慮而適當的對數據庫設計範式的要求進行違反,允許存在少量的冗餘
- 換句話來說反範式化就是使用空間來換取時間
範式化設計優缺點:
優點:
- 可以儘量得減少數據冗餘
- 範式化的更新操作比反範式化更快
- 範式化的表通常比反範式化的表更小
缺點:
- 對於查詢需要對多個表進行關聯
- 更難進行索引優化
反範式化設計優缺點:
優點:
- 可以減少表的關聯
- 可以更好的進行索引優化
缺點:
- 存在數據冗餘及數據維護異常
- 對數據的修改需要更多的成本