日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

4.MYSQL 三大范式+BC范式

發(fā)布時(shí)間:2025/3/21 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4.MYSQL 三大范式+BC范式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

首先,你得知道范式是干啥的?
范式就是規(guī)范我們建表的依據(jù),為后續(xù)的增刪改查提高安全保障

正文

come on~~~~~~

第一范式

第一范式:所有屬性都是不可分割的原子值。
也就是每個(gè)屬性都是不可再分的。
例如下圖就不符合第一范式的要求

實(shí)際上,1NF是所有關(guān)系型數(shù)據(jù)庫(kù)的最基本要求,你在關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),例如SQL Server,Oracle,MySQL中創(chuàng)建數(shù)據(jù)表的時(shí)候,如果數(shù)據(jù)表的設(shè)計(jì)不符合這個(gè)最基本的要求,那么操作一定是不能成功的。如果我們要在RDBMS中表現(xiàn)表中的數(shù)據(jù),就得設(shè)計(jì)為下圖的形式:


第二范式(2NF)

第二范式:在第一范式的基礎(chǔ)上,要求非主屬性都要和碼有完全依賴(lài)關(guān)系
所謂完全依賴(lài)是指不能存在僅依賴(lài)碼一部分的屬性,必須是依賴(lài)全部屬性。(區(qū)別于部分依賴(lài))
如果有哪些數(shù)據(jù)只和碼的一部份有關(guān)的話,它就不符合第二范式。同時(shí)可以得出:如果一個(gè)數(shù)據(jù)表的碼只有單一一個(gè)字段的話,它就一定符合第二范式(前提是該數(shù)據(jù)表符合第一范式)。
(碼可以由多個(gè)字段組成聯(lián)合碼,所以碼可以是多屬性)
2NF在1NF的基礎(chǔ)之上,消除了非主屬性對(duì)于碼的部分屬性依賴(lài)。

首先來(lái)看看下圖

(1)每一名學(xué)生的學(xué)號(hào)、姓名、系名、系主任這些數(shù)據(jù)重復(fù)多次。每個(gè)系與對(duì)應(yīng)的系主任的數(shù)據(jù)也重復(fù)多次——數(shù)據(jù)冗余過(guò)大

(2)假如學(xué)校新建了一個(gè)系,但是暫時(shí)還沒(méi)有招收任何學(xué)生(比如3月份就新建了,但要等到8月份才招生),那么是無(wú)法將系名與系主任的數(shù)據(jù)單獨(dú)地添加到數(shù)據(jù)表中去的 ——插入異常

(3)假如將某個(gè)系中所有學(xué)生相關(guān)的記錄都刪除,那么所有系與系主任的數(shù)據(jù)也就隨之消失了(一個(gè)系所有學(xué)生都沒(méi)有了,并不表示這個(gè)系就沒(méi)有了)。——刪除異常

(4)假如李小明轉(zhuǎn)系到法律系,那么為了保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性,需要修改三條記錄中系與系主任的數(shù)據(jù)?!?strong>修改異常

所以這張表肯定不符合設(shè)計(jì)規(guī)范。我們來(lái)通過(guò)第二范式修改。
首先什么是依賴(lài)?

依賴(lài)
若在一張表中,在屬性(或?qū)傩越M)X的值確定的情況下,必定能確定屬性Y的值,那么就可以說(shuō)Y函數(shù)依賴(lài)于X,寫(xiě)作 X → Y。
例如,對(duì)于上圖中的數(shù)據(jù),找不到任何一條記錄,它們的學(xué)號(hào)相同而對(duì)應(yīng)的姓名不同。所以我們可以說(shuō)姓名函數(shù)依賴(lài)于學(xué)號(hào),寫(xiě)作 學(xué)號(hào) → 姓名。但是反過(guò)來(lái),因?yàn)榭赡艹霈F(xiàn)同名的學(xué)生,所以有可能不同的兩條學(xué)生記錄,它們?cè)谛彰系闹迪嗤?#xff0c;但對(duì)應(yīng)的學(xué)號(hào)不同,所以我們不能說(shuō)學(xué)號(hào)函數(shù)依賴(lài)于姓名。

然后什么是碼?


設(shè) K 為某表中的一個(gè)屬性或?qū)傩越M,若除 K 之外的所有屬性都完全依賴(lài)于 K(這個(gè)“完全”不要漏了),那么我們稱(chēng) K 為候選碼,簡(jiǎn)稱(chēng)為碼。在實(shí)際中我們通??梢岳斫鉃?#xff1a;假如當(dāng) K 確定的情況下,該表除 K 之外的所有屬性的值也就隨之確定,那么 K 就是碼。一張表中可以有超過(guò)一個(gè)碼。(實(shí)際應(yīng)用中為了方便,通常選擇其中的一個(gè)碼作為主碼)
如圖中我們可以知道該表的碼是(學(xué)號(hào)、課名)

對(duì)于第二范式,所有的非主屬性要依賴(lài)于全部主屬性。
由圖中我們可以得到兩個(gè)主屬性:學(xué)號(hào)課名
“學(xué)號(hào)“和”課程“就組成了聯(lián)合主鍵。(一個(gè)表只有一個(gè)主鍵。 主鍵可以由一個(gè)字段,也可以由多個(gè)字段組成

因?yàn)槲覀兛梢酝ㄟ^(guò)學(xué)號(hào)來(lái)確定一個(gè)學(xué)生的姓名 系名 系主任 這三個(gè)屬性,無(wú)法確定課程和分?jǐn)?shù)屬性。
通過(guò)學(xué)生的學(xué)號(hào)和課程兩個(gè)屬性,可以確定分?jǐn)?shù)。

對(duì)于(學(xué)號(hào),課名) → 姓名,有 學(xué)號(hào) → 姓名,存在非主屬性 姓名 對(duì)碼(學(xué)號(hào),課名)的部分依賴(lài)。
對(duì)于(學(xué)號(hào),課名) → 系名,有 學(xué)號(hào) → 系名,存在非主屬性 系名 對(duì)碼(學(xué)號(hào),課名)的部依賴(lài)。
對(duì)于(學(xué)號(hào),課名) → 系主任,有 學(xué)號(hào) → 系主任,存在非主屬性 系主任 對(duì)碼(學(xué)號(hào),課名)的部分依賴(lài)。

所以表3存在非主屬性對(duì)于碼的部分函數(shù)依賴(lài),最高只符合1NF的要求,不符合2NF的要求。

所以做出修改

刪除某個(gè)系中所有的學(xué)生記錄
該系的信息仍然全部丟失?!獰o(wú)改進(jìn)
所以我們要使用第三范式。


第三范式(3NF)

第三范式:任何非主屬性不依賴(lài)于其它非主屬性。
3NF在2NF的基礎(chǔ)之上,消除了非主屬性對(duì)于碼的傳遞函數(shù)依賴(lài)。

對(duì)于選課表,碼為(學(xué)號(hào),課名),主屬性為學(xué)號(hào)和課名,非主屬性只有一個(gè),為分?jǐn)?shù),不可能存在傳遞函數(shù)依賴(lài),所以選課表的設(shè)計(jì),符合3NF的要求。

對(duì)于學(xué)生表,主碼為學(xué)號(hào),主屬性為學(xué)號(hào),非主屬性為姓名、系名和系主任。因?yàn)?學(xué)號(hào) → 系名,同時(shí) 系名 → 系主任,所以存在非主屬性系主任對(duì)于碼學(xué)號(hào)的傳遞函數(shù)依賴(lài),所以學(xué)生表的設(shè)計(jì),不符合3NF的要求。

為了讓數(shù)據(jù)表設(shè)計(jì)達(dá)到3NF,我們必須進(jìn)一步進(jìn)行模式分解為以下形式:
選課(學(xué)號(hào),課名,分?jǐn)?shù))
學(xué)生(學(xué)號(hào),姓名,系名)
系(系名,系主任)

新的函數(shù)依賴(lài)關(guān)系如圖

修改后的表

第二范式和第三范式就是為了消除非主屬性對(duì)碼的部分函數(shù)依賴(lài)和傳遞函數(shù)依賴(lài)


BC范式(博伊斯-科德)

BC范式在 3NF 的基礎(chǔ)上消除主屬性對(duì)于碼的部分與傳遞函數(shù)依賴(lài)。
要了解 BCNF 范式,那么先看這樣一個(gè)問(wèn)題:
若:
某公司有若干個(gè)倉(cāng)庫(kù);
每個(gè)倉(cāng)庫(kù)只能有一名管理員,一名管理員只能在一個(gè)倉(cāng)庫(kù)中工作;
一個(gè)倉(cāng)庫(kù)中可以存放多種物品,一種物品也可以存放在不同的倉(cāng)庫(kù)中。每種物品在每個(gè)倉(cāng)庫(kù)中都有對(duì)應(yīng)的數(shù)量。
那么關(guān)系模式 倉(cāng)庫(kù)(倉(cāng)庫(kù)名,管理員,物品名,數(shù)量) 屬于哪一級(jí)范式?

答:已知函數(shù)依賴(lài)集:倉(cāng)庫(kù)名 → 管理員,管理員 → 倉(cāng)庫(kù)名,(倉(cāng)庫(kù)名,物品名)→ 數(shù)量
碼:(管理員,物品名),(倉(cāng)庫(kù)名,物品名)
主屬性:倉(cāng)庫(kù)名、管理員、物品名
非主屬性:數(shù)量
∵ 不存在非主屬性對(duì)碼的部分函數(shù)依賴(lài)和傳遞函數(shù)依賴(lài)。∴ 此關(guān)系模式屬于3NF。

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

好,既然此關(guān)系模式已經(jīng)屬于了 3NF,那么這個(gè)關(guān)系模式是否存在問(wèn)題呢?我們來(lái)看以下幾種操作:
先新增加一個(gè)倉(cāng)庫(kù),但尚未存放任何物品,是否可以為該倉(cāng)庫(kù)指派管理員?——不可以,因?yàn)槲锲访彩侵鲗傩?#xff0c;根據(jù)實(shí)體完整性的要求,主屬性不能為空。
某倉(cāng)庫(kù)被清空后,需要?jiǎng)h除所有與這個(gè)倉(cāng)庫(kù)相關(guān)的物品存放記錄,會(huì)帶來(lái)什么問(wèn)題?——倉(cāng)庫(kù)本身與管理員的信息也被隨之刪除了。
如果某倉(cāng)庫(kù)更換了管理員,會(huì)帶來(lái)什么問(wèn)題?——這個(gè)倉(cāng)庫(kù)有幾條物品存放記錄,就要修改多少次管理員信息。
從這里我們可以得出結(jié)論,在某些特殊情況下,即使關(guān)系模式符合 3NF 的要求,仍然存在著插入異常,修改異常與刪除異常的問(wèn)題,仍然不是 ”好“ 的設(shè)計(jì)。

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

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

倉(cāng)庫(kù)(倉(cāng)庫(kù)名,管理員)
庫(kù)存(倉(cāng)庫(kù)名,物品名,數(shù)量)

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

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的4.MYSQL 三大范式+BC范式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。