[范式與反范式](http://www.hmoore.net/aakng/mysql/211272)
范式概念
符合某一種級別的關系模式的集合,即設計數據庫必須遵循一定的規則,在關系型數據庫中,這種規則就是范式。
提出范式是為數據庫建模提供一個理論基礎,它也有缺陷,于是又提出了反范式,是對范式不足之處的一些補充,而不是全盤否定。
六種范式
1NF 2NF 3NF BCNF 4NF 5NF
一般數據庫建模只要遵守到3NF或者BCNF即可,5NF通常被稱為完美范式。?
1、1NF
數據表的每一列都是不可再分割的基本數據項,即對屬性的原子性約束。
2、2NF
數據表中每行都必須可以被唯一地區分,是為防止數據重復,通常是使用一個主鍵來唯一標識一條記錄。
滿足第二范式就肯定滿足第一范式。
完全依賴、部分依賴:不能存在一條記錄可以僅依賴于主鍵的一部分屬性,比如主鍵是身份證號和姓名兩個字段組成,整條記錄可以只依賴主鍵,因為身份證號可以唯一確定一條記錄,這就不是完全依賴,而是部分依賴。
直接依賴、傳遞依賴(函數依賴、間接依賴):a依賴b,b依賴c,則a肯定依賴c,這就是傳遞依賴,比如:學生信息表(學號,姓名,班級,班主任姓名),班主任姓名依賴于班級,班級依賴于學號,所以班主任姓名傳遞依賴學號,直接依賴班級(因為通常認為班主任是和一個班級聯系起來的)。
3、3NF
非主屬性之間不能相互依賴,必須直接依賴候選關鍵字。
候選關鍵字:具有唯一標識特性的一個或多個屬性,比如班號,學號。
主屬性:包含在任一候選關鍵字中的屬性。
主關鍵字:即主鍵,分為單字段主鍵,多字段主鍵。
超關鍵字:單字段主鍵。
外關鍵字:外鍵。
4、BCNF
非主屬性必須直接依賴主關鍵字。
通常我們把建模標準鎖定為3NF或BCNF就可以了,越往后,表中存的冗余信息就越少,這也是范式理論的目的所在,但是一味地追求存儲更少的冗余信息不是我們的最終目的,在硬盤廉價的現在,如何能更高效地查詢數據也是很重要的。
...
反范式概念
逆規范化,存在的意義就是彌補規范化,或者說是彌補范式的不足。
常用發規范技術
1、增加冗余列
就是在多個表中增加相同的列,是為了避免在查詢時連接操作。
2、增加派生列
增加的列是來自其他表的數據,是由其他表數據經過計算生成,是為了在查詢中減少連接操作。
3、重新組表和分割表
重新組表就是將兩個表組合成一個表,從而減少連接來提高性能。
分割表通常是對表進行拆分,分為水平拆分和垂直拆分。
范式化的好處
1、范式化的更新操作比非范式化快。
2、范式化的表通常會很小,可以更好地加載到內存中,所以操作會更快。
3、由于很少有冗余,基本不需要使用distinct和group by。
范式化較高的數據庫通常的缺點就是連接操作(關聯操作),它可能會使內存開銷瞬間提高幾個檔次。
對于經常會進行寫操作的應用,通常建議對數據庫建模實現較高的范式化。
- 數據庫
- CAP定理
- 關系模型
- 關系數據庫
- NoSQL
- ODBC
- JDBC
- ODBC、JDBC和四種驅動類型
- mysql
- 安裝與配置
- CentOS 7 安裝 MySQL
- 優化
- 比較全面的MySQL優化參考
- 1、硬件層相關優化
- 1.1、CPU相關
- 1.2、磁盤I/O相關
- 2、系統層相關優化
- 2.1、文件系統層優化
- 2.2、其他內核參數優化
- 3、MySQL層相關優化
- 3.1、關于版本選擇
- 3.2、關于最重要的參數選項調整建議
- 3.3、關于Schema設計規范及SQL使用建議
- 3.4、其他建議
- 后記
- Mysql設計與優化專題
- ER圖,數據建模與數據字典
- 數據中設計中的范式與反范式
- 字段類型與合理的選擇字段類型
- 表的垂直拆分和水平拆分
- 詳解慢查詢
- mysql的最佳索引攻略
- 高手詳解SQL性能優化十條經驗
- 優化SQL查詢:如何寫出高性能SQL語句
- MySQL索引原理及慢查詢優化
- 數據庫SQL優化大總結之 百萬級數據庫優化方案
- 數據庫性能優化之SQL語句優化1
- 【重磅干貨】看了此文,Oracle SQL優化文章不必再看!
- MySQL 對于千萬級的大表要怎么優化?
- MySQL 數據庫設計總結
- MYSQL性能優化的最佳20+條經驗
- 數據操作
- 數據語句操作類型
- DCL
- 修改Mysql數據庫名的5種方法
- DML
- 連接
- 連接2
- DDL
- 數據類型
- 字符集
- 表引擎
- 索引
- MySQL理解索引、添加索引的原則
- mysql建索引的幾大原則
- 淺談mysql的索引設計原則以及常見索引的區別
- 常用工具簡介
- QA
- MySQL主機127.0.0.1與localhost區別總結
- 視圖(view)
- 觸發器
- 自定義函數和存儲過程的使用
- 事務(transaction)
- 范式與反范式
- 常用函數
- MySQL 數據類型 詳解
- Mysql數據庫常用分庫和分表方式
- 隔離級別
- 五分鐘搞清楚MySQL事務隔離級別
- mysql隔離級別及事務傳播
- 事務隔離級別和臟讀的快速入門
- 數據庫引擎中的隔離級別
- 事務隔離級別
- Innodb中的事務隔離級別和鎖的關系
- MySQL 四種事務隔離級的說明
- Innodb鎖機制:Next-Key Lock 淺談
- SQL函數和存儲過程的區別
- mongo
- MongoDB設置訪問權限、設置用戶
- redis
- ORM
- mybatis
- $ vs #
- mybatis深入理解(一)之 # 與 $ 區別以及 sql 預編譯
- 電商設計
- B2C電子商務系統研發——概述篇
- B2C電子商務系統研發——商品數據模型設計
- B2C電子商務系統研發——商品模塊E-R圖建模
- B2C電子商務系統研發——商品SKU分析和設計(一)
- B2C電子商務系統研發——商品SKU分析和設計(二)
- 數據庫命名規范--通用