欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

數(shù)據(jù)庫(kù)建表設(shè)計(jì)六范式介紹

 更新時(shí)間:2021年12月09日 09:36:45   作者:他鄉(xiāng)覓知音  
大家好,本篇文章主要講的是數(shù)據(jù)庫(kù)建表設(shè)計(jì)六范式介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

前言

數(shù)據(jù)庫(kù)設(shè)計(jì)六范式

為了建立冗余較小、結(jié)構(gòu)合理的數(shù)據(jù)庫(kù),設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)必須遵循一定的規(guī)則。在關(guān)系型數(shù)據(jù)庫(kù)中這種規(guī)則就稱為范式。范式是符合某一種設(shè)計(jì)要求的總結(jié)。要想設(shè)計(jì)一個(gè)結(jié)構(gòu)合理的關(guān)系型數(shù)據(jù)庫(kù),必須滿足一定的范式。

在實(shí)際開(kāi)發(fā)中最為常見(jiàn)的設(shè)計(jì)范式有三個(gè):

1.第一范式(1NF)無(wú)重復(fù)的列(確保每列保持原子性)

第一范式是最基本的范式。如果數(shù)據(jù)庫(kù)表中的所有字段值都是不可分解的原子值,就說(shuō)明該數(shù)據(jù)庫(kù)表滿足了第一范式。不滿足第一范式(1NF)的數(shù)據(jù)庫(kù)就不是關(guān)系數(shù)據(jù)庫(kù)。
第一范式的合理遵循需要根據(jù)系統(tǒng)的實(shí)際需求來(lái)定。比如某些數(shù)據(jù)庫(kù)系統(tǒng)中需要用到“地址”這個(gè)屬性,本來(lái)直接將“地址”屬性設(shè)計(jì)成一個(gè)數(shù)據(jù)庫(kù)表的字段就行。但是如果系統(tǒng)經(jīng)常會(huì)訪問(wèn)“地址”屬性中的“城市”部分,那么就非要將“地址”這個(gè)屬性重新拆分為省份、城市、詳細(xì)地址等多個(gè)部分進(jìn)行存儲(chǔ),這樣在對(duì)地址中某一部分操作的時(shí)候?qū)⒎浅7奖恪_@樣設(shè)計(jì)才算滿足了數(shù)據(jù)庫(kù)的第一范式,如下表所示。

這里寫圖片描述

上表所示的用戶信息遵循了第一范式的要求,這樣在對(duì)用戶使用城市進(jìn)行分類的時(shí)候就非常方便,也提高了數(shù)據(jù)庫(kù)的性能。

2.第二范式(2NF)屬性完全依賴于主鍵 (消除部分子函數(shù)依賴,確保表中的每列都和主鍵相關(guān))

第二范式在第一范式的基礎(chǔ)之上更進(jìn)一層。第二范式需要確保數(shù)據(jù)庫(kù)表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)。也就是說(shuō)在一個(gè)數(shù)據(jù)庫(kù)表中,一個(gè)表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中。第二范式要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或行必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。這個(gè)惟一屬性列被稱為主關(guān)鍵字或主鍵、主碼。

比如要設(shè)計(jì)一個(gè)訂單信息表,因?yàn)橛唵沃锌赡軙?huì)有多種商品,所以要將訂單編號(hào)和商品編號(hào)作為數(shù)據(jù)庫(kù)表的聯(lián)合主鍵,如下表所示。
訂單信息表

這里寫圖片描述

這樣就產(chǎn)生一個(gè)問(wèn)題:這個(gè)表中是以訂單編號(hào)和商品編號(hào)作為聯(lián)合主鍵。這樣在該表中商品名稱、單位、商品價(jià)格等信息不與該表的主鍵相關(guān),而僅僅是與商品編號(hào)相關(guān)。所以在這里違反了第二范式的設(shè)計(jì)原則。
不符合第二范式,會(huì)出現(xiàn)的問(wèn)題:
(1) 數(shù)據(jù)冗余:同一個(gè)客戶下的訂單,所屬單位和聯(lián)系方式出現(xiàn)了冗余
(2) 更新異常:如果調(diào)整了某個(gè)商品的價(jià)格,表中所有下單該商品的價(jià)格表都需要調(diào)整,否則會(huì)出現(xiàn)同一商品價(jià)格不統(tǒng)一的情況
(3) 插入異常:如果商家新增了一個(gè)商品,由于還沒(méi)有人買過(guò)沒(méi)有訂單號(hào),導(dǎo)致表中無(wú)法插入這樣的信息信息了
(4) 刪除異常:如果客戶已完成訂單,或者客戶退貨取消訂單,就需要?jiǎng)h除訂單編號(hào),這樣又會(huì)導(dǎo)致商品信息被刪除,問(wèn)題更大了。
如果把這個(gè)訂單信息表進(jìn)行拆分,把商品信息分離到另一個(gè)表中,把訂單項(xiàng)目表也分離到另一個(gè)表中,就非常完美了。

這里寫圖片描述

這樣設(shè)計(jì),在很大程度上減小了數(shù)據(jù)庫(kù)的冗余。如果要獲取訂單的商品信息,使用商品編號(hào)到商品信息表中查詢即可。

3.第三范式(3NF)屬性不依賴于其它非主屬性 (消除傳遞依賴,確保每列都和主鍵列直接相關(guān),而不是間接相關(guān))

第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。數(shù)據(jù)表中如果不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。簡(jiǎn)而言之,第三范式就是屬性不依賴于其它非主屬性。所謂傳遞函數(shù)依賴,指的是如果存在"A → B → C"的決定關(guān)系,則C傳遞函數(shù)依賴于A。
因此,滿足第三范式的數(shù)據(jù)庫(kù)表應(yīng)該不存在如下依賴關(guān)系:
關(guān)鍵字段 → 非關(guān)鍵字段x → 非關(guān)鍵字段y

比如在設(shè)計(jì)一個(gè)訂單數(shù)據(jù)表的時(shí)候,可以將客戶編號(hào)作為一個(gè)外鍵和訂單表建立相應(yīng)的關(guān)系。而不可以在訂單表中添加關(guān)于客戶其它信息(比如姓名、所屬公司等)的字段。如下面這兩個(gè)表所示的設(shè)計(jì)就是一個(gè)滿足第三范式的數(shù)據(jù)庫(kù)表。

這里寫圖片描述

這樣在查詢訂單信息的時(shí)候,就可以使用客戶編號(hào)來(lái)引用客戶信息表中的記錄,也不必在訂單信息表中多次輸入客戶信息的內(nèi)容,減小了數(shù)據(jù)冗余。
再找一張圖,供大家參考一下:

這里寫圖片描述

4、BCNF 鮑依斯-科得范式 (針對(duì)某一列與復(fù)合主鍵中的某一列有關(guān),而與其他主鍵無(wú)關(guān))

所謂BCNF,是指在第三范式的基礎(chǔ)上進(jìn)一步消除主屬性對(duì)于碼的部分函數(shù)依賴和傳遞依賴。BCNF需要符合3NF,并且,主屬性不依賴于主屬性。

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

(倉(cāng)庫(kù)ID,存儲(chǔ)物品ID) →(管理員ID,數(shù)量)

(管理員ID,存儲(chǔ)物品ID) → (倉(cāng)庫(kù)ID,數(shù)量)

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

(倉(cāng)庫(kù)ID) → (管理員ID)

(管理員ID) → (倉(cāng)庫(kù)ID)

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

(1) 刪除異常:

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

(2) 插入異常:

當(dāng)倉(cāng)庫(kù)沒(méi)有存儲(chǔ)任何物品時(shí),無(wú)法給倉(cāng)庫(kù)分配管理員。

(3) 更新異常:

如果倉(cāng)庫(kù)換了管理員,則表中所有行的管理員ID都要修改。

把倉(cāng)庫(kù)管理關(guān)系表分解為二個(gè)關(guān)系表:

倉(cāng)庫(kù)管理:StorehouseManage(倉(cāng)庫(kù)ID,管理員ID);

倉(cāng)庫(kù):Storehouse(倉(cāng)庫(kù)ID,存儲(chǔ)物品ID,數(shù)量)。

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

又如,有這樣一個(gè)配件管理表WPE(WNO,PNO,ENO,QNT),其中WNO表示倉(cāng)庫(kù)號(hào),PNO表示配件號(hào),ENO表示職工號(hào),QNT表示數(shù)量。

有以下約束要求:

(1)一個(gè)倉(cāng)庫(kù)有多名職工;

(2)一個(gè)職工僅在一個(gè)倉(cāng)庫(kù)工作;

(3)每個(gè)倉(cāng)庫(kù)里一種型號(hào)的配件由專人負(fù)責(zé),但一個(gè)人可以管理幾種配件;

(4)同一種型號(hào)的配件可以分放在幾個(gè)倉(cāng)庫(kù)中。

分析表中的函數(shù)依賴關(guān)系,可以得到:

(1)ENO->WNO;

(2)(WNO,PNO)->QNT

(3)(WNO,PNO)->ENO

(4)(ENO,PNO)->QNT

可以看到,候選鍵有:(ENO,PNO);(WNO,PNO)。所以,ENO,PNO,WNO均為主屬性,QNT為非主屬性。顯然,非主屬性是直接依賴于候選鍵的。所以此表滿足第三范式。

而我們觀察一下主屬性:(WNO,PNO)->ENO;ENO->WNO。顯然WNO對(duì)于候選鍵(WNO,PNO)存在傳遞依賴,所以不符合BCNF.

解決這個(gè)問(wèn)題的辦法是分拆為兩個(gè)表:管理表EP(ENO,PNO,QNT);工作表EW(ENO,WNO)。但這樣做會(huì)導(dǎo)致函數(shù)依賴(WNO,PNO)->ENO丟失。

雖然,不滿足BCNF,也會(huì)導(dǎo)致一些冗余和一致性的問(wèn)題。但是,將表分解成滿足BCNF的表又可能丟失一些函數(shù)依賴。所以,一般情況下不會(huì)強(qiáng)制要求關(guān)系表要滿足BCNF。

5、4NF(第四范式)

對(duì)于第四范式,從理論層面來(lái)講是,關(guān)系模式R∈1NF,如果對(duì)于R對(duì)于R的每個(gè)非平凡多值依賴X→→Y(Y不屬于X),X都含有候選碼,則R∈4NF。4NF就是限制關(guān)系模式的屬性之間不允許有非平凡且非函數(shù)依賴的多值依賴。顯然一個(gè)關(guān)系模式是4NF,則必為BCNF。

也就是說(shuō),當(dāng)一個(gè)表中的非主屬性互相獨(dú)立時(shí)(3NF),這些非主屬性不應(yīng)該有多值。若有多值就違反了第四范式。

有這樣一個(gè)用戶聯(lián)系方式表TELEPHONE(CUSTOMERID,PHONE,CELL)。CUSTOMERID為用戶ID,PHONE為用戶的固定電話,CELL為用戶的移動(dòng)電話。

本來(lái),這是一個(gè)非常簡(jiǎn)單的第3范式表。主鍵為CUSTOMERID,不存在傳遞依賴。但在某些情況下,這樣的表還是不合理的。比如說(shuō),用戶有兩個(gè)固定電話,兩個(gè)移動(dòng)電話。這時(shí),表的具體表示如下:

CUSTOMERID PHONE CELL

1000 8828-1234 149088888888

1000 8838-1234 149099999999

由于PHONE和CELL是互相獨(dú)立的,而有些用戶又有兩個(gè)和多個(gè)值。這時(shí)此表就違反第四范式。

在這種情況下,此表的設(shè)計(jì)就會(huì)帶來(lái)很多維護(hù)上的麻煩。例如,如果用戶放棄第一行的固定電話和第二行的移動(dòng)電話,那么這兩行會(huì)合并嗎?等等

解決問(wèn)題的方法為,設(shè)計(jì)一個(gè)新表NEW_PHONE(CUSTOMERID,NUMBER,TYPE).這樣就可以對(duì)每個(gè)用戶處理不同類型的多個(gè)電話號(hào)碼,而不會(huì)違反第四范式。

顯然,第四范式的應(yīng)用范圍比較小,因?yàn)橹挥性谀承┨厥馇闆r下,要考慮將表規(guī)范到第四范式。所以在實(shí)際應(yīng)用中,一般不要求表滿足第四范式。

6、5NF(第五范式)

第五范式(5NF):是最終范式。消除了4NF中的連接依賴。

第五范式有以下要求:

(1)必須滿足第四范式

(2)表必須可以分解為較小的表,除非那些表在邏輯上擁有與原始表相同的主鍵。

第五范式是在第四范式的基礎(chǔ)上做的進(jìn)一步規(guī)范化。第四范式處理的是相互獨(dú)立的多值情況,而第五范式則處理相互依賴的多值情況。

有一個(gè)銷售信息表SALES(SALEPERSON,VENDOR,PRODUCT)。SALEPERSON代表銷售人員,VENDOR代表供和商,PRODUCT則代表產(chǎn)品。

在某些情況下,這個(gè)表中會(huì)產(chǎn)生一些冗余。可以將表分解為PERSON_VENDOR表(SALEPERSON,VENDOR);PERSON_PRODUCT表(SALEPERSON,PRODUCT);VENDOR-_PRODICT表(VENDOR,PRODUCT)

到此這篇關(guān)于數(shù)據(jù)庫(kù)建表設(shè)計(jì)六范式介紹的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫(kù)范式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 數(shù)據(jù)庫(kù)的設(shè)計(jì)方法、規(guī)范與技巧

    數(shù)據(jù)庫(kù)的設(shè)計(jì)方法、規(guī)范與技巧

    數(shù)據(jù)庫(kù)的設(shè)計(jì)方法、規(guī)范與技巧...
    2007-03-03
  • Spring集成MyBatis完整實(shí)例(分享)

    Spring集成MyBatis完整實(shí)例(分享)

    下面小編就為大家?guī)?lái)一篇Spring集成MyBatis完整實(shí)例(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • 如何用分表存儲(chǔ)來(lái)提高性能 推薦

    如何用分表存儲(chǔ)來(lái)提高性能 推薦

    如何用分表存儲(chǔ)來(lái)提高性能 ,需要的朋友可以參考下。
    2011-09-09
  • Apache?Doris?Join?優(yōu)化原理詳解

    Apache?Doris?Join?優(yōu)化原理詳解

    這篇文章主要為大家介紹了Apache?Doris?Join?優(yōu)化原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 最新評(píng)論