1.第一正規化(1nf)(列不能再拆分)
原子性,字段不可分(列的資訊),只要是關係型資料庫,就自動滿足1nf;
2.第二正規化(2nf)(主鍵唯一,且被依賴)
在第一正規化基礎上建立的,即滿足第二正規化的必須先滿足第一正規化。要求db表中的每個例項或行必須可以被唯一區分,通常設計乙個主鍵來實現,其他屬性完全依賴主鍵。
3.第三正規化(3nf)(表與其他表間沒有關聯)
必須滿足第二正規化,要求乙個資料庫表中不包含已在其他表中已包含的非主鍵字段。即:表的資訊,如果能夠被推導出來,就不應該單獨設計乙個欄位來存放(能盡量外來鍵join就用外來鍵join)。很多時候,為滿足第三正規化往往會把一張表分成多張表,如:
4.反正規化
通過增加冗餘或重複的資料來提高資料庫的讀效能。
具體做法:在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加字段,減少了查詢時的關聯,提高查詢效率,因為在資料庫的操作中查詢的比例要遠遠大於dml的比例。但是反正規化化一定要適度,並且在原本已滿足三正規化的基礎上再做調整。
實際,比如:可以減少關聯查詢時,jion表的次數,如:在3中,增加欄位role_name。
5.正規化化優點及缺點:
優點:.更新操作通常比反正規化化要快;
.正規化化的表通常更小,沒有資料冗餘,更省資料庫空間,同時可以放在記憶體,所以執行操作會更快。
.很少有多餘資料意味著檢索列表資料更少需要distinct或group by語句。
.資料較好的正規化化,只有很少或沒有重複資料,所以,只需要修改更少的資料。
缺點:.正規化化schema通常需要關聯,可能使一些索引策略無效。
.正規化等級越高,設計出來的表越多,可能會增加查詢需要的時間。
6.反正規化化優點及缺點:
優點:.可以很好避免關聯。
.如果不需要關聯表,對大部分查詢最差情況,沒有使用索引,全表掃瞄,當資料比記憶體大時,可能比關聯快,避免隨機io
7.實際經驗
實際中,不會極端使用正規化化或反正規化化schema,可能使用部分正規化化schema、快取表、及其他技巧。
最常見反正規化化資料方法:複製或快取,在不同表中儲存相同的特定列,比如:實際業務涉及的表非常多,表間連線會比較多,對錶的操作要盡量快,通常會使用反正規化設計,用空間換時間,把資料冗餘在多張表中,查詢時可以減少或避免表間關聯。
mysql 正規化化 Mysql正規化與反正規化
第一正規化 1nf 第一正規化,強調屬性的原子性約束,要求屬性具有原子性,不可再分解。第二正規化 2nf 第二正規化,強調記錄的唯一性約束,表必須有乙個主鍵,並且沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。舉個例子 版本表 版本編碼,版本名稱,產品編碼,產品名稱 其中主鍵是 ...
mysql 逆正規化化 mysql優化
一 mysql優化主要體現在四個方面。設計 儲存引擎 設計型別 正規化與逆正規化 功能 索引 快取 分區分表 合理sql 測試 經驗 1 儲存引擎 在建立表的時候我們使用sql語句,create table tablename engine myisam innodb 儲存引擎是engine還是in...
mysql 反正規化 mysql 正規化和反正規化
第一正規化 1nf 強調的是列的原子性,即列不能夠再分成其他幾列。第二正規化 2nf 首先是 2nf,另外包含兩部分內容一是表必須有乙個主鍵 二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。第三正規化 3nf 首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。...