總共有六大正規化:
第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。
只記前三正規化:
三大正規化:
第一正規化:資料表中欄位滿足原子性,字段不可再分
如學生資訊字段:儲存(張三,手機號),這個可以再分姓名,手機號。不滿足
第二正規化:滿足第一正規化基礎上,消除部分函式依賴。滿足非主鍵完全依賴於主鍵
如果存在乙個對主鍵不完全依賴的字段,則不滿足第二正規化
(學號,姓名,年齡,課程名稱,課程學分,學科成績,系別,系**)存在依賴關係:
(學號) ->(姓名, 年齡,性別,系別,系辦位址、系辦**)
(課程名稱) ->學分
(學號,課程)->學科成績
主鍵 (學號,課程) 學分只依賴主鍵一部分, 第乙個依賴關係只依賴於學號。所以需要將它們進行分離
課程表:(課程名稱,學分)
學生課程表:(學號,課程,學科成績)
更新異常:調整課程的學分,對應的記錄都要修改,可能出現同一門課學分不同
插入異常:由於沒人選修課程,沒有學號關鍵字,要等有人選修才能把課程和學分存入
修改複雜:改課程學分,要把設計到課程的所有記錄進行修改
滿足第二正規化的表設計
第三正規化:第二正規化基礎上:消除傳遞依賴;
表中每一列都與主鍵直接相關,而不是間接相關
x,y,z是屬性集合。存在x -> y y -> z (y !->x)則z傳遞依賴於x比如學生資訊表:(學號,姓名,年齡,系別,系**)
學號 -> 系別 ->系** 這個存在傳遞依賴。
可以拆分兩個表。就可以滿足第三正規化。
學生(學號,姓名,年齡,系別)
系別(系別,系**)
滿足三大正規化的優缺點
優點:正規化化的更新操作通常比反正規化化要快
當資料較好地正規化化時,就只有很少或者沒有重複資料,所以只需要修改更少的資料。
正規化化的表通常更小,可以更好地放在記憶體裡,所以執行操作會更快
缺點:通常需要關聯,稍微複雜一些的查詢語句在符合正規化的schema上都可能需要至少一次關聯,也許更多。
這不但代價昂貴,也可能使一些索引策略無效。
例如,正規化化可能將列存放在不同的表中,而這些列如果在乙個表中本可以屬於同乙個索引。
反正規化:
為了解決海量資料中因位大量表連線,資料聚合等操作而帶來的效能瓶頸問題。
增加冗餘字段:目的是 空間換時間
具體做法是:在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。
降低正規化就是增加字段,減少了查詢時的關聯,提高查詢效率,
因為在資料庫的操作中查詢的比例要遠遠大於dml的比例。
但是反正規化化一定要適度,並且在原本已滿足三正規化的基礎上再做調整的。
字段冗餘適用於不經常變動的字段。而查詢時候需要通過連表獲得的字段。
知乎上對正規化和反正規化的理解:
資料庫設計應該也是分為三個境界的:
第乙個境界,剛入門資料庫設計,正規化的重要性還未深刻理解。這時候出現的反正規化設計,一般會出問題。
第二個境界,隨著遇到問題解決問題,漸漸了解到正規化的真正好處,從而能快速設計出低冗餘、高效率的資料庫。
第三個境界,再經過n年的鍛鍊,是一定會發覺正規化的侷限性的。此時再去打破正規化,設計更合理的反正規化部分。
正規化就像武俠裡面的招數,初學者妄想不按招數來,只能死的很難堪。畢竟招數都是高手總結歸納的精華。而隨著武功提高,招數熟練之後,必然是發現招數的侷限性,要麼忘掉招數,要麼自創招數。只要努力,加上多熬幾年,總能達到第二個境界,總會覺得正規化是經典。此時能不過分依賴正規化,快速突破正規化侷限性的人,自然是高手。
反正規化優點就是提高查詢效率
資料庫反正規化 認識三大正規化
有時,理論與實踐有一些差距,在做乙個具體的事情時,我們應該以實際為核心,而不是把理論死搬上來,要 從實際出發 呵呵。在資料庫的世界裡存在著三大正規化,也就是規範,真正的關係型資料庫應該盡可能的滿足這些規範,但有時,我們卻根據實際問題,需要違背這些規範,這個系列我將從實際專案 發來與大家一起說說 反正...
資料庫正規化設計和反正規化設計
1 庫表設計遵從三大正規化。a 資料庫設計的第一大正規化 資料庫表中的所有欄位都只具有單一屬性 單一屬性的列是由基本資料型別所構成的 設計出來的表都是簡單的二維表。乙個列存放的資訊只是乙個屬性的資訊,不能乙個字段存放多個屬性的組合資訊。即資料庫表中的所有字段值都是不可分解的原子值 b 資料庫設計的第...
資料庫三正規化和反三正規化
要說資料庫什麼最抽象,我覺得就是這個三正規化,不是很好理解,但是表在設計的時候又必須要知道這麼乙個規則。首先使用最簡潔的話說說這三正規化 第一正規化 1nf the first normal form 每一列不能再分割。第二正規化 2nf the second normal form 滿足1nf條件...