關(guān)系型數(shù)據(jù)庫設(shè)計(jì)要點(diǎn)(1)

設(shè)計(jì)數(shù)據(jù)庫的步驟

1.需求分析階段:分析客戶的業(yè)務(wù)和數(shù)據(jù)處理需求.

2.概要設(shè)計(jì)階段:主要就是繪制數(shù)據(jù)庫的E-R圖.

3.詳細(xì)設(shè)計(jì)階段:應(yīng)用數(shù)據(jù)庫的三大范式進(jìn)行審核數(shù)據(jù)庫的結(jié)構(gòu).

總結(jié):在進(jìn)行數(shù)據(jù)庫的系統(tǒng)分析時(shí),都以下列4點(diǎn)為參考的基本步驟.

01.收集信息.

02.標(biāo)識(shí)實(shí)體.

03.標(biāo)識(shí)每個(gè)實(shí)體需要儲(chǔ)存的詳細(xì)信息.

04.標(biāo)識(shí)實(shí)體之間的關(guān)系.

示例:

某酒店管理系統(tǒng)E-R圖:

E-R圖

數(shù)據(jù)模型圖:

數(shù)據(jù)模型圖

掌握關(guān)系型數(shù)據(jù)庫的三大范式

1.第一范式:

目標(biāo)是確保每列的原子性.如果每列都是不可再分的最小數(shù)據(jù)單元,則滿足第一范式.

第一范式(1NF):要求數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng)。

舉例說明:

表1

在上面的表中,“家庭信息”和“學(xué)校信息”列均不滿足原子性的要求,故不滿足第一范式,調(diào)整如下:

表2

可見,調(diào)整后的每一列都是不可再分的,因此滿足第一范式(1NF);

2.第二范式:

第二范式在第一范式的基礎(chǔ)上更進(jìn)一層,其目標(biāo)是確保表中的每列都和主鍵相關(guān),也就是說在一個(gè)數(shù)據(jù)庫表中,一個(gè)表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫表中.如果一個(gè)關(guān)系滿足第一范式,并且除了主鍵以外的其他列都依賴于該主鍵.則滿足第二范式.

第二范式需要確保數(shù)據(jù)庫表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)。

舉例說明:

表3

在上圖所示的情況中,同一個(gè)訂單中可能包含不同的產(chǎn)品,因此主鍵必須是“訂單號(hào)”和“產(chǎn)品號(hào)”聯(lián)合組成,

但可以發(fā)現(xiàn),產(chǎn)品數(shù)量、產(chǎn)品折扣、產(chǎn)品價(jià)格與“訂單號(hào)”和“產(chǎn)品號(hào)”都相關(guān),但是訂單金額和訂單時(shí)間僅與“訂單號(hào)”相關(guān),與“產(chǎn)品號(hào)”無關(guān),

這樣就不滿足第二范式的要求,調(diào)整如下,需分成兩個(gè)表:

表4
表5

3.第三范式:

第三范式在第二范式的基礎(chǔ)上更進(jìn)一層,第三范式的目標(biāo)是確保每列都和主鍵列直接相關(guān),而不是間接相關(guān).如果一個(gè)關(guān)系滿足第二范式,并且除了主鍵以外的其他列都這能依賴于主鍵列,列和列之間不存在相互依賴關(guān)系,則滿足第三范式。

第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。

舉例說明:

表6

上表中,所有屬性都完全依賴于學(xué)號(hào),所以滿足第二范式,但是“班主任性別”和“班主任年齡”直接依賴的是“班主任姓名”,

而不是主鍵“學(xué)號(hào)”,所以需做如下調(diào)整:

表7
表8

這樣以來,就滿足了第三范式的要求。

注: 把上表中的班主任姓名改成班主任教工號(hào)可能更確切,更符合實(shí)際情況,不過只要能理解就行。

注意事項(xiàng):

1.必須先滿足第一范式才能滿足第二范式,必須同時(shí)滿足第一第二范式才能滿足第三范式。

三大范式只是一般設(shè)計(jì)數(shù)據(jù)庫的基本理念,可以建立冗余較小、結(jié)構(gòu)合理的數(shù)據(jù)庫。如果有特殊情況,當(dāng)然要特殊對(duì)待,數(shù)據(jù)庫設(shè)計(jì)最重要的是看需求跟性能,需求>性能>表結(jié)構(gòu)。所以不能一味的去追求范式建立數(shù)據(jù)庫。

總結(jié):

第1范式:每個(gè)表中都有1列,并且該列是不可拆分的最小單元(強(qiáng)調(diào)的是列的原子性,即列不能夠再分成其他幾列)

第2范式:1張表只描述一件事情(非主鍵列是否完全依賴于主鍵,還是依賴于主鍵的一部分)

第3范式:用外鍵做表的關(guān)聯(lián)(非主鍵列是直接依賴于主鍵,還是直接依賴于非主鍵列)

4. BCNF范式:在第三范式的基礎(chǔ)上消除主屬性對(duì)于主鍵的部分與傳遞函數(shù)依賴。

要了解 BCNF 范式,那么先看這樣一個(gè)例子:

假如:

某公司有若干個(gè)倉庫;

每個(gè)倉庫只能有一名管理員,一名管理員只能在一個(gè)倉庫中工作;

一個(gè)倉庫中可以存放多種物品,一種物品也可以存放在不同的倉庫中。每種物品在每個(gè)倉庫中都有對(duì)應(yīng)的數(shù)量。

那么關(guān)系模式 倉庫(倉庫名,管理員,物品名,數(shù)量) 屬于哪一級(jí)范式?

答:已知函數(shù)依賴集:倉庫名 → 管理員,管理員 → 倉庫名,(倉庫名,物品名)→ 數(shù)量

鍵值:(管理員,物品名),(倉庫名,物品名)

主屬性:倉庫名、管理員、物品名

非主屬性:數(shù)量

因?yàn)椴淮嬖诜侵鲗傩詫?duì)碼的部分函數(shù)依賴和傳遞函數(shù)依賴,所以, 此關(guān)系模式屬于3NF。

基于此關(guān)系模式的關(guān)系(具體的數(shù)據(jù))可能如圖所示:

表9

既然此關(guān)系模式已經(jīng)屬于了 3NF,那么這個(gè)關(guān)系模式是否存在問題呢?我們來看以下幾種操作:

先新增加一個(gè)倉庫,但尚未存放任何物品,是否可以為該倉庫指派管理員?——不可以,因?yàn)槲锲访彩侵鲗傩?,根?jù)實(shí)體完整性的要求,主屬性不能為空。

某倉庫被清空后,需要?jiǎng)h除所有與這個(gè)倉庫相關(guān)的物品存放記錄,會(huì)帶來什么問題?——倉庫本身與管理員的信息也被隨之刪除了。

如果某倉庫更換了管理員,會(huì)帶來什么問題?——這個(gè)倉庫有幾條物品存放記錄,就要修改多少次管理員信息。

從這里我們可以得出結(jié)論,在某些特殊情況下,即使關(guān)系模式符合 3NF 的要求,仍然存在著插入異常,修改異常與刪除異常的問題,仍然不是 ”好“ 的設(shè)計(jì)。

造成此問題的原因:存在著主屬性對(duì)于碼的部分函數(shù)依賴與傳遞函數(shù)依賴。(在此例中就是存在主屬性【倉庫名】對(duì)于碼【(管理員,物品名)】的部分函數(shù)依賴。

解決辦法就是要在 3NF 的基礎(chǔ)上消除主屬性對(duì)于碼的部分與傳遞函數(shù)依賴。

倉庫(倉庫名,管理員)

庫存(倉庫名,物品名,數(shù)量)

這樣,之前的插入異常,修改異常與刪除異常的問題就被解決了。

數(shù)據(jù)庫規(guī)范性和性能的關(guān)系

為了滿足三大范式,我們的數(shù)據(jù)操作性能會(huì)受到相應(yīng)的影響,所以,在實(shí)際的數(shù)據(jù)庫設(shè)計(jì)中,既要考慮三大范式,避免數(shù)據(jù)的冗余和各種數(shù)據(jù)操作異常;又要考慮到數(shù)據(jù)訪問性能,有時(shí),為了減少表間連接,提高數(shù)據(jù)庫的訪問性能,允許適當(dāng)?shù)臄?shù)據(jù)冗余列,這才是最合適的數(shù)據(jù)庫設(shè)計(jì)方案。規(guī)范化的優(yōu)點(diǎn)是明顯的,它避免了大量的數(shù)據(jù)冗余,節(jié)省了存儲(chǔ)空間,保持了數(shù)據(jù)的一致性。當(dāng)一個(gè)庫里的數(shù)據(jù)經(jīng)常發(fā)生變化時(shí),達(dá)到3NF的庫可以使用戶不必在超過兩個(gè)以上的地方更改同一個(gè)值。那么是不是只要把所有的表都規(guī)范為3NF后,數(shù)據(jù)庫的設(shè)計(jì)就是最優(yōu)的呢?這可不一定。范式越高意味著表的劃分更細(xì),一個(gè)數(shù)據(jù)庫中需要的表也就越多,用戶不得不將原本相關(guān)聯(lián)的數(shù)據(jù)分?jǐn)偟蕉鄠€(gè)表中。當(dāng)用戶同時(shí)需要這些數(shù)據(jù)時(shí)只能采用連接表的形式將數(shù)據(jù)重新合并在一起。同時(shí)把多個(gè)表連接在一起的花費(fèi)是巨大的,尤其是當(dāng)需要連接的兩張或者多張表數(shù)據(jù)非常龐大的時(shí)候,表連接操作幾乎是一個(gè)噩夢,這將會(huì)嚴(yán)重地降低系統(tǒng)運(yùn)行性能。



參考材料:

鏈接:https://www.zhihu.com/question/24696366/answer/29189700

來源:知乎

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容