乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      數(shù)據(jù)庫范式 相關(guān)復(fù)習(xí)

       燮羽 2010-11-14
      東西很多 要慢慢看。。大概整合了三篇文章

      設(shè)計(jì)范式(范式
      ,數(shù)據(jù)庫設(shè)計(jì)范式,數(shù)據(jù)庫的設(shè)計(jì)范式)是符合某一種級別的關(guān)系模式的集合。構(gòu)造數(shù)據(jù)庫必須遵循一定的規(guī)則。在關(guān)系數(shù)據(jù)庫中,這種規(guī)則就是范式。關(guān)系數(shù)據(jù)庫中的關(guān)系必須滿足一定的要求,即滿足不同的范式。目前關(guān)系數(shù)據(jù)庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎(chǔ)上進(jìn)一步滿足更多要求的稱為第二范式(2NF),其余范式以次類推。一般說來,數(shù)據(jù)庫只需滿足第三范式(3NF)就行了。下面我們舉例介紹第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

      在創(chuàng)建一個數(shù)據(jù)庫的過程中,范化是將其轉(zhuǎn)化為一些表的過程,這種方法可以使從數(shù)據(jù)庫得到的結(jié)果更加明確。這樣可能使數(shù)據(jù)庫產(chǎn)生重復(fù)數(shù)據(jù),從而導(dǎo)致創(chuàng)建多余的表。范化是在識別數(shù)據(jù)庫中的數(shù)據(jù)元素、關(guān)系,以及定義所需的表和各表中的項(xiàng)目這些初始工作之后的一個細(xì)化的過程。

      下面是范化的一個例子  

      Customer   Item purchased    Purchase price   

      Thomas    Shirt        $40   

      Maria Tennis  shoes            $35    

      Evelyn    Shirt                                           $40  

      Pajaro      Trousers              $25   
      如果上面這個表用于保存物品的價格,而你想要刪除其中的一個顧客,這時你就必須同時刪除一個價格。范化就是要解決這個問題,你可以將這個表化為兩個表,一個用于存儲每個顧客和他所買物品的信息,另一個用于存儲每件產(chǎn)品和其價格的信息,這樣對其中一個表做添加或刪除操作就不會影響另一個表。
        
      關(guān)系數(shù)據(jù)庫的幾種設(shè)計(jì)范式介紹


      1
      第一范式(1NF

      在任何一個關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對關(guān)系模式的基本要求,不滿足第一范式(1NF)的數(shù)據(jù)庫就不是關(guān)系數(shù)據(jù)庫。

      所謂第一范式(1NF)是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個值,即實(shí)體中的某個屬性不能有多個值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對多關(guān)系。在第一范式(1NF)中表的每一行只包含一個實(shí)例的信息。例如,對于圖3-2 中的員工信息表,不能將員工信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工信息表的每一行只表示一個員工的信息,一個員工的信息在表中只出現(xiàn)一次。簡而言之,第一范式就是無重復(fù)的列。

      2
      第二范式(2NF

      第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個實(shí)例或行必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實(shí)例的惟一標(biāo)識。如圖3-2 員工信息表中加上了員工編號(emp_id)列,因?yàn)槊總€員工的員工編號是惟一的,因此每個員工可以被惟一區(qū)分。這個惟一屬性列被稱為主關(guān)鍵字或主鍵、主碼。

      第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個新的實(shí)體,新實(shí)體與原實(shí)體之間是一對多的關(guān)系。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實(shí)例的惟一標(biāo)識。簡而言之,第二范式就是非主屬性必須依賴于整個主關(guān)鍵字

      3
      第三范式(3NF

      滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在圖3-2的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會有大量的數(shù)據(jù)冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性。

      數(shù)據(jù)庫設(shè)計(jì)三大范式應(yīng)用實(shí)例剖析

      數(shù)據(jù)庫的設(shè)計(jì)范式是數(shù)據(jù)庫設(shè)計(jì)所需要滿足的規(guī)范,滿足這些規(guī)范的數(shù)據(jù)庫是簡潔的、結(jié)構(gòu)明晰的,同時,不會發(fā)生插入(insert)、刪除(delete)和更新(update)操作異常。反之則是亂七八糟,不僅給數(shù)據(jù)庫的編程人員制造麻煩,而且面目可憎,可能存儲了大量不需要的冗余信息。

      設(shè)計(jì)范式是不是很難懂呢?非也,大學(xué)教材上給我們一堆數(shù)學(xué)公式我們當(dāng)然看不懂,也記不住。所以我們很多人就根本不按照范式來設(shè)計(jì)數(shù)據(jù)庫。

      實(shí)質(zhì)上,設(shè)計(jì)范式用很形象、很簡潔的話語就能說清楚,道明白。本文將對范式進(jìn)行通俗地說明,并以筆者曾經(jīng)設(shè)計(jì)的一個簡單論壇的數(shù)據(jù)庫為例來講解怎樣將這些范式應(yīng)用于實(shí)際工程。

      范式說明

      第一范式(1NF):數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。

      例如,如下的數(shù)據(jù)庫表是符合第一范式的:

      字段1 字段2 字段3 字段4


      而這樣的數(shù)據(jù)庫表是不符合第一范式的:

      字段1 字段2 字段3 字段4
      字段3.1 字段3.2



      很顯然,在當(dāng)前的任何關(guān)系數(shù)據(jù)庫管理系統(tǒng)(DBMS)中,傻瓜也不可能做出不符合第一范式的數(shù)據(jù)庫,因?yàn)檫@些DBMS不允許你把數(shù)據(jù)庫表的一列再分成二列或多列。因此,你想在現(xiàn)有的DBMS中設(shè)計(jì)出不符合第一范式的數(shù)據(jù)庫都是不可能的。

      第二范式(2NF):數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依賴(部分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所有非關(guān)鍵字段都完全依賴于任意一組候選關(guān)鍵字。

      假定選課關(guān)系表為SelectCourse(學(xué)號, 姓名, 年齡, 課程名稱, 成績, 學(xué)分),關(guān)鍵字為組合關(guān)鍵字(學(xué)號, 課程名稱),因?yàn)榇嬖谌缦聸Q定關(guān)系:

      (
      學(xué)號, 課程名稱) → (姓名, 年齡, 成績, 學(xué)分)

      這個數(shù)據(jù)庫表不滿足第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:

      (
      課程名稱) → (學(xué)分)

      (
      學(xué)號) → (姓名, 年齡)

      即存在組合關(guān)鍵字中的字段決定非關(guān)鍵字的情況。

      由于不符合2NF,這個選課關(guān)系表會存在如下問題:

      (1)
      數(shù)據(jù)冗余:

      同一門課程由n個學(xué)生選修,"學(xué)分"就重復(fù)n-1次;同一個學(xué)生選修了m門課程,姓名和年齡就重復(fù)了m-1次。

      (2)
      更新異常:

      若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的"學(xué)分"值都要更新,否則會出現(xiàn)同一門課程學(xué)分不同的情況。

      (3)
      插入異常:

      假設(shè)要開設(shè)一門新的課程,暫時還沒有人選修。這樣,由于還沒有"學(xué)號"關(guān)鍵字,課程名稱和學(xué)分也無法記錄入數(shù)據(jù)庫。

      (4)
      刪除異常:

      假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫表中刪除。但是,與此同時,課程名稱和學(xué)分信息也被刪除了。很顯然,這也會導(dǎo)致插入異常。

      把選課關(guān)系表SelectCourse改為如下三個表:

      學(xué)生:Student(學(xué)號, 姓名, 年齡);

      課程:Course(課程名稱, 學(xué)分);

      選課關(guān)系:SelectCourse(學(xué)號, 課程名稱, 成績)。

      這樣的數(shù)據(jù)庫表是符合第二范式的, 消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。

      另外,所有單關(guān)鍵字的數(shù)據(jù)庫表都符合第二范式,因?yàn)椴豢赡艽嬖诮M合關(guān)鍵字。

      第三范式(3NF):在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。所謂傳遞函數(shù)依賴,指的是如果存在"A → B → C"的決定關(guān)系,則C傳遞函數(shù)依賴于A。因此,滿足第三范式的數(shù)據(jù)庫表應(yīng)該不存在如下依賴關(guān)系:

      關(guān)鍵字段非關(guān)鍵字段x → 非關(guān)鍵字段y

      假定學(xué)生關(guān)系表為Student(學(xué)號, 姓名, 年齡, 所在學(xué)院, 學(xué)院地點(diǎn), 學(xué)院電話),關(guān)鍵字為單一關(guān)鍵字"學(xué)號",因?yàn)榇嬖谌缦聸Q定關(guān)系:

      (
      學(xué)號) → (姓名, 年齡, 所在學(xué)院, 學(xué)院地點(diǎn), 學(xué)院電話)

      這個數(shù)據(jù)庫是符合2NF的,但是不符合3NF,因?yàn)榇嬖谌缦聸Q定關(guān)系:

      (
      學(xué)號) → (所在學(xué)院) → (學(xué)院地點(diǎn), 學(xué)院電話)

      即存在非關(guān)鍵字段"學(xué)院地點(diǎn)"、"學(xué)院電話"對關(guān)鍵字段"學(xué)號"的傳遞函數(shù)依賴。

      它也會存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況,讀者可自行分析得知。

      把學(xué)生關(guān)系表分為如下兩個表:

      學(xué)生:(學(xué)號, 姓名, 年齡, 所在學(xué)院)

      學(xué)院:(學(xué)院, 地點(diǎn), 電話)。

      這樣的數(shù)據(jù)庫表是符合第三范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。

      鮑依斯-科得范式BCNF):在第三范式的基礎(chǔ)上,數(shù)據(jù)庫表中如果不存在任何字段對任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。

      假設(shè)倉庫管理關(guān)系表為StorehouseManage(倉庫ID, 存儲物品ID, 管理員ID, 數(shù)量),且有一個管理員只在一個倉庫工作;一個倉庫可以存儲多種物品。這個數(shù)據(jù)庫表中存在如下決定關(guān)系:

      (
      倉庫ID, 存儲物品ID) →(管理員ID, 數(shù)量)

      (
      管理員ID, 存儲物品ID) → (倉庫ID, 數(shù)量)

      所以,(倉庫ID, 存儲物品ID)(管理員ID, 存儲物品ID)都是StorehouseManage的候選關(guān)鍵字,表中的唯一非關(guān)鍵字段為數(shù)量,它是符合第三范式的。但是,由于存在如下決定關(guān)系:

      (
      倉庫ID) → (管理員ID)

      (
      管理員ID) → (倉庫ID)

      即存在關(guān)鍵字段決定關(guān)鍵字段的情況,所以其不符合BCNF范式。它會出現(xiàn)如下異常情況:

      (1)
      刪除異常:

      當(dāng)倉庫被清空后,所有"存儲物品ID""數(shù)量"信息被刪除的同時,"倉庫ID""管理員ID"信息也被刪除了。

      (2)
      插入異常:

      當(dāng)倉庫沒有存儲任何物品時,無法給倉庫分配管理員。

      (3)
      更新異常:

      如果倉庫換了管理員,則表中所有行的管理員ID都要修改。

      把倉庫管理關(guān)系表分解為二個關(guān)系表:

      倉庫管理:StorehouseManage(倉庫ID, 管理員ID);

      倉庫:Storehouse(倉庫ID, 存儲物品ID, 數(shù)量)

      這樣的數(shù)據(jù)庫表是符合BCNF范式的,消除了刪除異常、插入異常和更新異常。

      范式應(yīng)用

      我們來逐步搞定一個論壇的數(shù)據(jù)庫,有如下信息:

      1 用戶:用戶名,email,主頁,電話,聯(lián)系地址

      2 帖子:發(fā)帖標(biāo)題,發(fā)帖內(nèi)容,回復(fù)標(biāo)題,回復(fù)內(nèi)容

      第一次我們將數(shù)據(jù)庫設(shè)計(jì)為僅僅存在表:


      用戶名 email 主頁 電話 聯(lián)系地址 發(fā)帖標(biāo)題 發(fā)帖內(nèi)容 回復(fù)標(biāo)題 回復(fù)內(nèi)容

      這個數(shù)據(jù)庫表符合第一范式,但是沒有任何一組候選關(guān)鍵字能決定數(shù)據(jù)庫表的整行,唯一的關(guān)鍵字段用戶名也不能完全決定整個元組。我們需要增加"發(fā)帖ID"、"回復(fù)ID"字段,即將表修改為:

      用戶名 email 主頁 電話 聯(lián)系地址 發(fā)帖ID 發(fā)帖標(biāo)題 發(fā)帖內(nèi)容 回復(fù)ID 回復(fù)標(biāo)題 回復(fù)內(nèi)容

      這樣數(shù)據(jù)表中的關(guān)鍵字(用戶名,發(fā)帖ID,回復(fù)ID)能決定整行:

      (
      用戶名,發(fā)帖ID,回復(fù)ID) → (email,主頁,電話,聯(lián)系地址,發(fā)帖標(biāo)題,發(fā)帖內(nèi)容,回復(fù)標(biāo)題,回復(fù)內(nèi)容)

      但是,這樣的設(shè)計(jì)不符合第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:

      (
      用戶名) → (email,主頁,電話,聯(lián)系地址)

      (
      發(fā)帖ID) → (發(fā)帖標(biāo)題,發(fā)帖內(nèi)容)

      (
      回復(fù)ID) → (回復(fù)標(biāo)題,回復(fù)內(nèi)容)

      即非關(guān)鍵字段部分函數(shù)依賴于候選關(guān)鍵字段,很明顯,這個設(shè)計(jì)會導(dǎo)致大量的數(shù)據(jù)冗余和操作異常。

      我們將數(shù)據(jù)庫表分解為(帶下劃線的為關(guān)鍵字):

      1 用戶信息:用戶名,email,主頁,電話,聯(lián)系地址

      2 帖子信息:發(fā)帖ID,標(biāo)題,內(nèi)容

      3 回復(fù)信息:回復(fù)ID,標(biāo)題,內(nèi)容

      4 發(fā)貼:用戶名,發(fā)帖ID

      5 回復(fù):發(fā)帖ID,回復(fù)ID

      這樣的設(shè)計(jì)是滿足第1、2、3范式和BCNF范式要求的,但是這樣的設(shè)計(jì)是不是最好的呢?

      不一定。

      觀察可知,第4項(xiàng)"發(fā)帖"中的"用戶名""發(fā)帖ID"之間是1N的關(guān)系,因此我們可以把"發(fā)帖"合并到第2項(xiàng)的"帖子信息"中;第5項(xiàng)"回復(fù)"中的"發(fā)帖ID""回復(fù)ID"之間也是1N的關(guān)系,因此我們可以把"回復(fù)"合并到第3項(xiàng)的"回復(fù)信息"中。這樣可以一定量地減少數(shù)據(jù)冗余,新的設(shè)計(jì)為:

      1 用戶信息:用戶名,email,主頁,電話,聯(lián)系地址

      2 帖子信息:用戶名,發(fā)帖ID,標(biāo)題,內(nèi)容

      3 回復(fù)信息:發(fā)帖ID,回復(fù)ID,標(biāo)題,內(nèi)容

      數(shù)據(jù)庫表1顯然滿足所有范式的要求;

      數(shù)據(jù)庫表2中存在非關(guān)鍵字段"標(biāo)題""內(nèi)容"對關(guān)鍵字段"發(fā)帖ID"的部分函數(shù)依賴,即不滿足第二范式的要求,但是這一設(shè)計(jì)并不會導(dǎo)致數(shù)據(jù)冗余和操作異常;

      數(shù)據(jù)庫表3中也存在非關(guān)鍵字段"標(biāo)題""內(nèi)容"對關(guān)鍵字段"回復(fù)ID"的部分函數(shù)依賴,也不滿足第二范式的要求,但是與數(shù)據(jù)庫表2相似,這一設(shè)計(jì)也不會導(dǎo)致數(shù)據(jù)冗余和操作異常。

      由此可以看出,并不一定要強(qiáng)行滿足范式的要求,對于1N關(guān)系,當(dāng)1的一邊合并到N的那邊后,N的那邊就不再滿足第二范式了,但是這種設(shè)計(jì)反而比較好!

      對于MN的關(guān)系,不能將M一邊或N一邊合并到另一邊去,這樣會導(dǎo)致不符合范式要求,同時導(dǎo)致操作異常和數(shù)據(jù)冗余。
      對于11的關(guān)系,我們可以將左邊的1或者右邊的1合并到另一邊去,設(shè)計(jì)導(dǎo)致不符合范式要求,但是并不會導(dǎo)致操作異常和數(shù)據(jù)冗余。

      結(jié)論

      滿足范式要求的數(shù)據(jù)庫設(shè)計(jì)是結(jié)構(gòu)清晰的,同時可避免數(shù)據(jù)冗余和操作異常。這并意味著不符合范式要求的設(shè)計(jì)一定是錯誤的,在數(shù)據(jù)庫表中存在111N關(guān)系這種較特殊的情況下,合并導(dǎo)致的不符合范式要求反而是合理的。
       

      理解數(shù)據(jù)庫范式

      系統(tǒng)是短暫的

      數(shù)據(jù)是永恒的

      數(shù) 據(jù)庫范式是數(shù)據(jù)庫設(shè)計(jì)中必不可少的知識,沒有對范式的理解,就無法設(shè)計(jì)出高效率、優(yōu)雅的數(shù)據(jù)庫。甚至設(shè)計(jì)出錯誤的數(shù)據(jù)庫。而想要理解并掌握范式卻并不是那 么容易。教科書中一般以關(guān)系代數(shù)的方法來解釋數(shù)據(jù)庫范式。這樣做雖然能夠十分準(zhǔn)確的表達(dá)數(shù)據(jù)庫范式,但比較抽象,不太直觀,不便于理解,更難以記憶。

      本 文用較為直白的語言介紹范式,旨在便于理解和記憶,這樣做可能會出現(xiàn)一些不精確的表述。但對于初學(xué)者應(yīng)該是個不錯的入門。我寫下這些的目的主要是為了加強(qiáng) 記憶,其實(shí)我也比較菜,我希望當(dāng)我對一些概念生疏的時候,回過頭來看看自己寫的筆記,可以快速地進(jìn)入狀態(tài)。如果你發(fā)現(xiàn)其中用錯誤,請指正。

             下面開始進(jìn)入正題:

      一、基礎(chǔ)概念

      要理解范式,首先必須對知道什么是關(guān)系數(shù)據(jù)庫,如果你不知道,我可以簡單的不能再簡單的說一下:關(guān)系數(shù)據(jù)庫就是用二維表來保存數(shù)據(jù)。表和表之間可以……(省略10W字)。

      然后你應(yīng)該理解以下概念:

      實(shí)體:現(xiàn)實(shí)世界中客觀存在并可以被區(qū)別的事物。比如“一個學(xué)生”、“一本書”、“一門課”等等。值得強(qiáng)調(diào)的是這里所說的“事物”不僅僅是看得見摸得著的“東西”,它也可以是虛擬的,不如說“老師與學(xué)校的關(guān)系”。

       

      屬性:教科書上解釋為:“實(shí)體所具有的某一特性”,由此可見,屬性一開始是個邏輯概念,比如說,“性別”是“人”的一個屬性。在關(guān)系數(shù)據(jù)庫中,屬性又是個物理概念,屬性可以看作是“表的一列”。

       

      元組:表中的一行就是一個元組。

       

      分量:元組的某個屬性值。在一個關(guān)系數(shù)據(jù)庫中,它是一個操作原子,即關(guān)系數(shù)據(jù)庫在做任何操作的時候,屬性是“不可分的”。否則就不是關(guān)系數(shù)據(jù)庫了。

       

      碼:表中可以唯一確定一個元組的某個屬性(或者屬性組),如果這樣的碼有不止一個,那么大家都叫候選碼,我們從候選碼中挑一個出來做老大,它就叫主碼。

       

      全碼:如果一個碼包含了所有的屬性,這個碼就是全碼。

       

      主屬性:一個屬性只要在任何一個候選碼中出現(xiàn)過,這個屬性就是主屬性。

       

      非主屬性:與上面相反,沒有在任何候選碼中出現(xiàn)過,這個屬性就是非主屬性。

       

      外碼:一個屬性(或?qū)傩越M),它不是碼,但是它別的表的碼,它就是外碼。

       

      二、6個范式

      好了,上面已經(jīng)介紹了我們掌握范式所需要的全部基礎(chǔ)概念,下面我們就來講范式。首先要明白,范式的包含關(guān)系。一個數(shù)據(jù)庫設(shè)計(jì)如果符合第二范式,一定也符合第一范式。如果符合第三范式,一定也符合第二范式…

       

       

       

      第一范式(1NF):屬性不可分。

      在前面我們已經(jīng)介紹了屬性值的概念,我們說,它是“不可分的”。而第一范式要求屬性也不可分。那么它和屬性值不可分有什么區(qū)別呢?給一個例子:

      name

      tel

      age

      大寶

      13612345678

      22

      小明

      13988776655

      0101234567

      21

             

      Ps:這個表中,屬性值“分”了。

      name

      tel

      age

      手機(jī)

      座機(jī)

      大寶

      13612345678

      0219876543

      22

      小明

      13988776655

      0101234567

      21

      Ps:這個表中,屬性 “分”了。

      這兩種情況都不滿足第一范式。不滿足第一范式的數(shù)據(jù)庫,不是關(guān)系數(shù)據(jù)庫!所以,我們在任何關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,做不出這樣的“表”來。

       

       

       

      第二范式(2NF:符合1NF,并且,非主屬性完全依賴于碼。

      聽起來好像很神秘,其實(shí)真的沒什么。

      一 個候選碼中的主屬性也可能是好幾個。如果一個主屬性,它不能單獨(dú)做為一個候選碼,那么它也不能確定任何一個非主屬性。給一個反例:我們考慮一個小學(xué)的教務(wù) 管理系統(tǒng),學(xué)生上課指定一個老師,一本教材,一個教室,一個時間,大家都上課去吧,沒有問題。那么數(shù)據(jù)庫怎么設(shè)計(jì)?(學(xué)生上課表)

      學(xué)生

      課程

      老師

      老師職稱

      教材

      教室

      上課時間

      小明

      一年級語文(上)

      大寶

      副教授

      《小學(xué)語文1

      101

      1430

      一個學(xué)生上一門課,一定在特定某個教室。所以有(學(xué)生,課程)->教室

      一個學(xué)生上一門課,一定是特定某個老師教。所以有(學(xué)生,課程)->老師

      一個學(xué)生上一門課,他老師的職稱可以確定。所以有(學(xué)生,課程)->老師職稱

      一個學(xué)生上一門課,一定是特定某個教材。所以有(學(xué)生,課程)->教材

      一個學(xué)生上一門課,一定在特定時間。所以有(學(xué)生,課程)->上課時間

      因此(學(xué)生,課程)是一個碼。

      然而,一個課程,一定指定了某個教材,一年級語文肯定用的是《小學(xué)語文1》,那么就有課程->教材。(學(xué)生,課程)是個碼,課程卻決定了教材,這就叫做不完全依賴,或者說部分依賴。出現(xiàn)這樣的情況,就不滿足第二范式!

      有什么不好嗎?你可以想想:

      1、             校長要新增加一門課程叫“微積分”,教材是《大學(xué)數(shù)學(xué)》,怎么辦?學(xué)生還沒選課,而學(xué)生又是主屬性,主屬性不能空,課程怎么記錄呢,教材記到哪呢? ……郁悶了吧?(插入異常)

      2、             下學(xué)期沒學(xué)生學(xué)一年級語文(上)了,學(xué)一年級語文(下)去了,那么表中將不存在一年級語文(上),也就沒了《小學(xué)語文1》。這時候,校長問:一年級語文(上)用的什么教材啊?……郁悶了吧?(刪除異常)

      3、             校長說:一年級語文(上)換教材,換成《大學(xué)語文》。有10000個學(xué)生選了這么課,改動好大啊!改累死了……郁悶了吧?(修改異常)

      那應(yīng)該怎么解決呢?投影分解,將一個表分解成兩個或若干個表

      學(xué)生

      課程

      老師

      老師職稱

      教室

      上課時間

      小明

      一年級語文(上)

      大寶

      副教授

      101

      1430

      學(xué)生上課表新

      課程

      教材

      一年級語文(上)

      《小學(xué)語文1

      課程的表

       

       

      第三范式(3NF):符合2NF,并且,消除傳遞依賴

      上面的“學(xué)生上課表新”符合2NF,可以這樣驗(yàn)證:兩個主屬性單獨(dú)使用,不用確定其它四個非主屬性的任何一個。但是它有傳遞依賴!

      在哪呢?問題就出在“老師”和“老師職稱”這里。一個老師一定能確定一個老師職稱。

      有什么問題嗎?想想:

      1、  老師升級了,變教授了,要改數(shù)據(jù)庫,表中有N條,改了N次……(修改異常)

      2、  沒人選這個老師的課了,老師的職稱也沒了記錄……(刪除異常)

      3、  新來一個老師,還沒分配教什么課,他的職稱記到哪?……(插入異常)

      那應(yīng)該怎么解決呢?和上面一樣,投影分解:

      學(xué)生

      課程

      老師

      教室

      上課時間

      小明

      一年級語文(上)

      大寶

      101

      1430

       

      老師

      老師職稱

      大寶

      副教授

       

      BC范式(BCNF):符合3NF,并且,主屬性不依賴于主屬性

      若關(guān)系模式屬于第一范式,且每個屬性都不傳遞依賴于鍵碼,則R屬于BC范式。

      通常BC范式的條件有多種等價的表述:每個非平凡依賴的左邊必須包含鍵碼;每個決定因素必須包含鍵碼。

      BC范式既檢查非主屬性,又檢查主屬性。當(dāng)只檢查非主屬性時,就成了第三范式。滿足BC范式的關(guān)系都必然滿足第三范式。

      還可以這么說:若一個關(guān)系達(dá)到了第三范式,并且它只有一個候選碼,或者它的每個候選碼都是單屬性,則該關(guān)系自然達(dá)到BC范式。

       

      一般,一個數(shù)據(jù)庫設(shè)計(jì)符合3NFBCNF就可以了。在BC范式以上還有第四范式、第五范式。

      第四范式:要求把同一表內(nèi)的多對多關(guān)系刪除。

      第五范式:從最終結(jié)構(gòu)重新建立原始結(jié)構(gòu)。

      但在絕大多數(shù)應(yīng)用中不需要設(shè)計(jì)到這種程度。并且,某些情況下,過于范式化甚至?xí)?shù)據(jù)庫的邏輯可讀性和使用效率起到阻礙。數(shù)據(jù)庫中一定程度的冗余并不一定是壞事情。如果你對第四范式、第五范式感興趣可以看一看專業(yè)教材,從頭學(xué)起,并且忘記我說的一切,以免對你產(chǎn)生誤導(dǎo)。
       

      關(guān)系模式的范式

          主要有4種范式,1NF,2NF3NF,BCNF,按從左至右的順序一種比一種要求更嚴(yán)格。要符合某一種范式必須也滿足它前邊的所有范式。一般項(xiàng)目的數(shù)據(jù)庫設(shè)計(jì)達(dá)到3NF就可以了,而且可根據(jù)具體情況適當(dāng)增加冗余,不必教條地遵守所謂規(guī)范。

      簡單而言,1NF就是要求一張表里只放相互關(guān)聯(lián)的字段,一個字段里只放一條信息,這只是最基本的要求。至于2NF,3NF,BCNF雖然描述的內(nèi)容不同,但表現(xiàn)在數(shù)據(jù)特點(diǎn)上很相似,就好比在說不要為了向某廠訂購一批貨記下來,就把的廠的面積、電話等都放在同一張表里,而應(yīng)該用兩張表,以盡量避免浪費(fèi)數(shù)據(jù)存儲空間。因?yàn)楹屯粋€廠可能會交易好幾次,但沒必要每次交易都記錄全部的信息。

      從范式所允許的函數(shù)依賴方面進(jìn)行比較,四種范式之間的關(guān)聯(lián)如下圖所示。

      以下對每種范式作一一說明。

      2.3.4.2  第一范式

      在關(guān)系模式R中的每一個具體關(guān)系r中,如果每個屬性值 都是不可再分的最小數(shù)據(jù)單位,則稱R是第一范式的關(guān)系。

      例:如職工號,姓名,電話號碼組成一個表(一個人可能有一個辦公室電話 和一個家里電話號碼) 規(guī)范成為1NF有三種方法:
      一是重復(fù)存儲職工號和姓名。這樣,關(guān)鍵字只能是電話號碼。
      二是職工號為關(guān)鍵字,電話號碼分為單位電話和住宅電話兩個屬性
      三是職工號為關(guān)鍵字,但強(qiáng)制每條記錄只能有一個電話號碼。
      以上三個方法,第一種方法最不可取,按實(shí)際情況選取后兩種情況。

      2.3.4.3  第二范式

      關(guān)系的第二范式(2NF)定義: 如果關(guān)系模式R1NF,并且R中的每一個非主屬性都完全依賴于R的某個候選關(guān)鍵字,則稱R是第二范式的,簡記為2NF。

      【例2.40 設(shè)有關(guān)系模式R(學(xué)號S#,課程號C#,成績G,任課教師TN,教師專長TS),基于R的函數(shù)依賴集F={(S#,C#)→G,C#→TN,TN→TS},判斷R是否為2NF。

      解:

      (1) 容易看出,關(guān)系模式R1NF。因?yàn)?span>R符合關(guān)系的定義,R的所有屬性值都是不可再分的原子值。

      R是否為2NF,應(yīng)根據(jù)2NF的定義來判斷。                                          

      首先要確定關(guān)系模式R中各屬性間的函數(shù)依賴情況。如果沒有直接給出R的函數(shù)依賴集,就要按照語義把它確定下來。在本例中,已直接給出基于R的函數(shù)依賴集F,我們可使用阿氏推理規(guī)則并結(jié)合下面介紹的方法,進(jìn)一步確定R中哪些是主屬性、哪些是非主屬性、侯選關(guān)鍵字由哪些屬性構(gòu)成。

      方法①  寫出函數(shù)依賴集F中的各個函數(shù)依賴以幫助分析。方法的特點(diǎn)是直接。

      F={(S#,C#)→G,

      C#→TN,

      TN→TS

      }

          方法②  用有向圖表示屬性間函數(shù)依賴,結(jié)點(diǎn)表示屬性,方框包含若干個結(jié)點(diǎn)表示屬性組合,有向箭頭表示函數(shù)依賴。本例的函數(shù)依賴圖如圖2.9所示。方法的特點(diǎn)是直觀

      2.9 函數(shù)依賴圖例子

          方法③  把關(guān)系模式R與函數(shù)依賴集F結(jié)合起來,屬性組合用下劃線(或上劃線)表示,函數(shù)依賴用有向箭頭表示。本例的函數(shù)依賴簡圖如圖2.10所示。方法的特點(diǎn)是簡單。

      2.10函數(shù)依賴簡圖例子

          用阿氏推理規(guī)則由F可推出:(S#,C#)→{S#,C#,G,TN,TS},即屬性組合(S#,C#)R的候選關(guān)鍵字(R只有這一個候選鍵)(S#,C#)的一個值可惟一標(biāo)識R中的一個元組(并且沒有多余的屬性)。

      R中,S#,C#是主屬性;其余的屬性G,TN,TS為非主屬性。

      借助上面的圖,我們可以看到,非主屬性G對鍵是完全依賴:(S#,C#)→G。但非主屬性TN,TS對鍵是部分依賴(他們僅依賴于鍵的真子集C#)。由于R中存在非主屬性對候選鍵的部分依賴,所以關(guān)系模式R不是2NF。

      R中存在非主屬性對候選鍵的部分依賴,將會引起數(shù)據(jù)冗余、數(shù)據(jù)操作異常等問題??梢园殃P(guān)系R無損聯(lián)接地分解成兩個2NF的關(guān)系模式:

      ρ={R1,R2}R1={S#.C#,G},R2={C#,TN,TS}。

      【例2.41】選課關(guān)系 SCISNO,CNO,GRADE,CREDIT)其中SNO為學(xué)號, CNO為課程號,GRADEGE 為成績,CREDIT 為學(xué)分。

      由以上條件,關(guān)鍵字為組合關(guān)鍵字(SNO,CNO
      在應(yīng)用中使用以上關(guān)系模式有以下問題:
      a.
      數(shù)據(jù)冗余,假設(shè)同一門課由40個學(xué)生選修,學(xué)分就 重復(fù)40次。
      b.
      更新異常,若調(diào)整了某課程的學(xué)分,相應(yīng)的元組CREDIT值都要更新,有可能會出現(xiàn)同一門課學(xué)分不同。
      c.
      插入異常,如計(jì)劃開新課,由于沒人選修,沒有學(xué)號關(guān)鍵字,只能等有人選修才能把課程和學(xué)分存入。
      d.
      刪除異常,若學(xué)生已經(jīng)結(jié)業(yè),從當(dāng)前數(shù)據(jù)庫刪除選修記錄,就會可能連課程號及學(xué)分完全從數(shù)據(jù)庫中刪除,則此門課程及學(xué)分記錄無法保存。
      原因:非關(guān)鍵字屬性CREDIT僅函數(shù)依賴于CNO,也就是CREDIT部分依賴組合關(guān)鍵字(SNOCNO)而不是完全依賴。
      解決方法:分成兩個關(guān)系模式 SC1SNO,CNO,GRADE),C2CNO,CREDIT)。新關(guān)系包括兩個關(guān)系模式,它們之間通過SC1中的外關(guān)鍵字CNO相聯(lián)系,需要時再進(jìn)行自然聯(lián)接,恢復(fù)了原來的關(guān)系
       

      2.3.4.4  第三范式

      關(guān)系的第三范式(3NF)定義: 如果關(guān)系模式R2NF,并且R中的每一個非主屬性都不傳遞依賴于R的某個候選關(guān)鍵字,則稱R是第三范式的,簡記為3NF。

      【例2.42】續(xù)上例2.40R(學(xué)號S#,課程號C#,成績G,任課教師TN,教師專長TS)),判斷關(guān)系模式R1={S#.C#,G},R2={C#,TN,TS} 是否為3NF

      解:

      (1) 在關(guān)系模式R1={S#,C#,G},候選關(guān)鍵字是(S#,C#),主屬性是S#,C#,非主屬性是G,函數(shù)依賴為(S#,C#)→G  由于R1中不存在非主屬性對候選關(guān)鍵字的傳遞依賴,所以關(guān)系模式R13NF。

      (2) 在關(guān)系模式R2={C#,TN,TS},候選關(guān)鍵字是C#,主屬性是C#,非主屬性是TN,TS,函數(shù)依賴為C#→TN,TN→TS。由于R2中存在非主屬性對候選關(guān)鍵字的傳遞依賴C# TS,所以關(guān)系模式R2不是3NF。

      可以把關(guān)系R2無損聯(lián)接地分解成兩個3NF的關(guān)系模式:

      ρ={R3,R4}R3={C#,TN},R4={TN,TS}。

      【例2.43】如(SNOSNAME,DNODNAME,LOCATION 各屬性分別代表學(xué)號,
      姓名,所在系,系名稱,系地址。
      判斷關(guān)系模式S1是否為3NF。


      關(guān)鍵字SNO決定各個屬性。由于是單個關(guān)鍵字,沒有部分依賴的問題,是2NF

      但這關(guān)系有大量的冗余,有關(guān)學(xué)生所在的幾個屬性DNODNAME,LOCATION將重復(fù)存儲,插入,刪除和修改時也將產(chǎn)生類似以上例的情況。
      原因:關(guān)系中存在傳遞依賴造成的。關(guān)鍵字 SNO LOCATION 函數(shù)決定是通過傳遞依賴:SNO -> DNO,及DNO -> LOCATION實(shí)現(xiàn)的。也就是說,SNO不直接決定非主屬性LOCATION,不是3NF。
      解決目地:每個關(guān)系模式中不能留有傳遞依賴。
      解決方法:分為兩個關(guān)系 SSNO,SNAME,DNO),DDNO,DNAMELOCATION
      注意:關(guān)系S中不能沒有外關(guān)鍵字DNO。否則兩個關(guān)系之間失去聯(lián)系。

      2.3.4.5   Boyce-Codd范式

      關(guān)系的Boyce-Codd范式(BCNF)定義: 如果關(guān)系模式R1NF,并且R中的每一個函數(shù)依賴X→Y(YÏX),必有XR的超關(guān)鍵字,則稱RBoyce-Codd范式的,簡記為BCNF。

      BCNF的定義中,可以明顯地得出如下結(jié)論:

      (1) 所有非主屬性對鍵是完全函數(shù)依賴;

      (2) 所有主屬性對不包含它的鍵是完全函數(shù)依賴;

      (3)沒有屬性完全函數(shù)依賴于非鍵的任何屬性組合。

      2NF,3NF的定義不同,BCNF的定義直接建立在1NF的基礎(chǔ)上。但實(shí)質(zhì)上BCNF3NF的改進(jìn)形式。3NF僅考慮了非主屬性對鍵的依賴情況,BCNF把主屬性對鍵的依賴情況也包括進(jìn)去。BCNF要求滿足的條件比3NF所要求的更高。如果關(guān)系模式RBCNF的,那么R必定是3NF,反之,則不一定成立。

      【例2.43 續(xù)前例2.42學(xué)號S#,課程號C#,成績G,任課教師TN,教師專長TS,判斷兩個3NF關(guān)系模式R3={C#,TN},R4={TN,TS}是否為BCNF。

      解:在關(guān)系模式R3中有函數(shù)依賴C#→TN,決定因素C#R3的鍵;

      在關(guān)系模式R4中有函數(shù)依賴TN→TS,決定因素TNR4的鍵;

           R3,R4都滿足BCNF的定義,所以,這兩個關(guān)系模式都是BCNF

      【例2.44配件管理關(guān)系模式 WPEWNO,PNO,ENOQNT)分別表倉庫號,配件號,職工號,數(shù)量。有以下條件
      a.
      一個倉庫有多個職工。
      b.
      一個職工僅在一個倉庫工作。
      c.
      每個倉庫里一種型號的配件由專人負(fù)責(zé),但一個人可以管理幾種配件。
      d.
      同一種型號的配件可以分放在幾個倉庫中
      。
      分析:由以上得 PNO 不能確定QNT,由組合屬性(WNO,PNO)來決定,存在函數(shù)依賴(WNO,PNO -> ENO。由于每個倉庫里的一種配件由專人負(fù)責(zé),而一個人可以管理幾種配件,所以有組合屬性(WNO,PNO)才能確定負(fù)責(zé)人,有(WNO,PNO-> ENO。因?yàn)?span>
      一個職工僅在一個倉庫工作,有ENO -> WNO。由于每個倉庫里的一種配件由專人負(fù)責(zé),而一個職工僅在一個倉庫工作,有 ENO,PNO-> QNT。
      找一下候選關(guān)鍵字,因?yàn)椋?span>WNO,PNO -> QNT,(WNOPNO-> ENO ,因此 WNO,PNO)可以決定整個元組,是一個候選關(guān)鍵字。根據(jù)ENO->WNO,(ENO,PNO->QNT,故(ENO,PNO)也能決定整個元組,為另一個候選關(guān)鍵字。屬性ENO,WNO,PNO 均為主屬性,只有一個非主屬性QNT。它對任何一個候選關(guān)鍵字都是完全函數(shù)依賴的,并且是直接依賴,所以該關(guān)系模式是3NF
      分析一下主屬性。因?yàn)?span>ENO->WNO,主屬性ENOWNO的決定因素,但是它本身不是關(guān)鍵字,只是組合關(guān)鍵字的一部分。這就造成主屬性WNO對另外一個候選關(guān)鍵字(ENO,PNO)的部 分依賴,因?yàn)椋?span>ENO,PNO-> ENO但反過來不成立,而P->WNO,故(ENO,PNO-> WNO 也是傳遞依賴。
      雖然沒有非主屬性對候選關(guān)鍵遼的傳遞依賴,但存在主屬性對候選關(guān)鍵字的傳遞依賴,同樣也會帶來麻煩。如一個新職工分配到倉庫工作,但暫時處于實(shí)習(xí)階段,沒有獨(dú)立負(fù)責(zé)對某些配件的管理任務(wù)。由于缺少關(guān)鍵字的一部分PNO而無法插入到該關(guān)系中去。又如某個人改成不管配件了去負(fù)責(zé)安全,則在刪除配件的同時該職工也會被刪除。
      解決辦法:分成管理EPENO,PNOQNT),關(guān)鍵字是(ENOPNO)工作EWENO,WNO)其關(guān)鍵字是ENO
      缺點(diǎn):分解后函數(shù)依賴的保持性較差。如此例中,由于分解,函數(shù)依賴(WNO,PNO-> ENO 丟失了, 因而對原來的語義有所破壞。沒有體現(xiàn)出每個倉庫里一種部件由專人負(fù)責(zé)。有可能出現(xiàn) 一部件由兩個人或兩個以上的人來同時管理。因此,分解之后的關(guān)系模式降低了部分完整性約束。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多