三范式
- 第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,即列不能夠再分成其他幾列;
- 第二范式:2NF首先是要滿足1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。
- 第三范式:3NF首先是要滿足2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。這是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,區分它們的關鍵點在於,2NF:非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分;3NF:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。
范式的優點:
1)范式化的數據庫更新起來更加快;
2)范式化之后,只有很少的重復數據,只需要修改更少的數據;
3)范式化的表更小,可以在內存中執行;
4)很少的冗余數據,在查詢的時候需要更少的distinct或者group by語句。
范式的缺點:
1)范式化的表,在查詢的時候經常需要很多的關聯,因為單獨一個表內不存在冗余和重復數據。這導致,稍微復雜一些的查詢語句在查詢范式的schema上都可能需要較多次的關聯。這會增加讓查詢的代價,也可能使一些索引策略無效。因為范式化將列存放在不同的表中,而這些列在一個表中本可以屬於同一個索引。
反范式的優點:
1)可以避免關聯,因為所有的數據幾乎都可以在一張表上顯示;
2)可以設計有效的索引;
反范式的缺點:
1)表格內的冗余較多,刪除數據時候會造成表有些有用的信息丟失。
所以在設計數據庫時,要注意混用范式化和反范式化。