設計關系數(shù)據(jù)庫時,遵從不同的規(guī)范要求,設計出合理的關系型數(shù)據(jù)庫,這些不同的規(guī)范要求被稱為不同的范式,各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫冗余越小。但是有些時候一昧的追求范式減少冗余,反而會降低數(shù)據(jù)讀寫的效率,這個時候就要反范式,利用空間來換時間。
目前關系數(shù)據(jù)庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎上進一步滿足更多規(guī)范要求的稱為第二范式(2NF),其余范式以次類推。一般說來,數(shù)據(jù)庫只需滿足第三范式(3NF)就行了。
即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要數(shù)據(jù)庫是關系型數(shù)據(jù)庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1NF。
關系型數(shù)據(jù)庫: mysql/oracle/db2/informix/sysbase/sql server
非關系型數(shù)據(jù)庫: (特點: 面向?qū)ο蠡蛘呒?
NoSql數(shù)據(jù)庫: MongoDB/redis(特點是面向文檔)
第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個實例或行必須可以被惟一地區(qū)分。為實現(xiàn)區(qū)分通常需要我們設計一個主鍵來實現(xiàn)(這里的主鍵不包含業(yè)務邏輯)
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主鍵字段。就是說,表的信息,如果能夠被推導出來,就不應該單獨的設計一個字段來存放(能盡量外鍵join就用外鍵join)。很多時候,我們?yōu)榱藵M足第三范式往往會把一張表分成多張表
沒有冗余的數(shù)據(jù)庫未必是最好的數(shù)據(jù)庫,有時為了提高運行效率,就必須降低范式標準,適當保留冗余數(shù)據(jù)。具體做法是: 在概念數(shù)據(jù)模型設計時遵守第三范式,降低范式標準的工作放到物理數(shù)據(jù)模型設計時考慮。降低范式就是增加字段,減少了查詢時的關聯(lián),提高查詢效率,因為在數(shù)據(jù)庫的操作中查詢的比例要遠遠大于DML的比例。但是反范式化一定要適度,并且在原本已滿足三范式的基礎上再做調(diào)整的。
更多建議: