三大範式

一: 引言數據庫

       做爲一個數據庫的學習者,搞懂關係數據庫的三大範式是頗有用的。然而教科書上有關數據庫範式的介紹都是採用學術性的定義,語法羞澀,讓人難懂,故寫下本身對數據庫範式的理解,給初學者提供幫助,也備往後查看。數據庫設計

       本文不介紹規範化程度高於3NF的範式,由於其在實際應用中基本不會用到,緣由也是很明顯的(查詢代價變大),所以,對於不少大型複雜的系統,其數據庫設計都沒有遵循所謂的範式,這也是爲何會出現所謂的逆規範化,好了,進入正題吧。函數

 

二: 範式介紹性能

    a:第零範式學習

         第零範式就是指沒有使用任何範式的設計,其添加數據的行爲很是詭異,看看下錶便知:spa

         假設一個學生學習了三門課程,每門課程都有成績,那麼,採用第零範式的設計將會是以下狀況                          設計

                           表a_0效率

         這樣的話,會使得往表中添加數據變得很是麻煩,每次添加一個新的數據,都要添加相應的字段,並且,由於表中其餘的記錄可能不須要這麼多字段,所以會浪費基礎

         不少空間。如表a_1所示。語法

                       表a_1

         由此能夠看出,不對數據庫任用任何範式是很是愚蠢的,由於不只會產生大量無用的表字段,並且會使得表結構很是難以維護。由此,引出第一範式的介紹

    b:  第一範式

         第一範式就是在第零範式的基礎上進行的改進,網上有不少人認爲,所謂第一範式就是指表中的全部字段都是原子的、不可再分的,我我的認爲此種理解也是正確的,緣由不解釋,我對第一範式的理解是,將

     第零範式中重複的字段抽取出來,做爲表的數據,從而造成一個穩定的、冗餘數據少得表結構。

        由此,能夠得出符合第一範式的表結構應該是:

 

        此時,表的結構變得穩定了,並且表中的冗餘信息相對第零範式也少了不少。但是,第一範式只是關係數據庫設計的最低知足的範式,第一範式中仍然有不少的冗餘信息,由此,須要引入第二範     式。

 

    c: 第二範式

         第二範式是知足屬性對主鍵是徹底函數依賴的,所以,知足第二範式的表固然也是知足第一範式的,第二範式的目的就是消除表中的部分依賴。

         這裏,有幾個概念要解釋下, 

              1: 徹底函數依賴

                   設有屬性集K和P,若K中的全部屬性共同可以推出P中的任意屬性,且對於K的任何真子集,都不能推出P中的任意屬性,則成K徹底函數依賴P。

              2: 部分函數依賴

                   與上類似,只是,K中存在真子集使得,該子集能推出p中任意屬性。

         概念性的東西,每每都難懂,舉個例子,方便你們理解:

         假若有一張學生成績表,包含以下屬性(學生Id,課程Id,課程分數,學生名字),其中,主鍵爲(學生id,課程id),表中的數據以下:

 

         那麼,此時這張表的設計就不知足第二範式, 由於 主鍵(學生id,課程id) 可以惟一肯定學生的姓名,所以,不知足屬性徹底函數依賴主鍵,所以不是第二範式。

         從上面的表數據易知,不知足第二範式的表至少有如下幾個缺點:

             1:數據重複,浪費空間,由於每存一條記錄,都要存學生的名字,這樣就是得存在大量重複的數據。

             2: 插入異常,若學生尚未成績,那麼這個學生就沒有名字。

             3:  更新異常,刪除異常等

        解決方法:

             將student_name字段放入學生表中,即消除表中的部分依賴。

   d: 第三範式

       第三範式是指在知足第二範式的狀況下,消除表中的傳遞依賴。

       所謂傳遞依賴,就是指x-->y,y-->z,那麼能夠獲得y-->z.

       傳遞依賴常發生在主鍵、外鍵、外鍵相關的屬性上,例如,假設有這樣的表

               學生表(學生id,學生姓名,院系id,院系名)  ,此處主鍵爲(學生id),外鍵爲(院系id)

               院系表(院系id,院長名稱),主鍵爲 (院系id)

       很明顯,此處存在傳遞依賴,由於 學生id  能夠惟一肯定  院系id,而 院系id 能夠惟一肯定 院系名。

       表中的數據以下

         

 

 

       從上面的表數據易知,不知足第三範式的表至少有如下幾個缺點:

            1 :  數據重複,浪費空間,由於學生表每存一條記錄,都會記錄住院系的名字,存在大量的重複數據。

            2:  插入異常,若新建一個院系,而該院系沒有學生的話,該院系就沒有名字。

            3:  更新異常,刪除異常等                 

 

 

三: 數據庫設計的經驗

       1: 表的數目不要太多,通常20-30張就夠了。若是表的數目太多,則能夠考慮採用同化操做,即將大致相同的實體放入到一張表中。

       2:當數據庫中的信息很是龐大時,不要使用外鍵(逆規範化),由於由此可能帶來很是大的性能損失。

       3:通常以消耗存儲空間來換取效率。

相關文章
相關標籤/搜索