溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行數(shù)據(jù)庫三大范式的分析

發(fā)布時間:2021-12-02 14:32:52 來源:億速云 閱讀:190 作者:柒染 欄目:數(shù)據(jù)庫

這篇文章將為大家詳細(xì)講解有關(guān)如何進(jìn)行數(shù)據(jù)庫三大范式的分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

一: 引言

       作為一個數(shù)據(jù)庫的學(xué)習(xí)者,搞懂關(guān)系數(shù)據(jù)庫的三大范式是很有用的。然而教科書上有關(guān)數(shù)據(jù)庫范式的介紹都是采用學(xué)術(shù)性的定義,語法羞澀,讓人難懂,故寫下自己對數(shù)據(jù)庫范式的理解,給初學(xué)者提供幫助,也備日后查看。下面不介紹規(guī)范化程度高于3NF的范式,因?yàn)槠湓趯?shí)際應(yīng)用中基本不會用到,原因也是很明顯的(查詢代價(jià)變大),因此,對于很多大型復(fù)雜的系統(tǒng),其數(shù)據(jù)庫設(shè)計(jì)都沒有遵循所謂的范式,這也是為什么會出現(xiàn)所謂的逆規(guī)范化,好了,進(jìn)入正題吧。

二: 范式介紹

    a:第零范式

         第零范式就是指沒有使用任何范式的設(shè)計(jì),其添加數(shù)據(jù)的行為非常詭異,看看下表便知:

         假設(shè)一個學(xué)生學(xué)習(xí)了三門課程,每門課程都有成績,那么,采用第零范式的設(shè)計(jì)將會是如下情況                          

                           表a_0如何進(jìn)行數(shù)據(jù)庫三大范式的分析

         這樣的話,會使得往表中添加數(shù)據(jù)變得非常麻煩,每次添加一個新的數(shù)據(jù),都要添加相應(yīng)的字段,而且,因?yàn)楸碇衅渌挠涗浛赡懿恍枰@么多字段,因此會浪費(fèi)

         很多空間。如表a_1所示。

                       表a_1

如何進(jìn)行數(shù)據(jù)庫三大范式的分析

         由此可以看出,不對數(shù)據(jù)庫任用任何范式是非常愚蠢的,因?yàn)椴粌H會產(chǎn)生大量無用的表字段,而且會使得表結(jié)構(gòu)非常難以維護(hù)。由此,引出第一范式的介紹

    b:  第一范式

         第一范式就是在第零范式的基礎(chǔ)上進(jìn)行的改進(jìn),網(wǎng)上有很多人認(rèn)為,所謂第一范式就是指表中的所有字段都是原子的、不可再分的,我個人認(rèn)為此種理解也是正確的,原因不解釋,我對第一范式的理解是,將

     第零范式中重復(fù)的字段抽取出來,作為表的數(shù)據(jù),從而形成一個穩(wěn)定的、冗余數(shù)據(jù)少得表結(jié)構(gòu)。

        由此,可以得出符合第一范式的表結(jié)構(gòu)應(yīng)該是:

如何進(jìn)行數(shù)據(jù)庫三大范式的分析

        此時,表的結(jié)構(gòu)變得穩(wěn)定了,而且表中的冗余信息相對第零范式也少了很多??墒牵谝环妒街皇顷P(guān)系數(shù)據(jù)庫設(shè)計(jì)的最低滿足的范式,第一范式中仍然有很多的冗余信息,由此,需要引入第二范     式。

    c: 第二范式

         第二范式是滿足屬性對主鍵是完全函數(shù)依賴的,因此,滿足第二范式的表當(dāng)然也是滿足第一范式的,第二范式的目的就是消除表中的部分依賴。

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

              1: 完全函數(shù)依賴

                   設(shè)有屬性集K和P,若K中的所有屬性共同能夠推出P中的任意屬性,且對于K的任何真子集,都不能推出P中的任意屬性,則成K完全函數(shù)依賴P。

              2: 部分函數(shù)依賴

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

         概念性的東西,往往都難懂,舉個例子,方便大家理解:

         假如有一張學(xué)生成績表,包含如下屬性(學(xué)生Id,課程Id,課程分?jǐn)?shù),學(xué)生名字),其中,主鍵為(學(xué)生id,課程id),表中的數(shù)據(jù)如下:

如何進(jìn)行數(shù)據(jù)庫三大范式的分析

         那么,此時這張表的設(shè)計(jì)就不滿足第二范式, 因?yàn)?主鍵(學(xué)生id,課程id) 能夠唯一確定學(xué)生的姓名,因此,不滿足屬性完全函數(shù)依賴主鍵,因此不是第二范式。

         從上面的表數(shù)據(jù)易知,不滿足第二范式的表至少有以下幾個缺點(diǎn):

             1:數(shù)據(jù)重復(fù),浪費(fèi)空間,因?yàn)槊看嬉粭l記錄,都要存學(xué)生的名字,這樣就是得存在大量重復(fù)的數(shù)據(jù)。

             2: 插入異常,若學(xué)生還沒有成績,那么這個學(xué)生就沒有名字。

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

        解決方法:

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

   d: 第三范式

       第三范式是指在滿足第二范式的情況下,消除表中的傳遞依賴。

       所謂傳遞依賴,就是指x-->y,y-->z,那么可以得到y(tǒng)-->z.

       傳遞依賴常發(fā)生在主鍵、外鍵、外鍵相關(guān)的屬性上,例如,假設(shè)有這樣的表

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

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

       很明顯,此處存在傳遞依賴,因?yàn)?學(xué)生id  可以唯一確定  院系id,而 院系id 可以唯一確定 院系名。

       表中的數(shù)據(jù)如下 

       從上面的表數(shù)據(jù)易知,不滿足第三范式的表至少有以下幾個缺點(diǎn):

            1 :  數(shù)據(jù)重復(fù),浪費(fèi)空間,因?yàn)閷W(xué)生表每存一條記錄,都會記錄住院系的名字,存在大量的重復(fù)數(shù)據(jù)。

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

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

三: 數(shù)據(jù)庫設(shè)計(jì)的經(jīng)驗(yàn)

       1: 表的數(shù)目不要太多,一般20-30張就夠了。如果表的數(shù)目太多,則可以考慮采用同化操作,即將大體相同的實(shí)體放入到一張表中。

       2:當(dāng)數(shù)據(jù)庫中的信息非常龐大時,不要使用外鍵(逆規(guī)范化),因?yàn)橛纱丝赡軒矸浅4蟮男阅軗p失。

       3:一般以消耗存儲空間來換取效率。

關(guān)于如何進(jìn)行數(shù)據(jù)庫三大范式的分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI