mysql三範式
網上查找了一些資料,記錄如下並加入自己的理解。
設計關系數據庫時,遵從不同的規範要求,設計出合理的關系型數據庫,這些不同的規範要求被稱為不同的範式,各種範式呈遞次規範,越高的範式數據庫冗余越小。但是有些時候一昧的追求範式減少冗余,反而會降低數據讀寫的效率,這個時候就要反範式,利用空間來換時間。
目前關系數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。滿足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步滿足更多規範要求的稱為第二範式(2NF),其余範式以次類推。一般說來,數據庫只需滿足第三範式(3NF)就行了。所以這裏就只記錄三範式相關的知識。
三範式
1NF:字段不可分;2NF:有主鍵,非主鍵字段依賴主鍵;
3NF:非主鍵字段不能相互依賴;
解釋:
1NF:原子性 字段不可再分,否則就不是關系數據庫;
2NF:唯一性 一個表只說明一個事物;
3NF:每列都與主鍵有直接關系,不存在傳遞依賴;
第一範式(1NF)
即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要數據庫是關系型數據庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1NF。數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。如果實體中的某個屬性有多個值時,必須拆分為不同的屬性 。通俗理解即一個字段只存儲一項信息。
關系型數據庫: mysql/oracle/db2/informix/sysbase/sql server
非關系型數據庫: (特點: 面向對象或者集合)
NoSql數據庫: MongoDB/redis(特點是面向文檔)
第二範式(2NF)
第二範式(2NF)是在第一範式(1NF)的基礎上建立起來的,即滿足第二範式(2NF)必須先滿足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每個實例或行必須可以被惟一地區分。為實現區分通常需要我們設計一個主鍵來實現(這裏的主鍵不包含業務邏輯)。
即滿足第一範式前提,當存在多個主鍵的時候,才會發生不符合第二範式的情況。比如有兩個主鍵,不能存在這樣的屬性,它只依賴於其中一個主鍵,這就是不符合第二範式。通俗理解是任意一個字段都只依賴表中的同一個字段。(涉及到表的拆分)
第三範式(3NF)
滿足第三範式(3NF)必須先滿足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主鍵字段。就是說,表的信息,如果能夠被推導出來,就不應該單獨的設計一個字段來存放(能盡量外鍵join就用外鍵join)。很多時候,我們為了滿足第三範式往往會把一張表分成多張表。
即滿足第二範式前提,如果某一屬性依賴於其他非主鍵屬性,而其他非主鍵屬性又依賴於主鍵,那麽這個屬性就是間接依賴於主鍵,這被稱作傳遞依賴於主屬性。 通俗解釋就是一張表最多只存兩層同類型信息。
反三範式
沒有冗余的數據庫未必是最好的數據庫,有時為了提高運行效率,提高讀性能,就必須降低範式標準,適當保留冗余數據。具體做法是: 在概念數據模型設計時遵守第三範式,降低範式標準的工作放到物理數據模型設計時考慮。降低範式就是增加字段,減少了查詢時的關聯,提高查詢效率,因為在數據庫的操作中查詢的比例要遠遠大於DML的比例。但是反範式化一定要適度,並且在原本已滿足三範式的基礎上再做調整的。
知乎上對範式和反範式的理解:
摘自 https://www.zhihu.com/question/19900437
著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
作者:孫文亮
鏈接:https://www.zhihu.com/question/19900437/answer/14089402
來源:知乎
數據庫設計應該也是分為三個境界的:
第一個境界,剛入門數據庫設計,範式的重要性還未深刻理解。這時候出現的反範式設計,一般會出問題。
第二個境界,隨著遇到問題解決問題,漸漸了解到範式的真正好處,從而能快速設計出低冗余、高效率的數據庫。
第三個境界,再經過N年的鍛煉,是一定會發覺範式的局限性的。此時再去打破範式,設計更合理的反範式部分。
範式就像武俠裏面的招數,初學者妄想不按招數來,只能死的很難堪。畢竟招數都是高手總結歸納的精華。而隨著武功提高,招數熟練之後,必然是發現招數的局限性,要麽忘掉招數,要麽自創招數。只要努力,加上多熬幾年,總能達到第二個境界,總會覺得範式是經典。此時能不過分依賴範式,快速突破範式局限性的人,自然是高手。
mysql三範式