数据库 范式
?
范式簡介
設(shè)計(jì)關(guān)系數(shù)據(jù)庫時(shí),遵從不同的規(guī)范要求,設(shè)計(jì)出合理的關(guān)系型數(shù)據(jù)庫,這些不同的規(guī)范要求被稱為不同的范式,各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫冗余越小。 目前關(guān)系數(shù)據(jù)庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎(chǔ)上進(jìn)一步滿足更多規(guī)范要求的稱為第二范式(2NF),其余范式以次類推。一般說來,數(shù)據(jù)庫只需滿足第三范式(3NF)就行了。各類范式
第一范式(1NF)
所謂第一范式(1NF)是指在關(guān)系模型中,對域添加的一個(gè)規(guī)范要求,所有的域都應(yīng)該是原子性的,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng),而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項(xiàng)。即實(shí)體中的某個(gè)屬性有多個(gè)值時(shí),必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個(gè)域值只能是實(shí)體的一個(gè)屬性或一個(gè)屬性的一部分。簡而言之,第一范式就是無重復(fù)的域。 說明:在任何一個(gè)關(guān)系數(shù)據(jù)庫中,第一范式(1NF)是對關(guān)系模式的設(shè)計(jì)基本要求,一般設(shè)計(jì)中都必須滿足第一范式(1NF)。不過有些關(guān)系模型中突破了1NF的限制,這種稱為非1NF的關(guān)系模型。換句話說,是否必須滿足1NF的最低要求,主要依賴于所使用的關(guān)系模型。第二范式(2NF)
在1NF的基礎(chǔ)上,非碼屬性必須完全依賴于候選碼(在1NF基礎(chǔ)上消除非主屬性對主碼的部分函數(shù)依賴) 第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個(gè)實(shí)例或記錄必須可以被唯一地區(qū)分。選取一個(gè)能區(qū)分每個(gè)實(shí)體的屬性或?qū)傩越M,作為實(shí)體的唯一標(biāo)識(shí)。例如在員工表中的身份證號碼即可實(shí)現(xiàn)每個(gè)一員工的區(qū)分,該身份證號碼即為候選鍵,任何一個(gè)候選鍵都可以被選作主鍵。在找不到候選鍵時(shí),可額外增加屬性以實(shí)現(xiàn)區(qū)分,如果在員工關(guān)系中,沒有對其身份證號進(jìn)行存儲(chǔ),而姓名可能會(huì)在數(shù)據(jù)庫運(yùn)行的某個(gè)時(shí)間重復(fù),無法區(qū)分出實(shí)體時(shí),設(shè)計(jì)辟如ID等不重復(fù)的編號以實(shí)現(xiàn)區(qū)分,被添加的編號或ID選作主鍵。(該主鍵的添加是在ER設(shè)計(jì)時(shí)添加,不是建庫時(shí)隨意添加) 第二范式(2NF)要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對多的關(guān)系。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)。簡而言之,第二范式就是在第一范式的基礎(chǔ)上屬性完全依賴于主鍵。第三范式(3NF)
在1NF基礎(chǔ)上,任何非主屬性不依賴于其它非主屬性(在2NF基礎(chǔ)上消除傳遞依賴) 第三范式(3NF)是第二范式(2NF)的一個(gè)子集,即滿足第三范式(3NF)必須滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個(gè)關(guān)系中不包含已在其它關(guān)系已包含的非主關(guān)鍵字信息。例如,存在一個(gè)部門信息表,其中每個(gè)部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會(huì)有大量的數(shù)據(jù)冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性,也就是在滿足2NF的基礎(chǔ)上,任何非主屬性不得傳遞依賴于主屬性。巴斯-科德范式(BCNF)
Boyce-Codd Normal Form(巴斯-科德范式) 在1NF基礎(chǔ)上,任何非主屬性不能對主鍵子集依賴(在3NF基礎(chǔ)上消除對主碼子集的依賴) 巴斯-科德范式(BCNF)是第三范式(3NF)的一個(gè)子集,即滿足巴斯-科德范式(BCNF)必須滿足第三范式(3NF)。通常情況下,巴斯-科德范式被認(rèn)為沒有新的設(shè)計(jì)規(guī)范加入,只是對第二范式與第三范式中設(shè)計(jì)規(guī)范要求更強(qiáng),因而被認(rèn)為是修正第三范式,也就是說,它事實(shí)上是對第三范式的修正,使數(shù)據(jù)庫冗余度更小。這也是BCNF不被稱為第四范式的原因。某些書上,根據(jù)范式要求的遞增性將其稱之為第四范式是不規(guī)范,也是更讓人不容易理解的地方。而真正的第四范式,則是在設(shè)計(jì)規(guī)范中添加了對多值及依賴的要求。 定義:關(guān)系模式R<U,F>∈1FNF,若X→Y且Y不是X的子集時(shí)X必含有碼,則R<U,F>∈BCNF。也就是說,關(guān)系模式R<U,F>中,若每一個(gè)決定因素都包含碼,則R<U,F>∈BCNF。 由BCNF的定義可以得到結(jié)論,一個(gè)滿足BCNF的關(guān)系模式有: -所有非主屬性對每一個(gè)碼都是完全函數(shù)依賴。 -所有主屬性對每一個(gè)不包含它的碼也是完全函數(shù)依賴。 -沒有任何屬性完全函數(shù)依賴于非碼的任何一組屬性。 若R∈BCNF,按定義排除了任何屬性對碼的傳遞依賴與部分依賴,所以R∈3NF。 一般關(guān)系型數(shù)據(jù)庫設(shè)計(jì)中,達(dá)到BCNF就可以了!范式應(yīng)用實(shí)例
第一范式(1NF)
數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。這個(gè)單一屬性由基本類型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。在當(dāng)前的任何關(guān)系數(shù)據(jù)庫管理系統(tǒng)(DBMS)中,傻瓜也不可能做出不符合第一范式的數(shù)據(jù)庫,因?yàn)檫@些DBMS不允許你把數(shù)據(jù)庫表的一列再分成二列或多列。因此,你想在現(xiàn)有的DBMS中設(shè)計(jì)出不符合第一范式的數(shù)據(jù)庫都是不可能的。 首先我們確定一下要設(shè)計(jì)的內(nèi)容包括那些。學(xué)號、學(xué)生姓名、年齡、性別、課程名稱、課程學(xué)分、系別、學(xué)科成績,系辦地址、系辦電話等信息。為了簡單我們暫時(shí)只考慮這些字段信息。我們對于這些信息,所關(guān)心的問題有如下幾個(gè)方面。 學(xué)生有那些基本信息? 學(xué)生選了那些課,成績是什么? 每個(gè)課的學(xué)分是多少? 學(xué)生屬于那個(gè)系,系的基本信息是什么?第二范式(2NF)
首先我們考慮,把所有這些信息放到一個(gè)表中(學(xué)號,學(xué)生姓名、年齡、性別、課程、課程學(xué)分、系別、學(xué)科成績,系辦地址、系辦電話)下面存在如下的依賴關(guān)系。 (學(xué)號, 課程名稱) → (姓名, 年齡, 成績, 學(xué)分) 問題分析 因此不滿足第二范式的要求,會(huì)產(chǎn)生如下問題: 數(shù)據(jù)冗余:同一門課程由n個(gè)學(xué)生選修,"學(xué)分"就重復(fù)n-1次;同一個(gè)學(xué)生選修了m門課程,姓名和年齡就重復(fù)了m-1次。 更新異常: 1)若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的"學(xué)分"值都要更新,否則會(huì)出現(xiàn)同一門課程學(xué)分不同的情況。 2)假設(shè)要開設(shè)一門新的課程,暫時(shí)還沒有人選修。這樣,由于還沒有"學(xué)號"關(guān)鍵字,課程名稱和學(xué)分也無法記錄入數(shù)據(jù)庫。 刪除異常 :假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫表中刪除。但是,與此同時(shí),課程名稱和學(xué)分信息也被刪除了。很顯然,這也會(huì)導(dǎo)致插入異常。 解決方案 把選課關(guān)系表SelectCourse改為如下三個(gè)表: 學(xué)生:Student(學(xué)號,姓名,年齡,性別,系別,系辦地址、系辦電話); 課程:Course(課程名稱,學(xué)分); 選課關(guān)系:SelectCourse(學(xué)號,課程名稱,成績)。第三范式(3NF)
接著看上面的學(xué)生表Student(學(xué)號,姓名,年齡,性別,系別,系辦地址、系辦電話),關(guān)鍵字為單一關(guān)鍵字"學(xué)號",因?yàn)榇嬖谌缦聸Q定關(guān)系: (學(xué)號)→ (姓名,年齡,性別,系別,系辦地址、系辦電話 但是還存在下面的決定關(guān)系: (學(xué)號) → (系別)→(系辦地點(diǎn),系辦電話) 即存在非關(guān)鍵字段"系辦地點(diǎn)"、"系辦電話"對關(guān)鍵字段"學(xué)號"的傳遞函數(shù)依賴。 它也會(huì)存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況。 根據(jù)第三范式把學(xué)生關(guān)系表分為如下兩個(gè)表就可以滿足第三范式了: 學(xué)生:(學(xué)號,姓名,年齡,性別,系別); 系別:(系別,系辦地址、系辦電話)。 上面的數(shù)據(jù)庫表就是符合I,Ⅱ,Ⅲ范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。轉(zhuǎn)載于:https://www.cnblogs.com/liuyuze/p/7364179.html
總結(jié)
- 上一篇: 求一个qq网名霸气带符号!
- 下一篇: 配置伪静态(URL重写)