好的設(shè)計(jì)會(huì)盡可能少的引入冗余數(shù)據(jù),或做有損拆分,而是使用規(guī)范的方法找到正確的分解。而范式則是關(guān)系數(shù)據(jù)庫實(shí)現(xiàn)設(shè)計(jì)優(yōu)化的通用手段。范式與關(guān)系數(shù)據(jù)庫的關(guān)系可以參考筆者之前的WIKI。
【強(qiáng)制】數(shù)據(jù)庫設(shè)計(jì)優(yōu)先滿足第三范式(3NF),如果無法滿足,則盡量滿足第二范式(2NF)
在進(jìn)行數(shù)據(jù)庫設(shè)計(jì)時(shí),如果能夠滿足第三范式,要盡量保證第三范式,如果因?yàn)樾阅芸紤],需要冗余字段,無法滿足第三范式的時(shí)候,也要盡量保證第二范式。
第一范式
當(dāng)關(guān)系模式滿足第一范式時(shí),該關(guān)系模式所有屬性的域都是原子的。第一范式要求表中列的值具有原子性,也就是說表中列的值為不可再次拆分的最小數(shù)據(jù)單位。常見的非原子域的情況有:
(1) 組合屬性具有非原子域。如包含子屬性street、city、state的屬性address。
(2) 使用以集合為值的屬性會(huì)導(dǎo)致冗余存儲(chǔ)數(shù)據(jù)的設(shè)計(jì),進(jìn)而會(huì)進(jìn)一步導(dǎo)致不一致。如數(shù)據(jù)庫設(shè)計(jì)者可能不將教師和課程安排之間的聯(lián)系表示為一個(gè)單獨(dú)的關(guān)系teaches,而是嘗試為每一個(gè)教師存儲(chǔ)一個(gè)課程段標(biāo)志號(hào)的集合,并為每一個(gè)課程段存儲(chǔ)一個(gè)教師標(biāo)志號(hào)的集合。每當(dāng)關(guān)于哪位教師講授哪個(gè)課程段的數(shù)據(jù)發(fā)生變化時(shí),就需同時(shí)更新兩個(gè)地方:課程表的教師集合和教師表課程集合。
第二范式
關(guān)系模式R屬于第二范式,如果R中的每個(gè)屬性A都滿足如下準(zhǔn)則之一:
(1) 它出現(xiàn)在一個(gè)候選碼中。
(2) 它沒有部分依賴于一個(gè)候選碼。
函數(shù)依賴α
→
\rightarrow
→β稱為部分依賴(partial dependency)的條件是,存在α的真子集γ使得γ
→
\rightarrow
→β。我們稱β部分依賴于α。
第二范式要求表中的每條記錄都有唯一標(biāo)識(shí),且不存在部分依賴。所謂部分依賴,就是指所有非唯一標(biāo)識(shí)字段,都必須完全依賴唯一標(biāo)識(shí),不能只依賴唯一標(biāo)識(shí)的一部分。如果知道唯一標(biāo)識(shí)屬性的值,就可以檢索到任何表記錄的任何屬性的任何值。
假設(shè)有關(guān)系模型R,包含如下屬性(學(xué)號(hào)、課程號(hào)、課程名、姓名、學(xué)分、成績),表示學(xué)生的課程得分,以學(xué)號(hào)和課程號(hào)為唯一標(biāo)識(shí),這里姓名屬性只依賴學(xué)號(hào),學(xué)分屬性只依賴課程號(hào),所以這里存在部分依賴,不符合第二范式的要求。
第二范式的核心思想是關(guān)系模型的內(nèi)聚,也即拆分思想。對(duì)于上面的關(guān)系模型,可以進(jìn)一步細(xì)分為如下幾個(gè)關(guān)系模型:
學(xué)生表:(學(xué)號(hào)、姓名)
課程表:(課程號(hào)、課程名、學(xué)分)
學(xué)生課程成績表:(學(xué)號(hào)、課程號(hào)、成績)
第三范式
第三范式是比BC范式弱的范式。任何滿足BC范式的關(guān)系模式也滿足第三范式。具有函數(shù)依賴集F的關(guān)系模式R屬于第三范式(third normal form)的條件是:對(duì)
F
+
F^+
F+中所有形如α
→
\rightarrow
→β的函數(shù)依賴(α
?
\subseteq
?R且β
?
\subseteq
?R),下面至少有一項(xiàng)是成立:
(1) α
→
\rightarrow
→β是平凡的函數(shù)依賴(即β
?
\subseteq
?α)。
(2) α是模式R的一個(gè)超碼。
(3) β - α中的每一個(gè)屬性A都包含于R的一個(gè)候選碼中。
第三范式要求表中的每一個(gè)非主鍵字段都和主鍵字段直接相關(guān),也就是說,表中的所有非主鍵字段不能依賴于其他非主鍵字段。舉例來說,不能存在非主屬性A依賴于非主屬性B,非主屬性B依賴于主鍵C的情況,即存在"A->B->C"的依賴關(guān)系。也就是說,所有非主鍵屬性之間不能有依賴關(guān)系,必須相互獨(dú)立。
假設(shè)有關(guān)系模型R,包含如下屬性(學(xué)號(hào)、姓名、年齡、學(xué)院、學(xué)院電話),因?yàn)榇嬖趥鬟f依賴:(學(xué)號(hào)) -> (姓名) -> (學(xué)院) -> (學(xué)院電話),所以不符合第三范式的要求。
第三范式的核心思想是消除所有基于函數(shù)依賴能夠發(fā)現(xiàn)的冗余并保持函數(shù)依賴。對(duì)于上面的關(guān)系模型,可以進(jìn)一步細(xì)分為如下幾個(gè)關(guān)系模型:
學(xué)生:(學(xué)號(hào)、姓名、年齡、學(xué)院)
學(xué)院:(學(xué)院、學(xué)院電話)
【建議】在遵循范式規(guī)則的同時(shí),也要考慮反范式設(shè)計(jì)
軟件設(shè)計(jì)沒有銀彈,并不是說在進(jìn)行數(shù)據(jù)庫設(shè)計(jì)時(shí),一定要遵循范式,在特定的場景下,可以考慮反范式設(shè)計(jì)。
違反第一范式
第一范式強(qiáng)調(diào)屬性的域的原子性,但是特殊情況下違反第一范式也有其價(jià)值。如在含有復(fù)雜結(jié)構(gòu)的實(shí)體域中,強(qiáng)制使用第一范式會(huì)給應(yīng)用程序帶來不必要的負(fù)擔(dān),如必須編寫代碼把數(shù)據(jù)轉(zhuǎn)換成原子形式。從原子形式來回轉(zhuǎn)換數(shù)據(jù)也會(huì)有運(yùn)行時(shí)額外開銷。所以,這種場景支持非原子的值很有用。事實(shí)上,現(xiàn)代數(shù)據(jù)庫的確支持很多類型的非原子值。如支持創(chuàng)建復(fù)合屬性、集合、數(shù)組等復(fù)雜數(shù)據(jù)類型。
違反第三方式
第三范式強(qiáng)調(diào)的是沒有冗余數(shù)據(jù),因?yàn)槿绻嬖谌哂?,就意味著要保證冗余數(shù)據(jù)的一致性。但是沒有冗余的數(shù)據(jù)庫未必是好的數(shù)據(jù)庫。有時(shí)為了提高運(yùn)行效率,就必須降低范式標(biāo)準(zhǔn),適當(dāng)保留冗余數(shù)據(jù),達(dá)到以空間換時(shí)間的目的。文章來源:http://www.zghlxwxcb.cn/news/detail-665976.html
參考
https://zhuanlan.zhihu.com/p/617424106 【MySQL】數(shù)據(jù)庫的設(shè)計(jì)規(guī)范(重點(diǎn):三大范式)
https://blog.csdn.net/kenhins/article/details/51084815 數(shù)據(jù)庫建表規(guī)則(三大范式)
https://cloud.tencent.com/developer/article/2123662 三范式與反范式
https://blog.csdn.net/Systemoutprintl/article/details/108209291 數(shù)據(jù)庫的三大范式
https://www.cnblogs.com/gdwkong/p/9012262.html MySQL設(shè)計(jì)之三范式的理解文章來源地址http://www.zghlxwxcb.cn/news/detail-665976.html
到了這里,關(guān)于數(shù)據(jù)庫范式使用規(guī)范的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!