作為乙個web開發者,搞懂資料庫是很有必要的。而弄明白關聯式資料庫的三大正規化是很有用的。只有清楚了資料庫三大正規化的設計初衷我們才能夠設計出更好的表結構。
第零正規化就是指沒有使用任何正規化的設計,其新增資料的行為非常詭異,看看下表便知:
假設乙個學生學習了三門課程,每門課程都有成績,那麼,採用第零正規化的設計將會是如下情況:
student_id
name_1
score_1
name_2
score_2
name_3
score_31語文
90數學
90英語98
這樣的話,會使得往表中新增資料變得非常麻煩,每次新增乙個新的資料,都要新增相應的字段,而且,因為表中其他的記錄可能不需要這麼多欄位,因此會浪費很多空間。如表所示:
student_id
name_1
score_1
name_2
score_2
name_3
score_31語文
90null
null
null
null2語文
90數學
90英語98
由此可以看出,不對資料庫任用任何正規化是非常愚蠢的,因為不僅會產生大量無用的表字段,而且會使得表結構非常難以維護。由此,引出第一正規化的介紹
第一正規化就是指表中的所有欄位都是原子的、不可再分的。將第零正規化中重複的字段抽取出來,作為表的資料,從而形成乙個穩定的、冗餘資料少得表結構。
由此,可以得出符合第一正規化的表結構應該是:
studentstudent_id
student_name
score1英語
901數學901語文
98 此時,表的結構變得穩定了,而且表中的冗餘資訊相對第零正規化也少了很多。可是,第一正規化只是關聯式資料庫設計的最低滿足的正規化,第一正規化中仍然可能有很多的冗餘資訊,由此,需要引入第二範 式。
第二正規化是滿足非主屬性完全依賴於主屬性。因此,滿足第二正規化的表當然也是滿足第一正規化的,第二正規化的目的就是消除表中的部分依賴。
這裡,有幾個概念要解釋下,
3.1、完全函式依賴
設有屬性集k和p,若k中的所有屬性共同能夠推出p中的任意屬性,且對於k的任何真子集,都不能推出p中的任意屬性,則成k完全函式依賴p。
3.2、部分函式依賴
假如有一張學生成績表,包含如下屬性(學生id,課程id,課程分數,學生名字),其中,主鍵為(學生id,課程id),表中的資料如下:
studentstudent_id
college_id
score
student_name12
90張三11
100張三
從上面的表資料易知,不滿足第二正規化的表至少有以下幾個缺點:
資料重複,浪費空間,因為每存一條記錄,都要存學生的名字,這樣就是得存在大量重複的資料。
插入異常,若學生還沒有成績,那麼這個學生就沒有名字。
更新異常,刪除異常等
解決方法:可以分為以下三張表。
studentstudent_id
student_name
collegecollege_id
college_name
student_collegestudent_id
college_id
score
第三正規化是指在滿足第二正規化的情況下,屬性不依賴於其它非主屬性 , 消除傳遞依賴
所謂傳遞依賴,就是指x–>y,y–>z,那麼可以得到y–>z.
傳遞依賴常發生在主鍵、外來鍵、外來鍵相關的屬性上,例如,假設有這樣的表
學生表(學生id,學生姓名,院系id,院系名) ,此處主鍵為(學生id),外來鍵為(院系id)
院系表(院系id,院長名稱),主鍵為 (院系id)
studentstudent_id
student_name
college_id
college_name
1carl
1地理學院
2alan
1地理學院
3kevin
2外國語學院
collegecollege_id
college_name
1地理學院
2外國語學院
從上面的表資料易知,不滿足第三正規化的表至少有以下幾個缺點:
資料重複,浪費空間,因為學生表每存一條記錄,都會記錄住院系的名字,存在大量的重複資料。
插入異常,若新建乙個院系,而該院系沒有學生的話,該院系就沒有名字。
更新異常,刪除異常等
在日常專案中如果完全按照上面的正規化設計資料庫那麼在效率上會存在很大的問題。例如:查詢所有的記錄資訊,這是如果有外檢一對多,多對多等關係勢必影響系統效率。
另一方面,如果完全遵守正規化要求,雖然在一定程度上降低了資料庫的yongyu度。但是系統的可維護性會大大的下降。
如果僅僅是這量反面就有足夠的理由去做反正規化要求了,與其遵守正規化要求,不如將更多的業務封裝在**層,這樣做的好處就不言而喻了。
反正規化設計的目的:用空間去換時間。空間在這裡的成本其實是遠遠低於時間成本的,隨著專案的發布,空間成本會越來越低。
表的數目不要太多,一般20-30張就夠了。如果表的數目太多,則可以考慮採用同化操作,即將大體相同的實體放入到一張表中。
當資料庫中的資訊非常龐大時,不要使用外來鍵(逆規範化),因為由此可能帶來非常大的效能損失。
一般以消耗儲存空間來換取效率。
三大正規化只是一般設計資料庫的基本理念,可以建立冗餘較小、結構合理的資料庫。如果有特殊情況,當然要特殊對待,資料庫設計最重要的是看需求跟效能,需求》效能》表結構。所以不能一味的去追求正規化建立資料庫。
資料庫設計三大正規化資料庫設計三大正規化
為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...
資料庫三大正規化
1 第一正規化 1nf 在任何乙個關聯式資料庫中,第一正規化 1nf 是對關係模式的基本要求,不滿足第一正規化 1nf 的資料庫就不是關聯式資料庫。所謂第一正規化 1nf 是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現...
資料庫三大正規化
第一正規化 確保每列的原子性.如果每列 或者每個屬性 都是不可再分的最小資料單元 也稱為最小的原子單元 則滿足第一正規化.例如 顧客表 姓名 編號 位址 其中 位址 列還可以細分為國家 省 市 區等。第二正規化 在第一正規化的基礎上更進一層,目標是確保表中的每列都和主鍵相關.如果乙個關係滿足第一正規...