函數(shù)依賴
- 如果在一個二維表中:Students(Sno , name, age),Sno 是這個表中的主鍵,所以對于其他屬性來說,Sno決定name,Sno決定age,反過來則叫做name函數(shù)依賴于Sno…
- 定義:主碼決定其他屬性,其他屬性函數(shù)依賴于主碼
- 非平凡函數(shù)依賴
SC(Sno,Cno,Grade)這么一個表中解釋,首先主碼是Sno和Cno聯(lián)合主鍵,然后Grade必須要聯(lián)合主鍵才能唯一標(biāo)識,否則就是非平凡的。(一般研究的都是非平凡函數(shù)依賴) - 平凡函數(shù)依賴
假如:SC(Sno,Cno,Grade,Cname)中討論Cname的函數(shù)依賴,則Cname只需要Cno就能唯一標(biāo)識,對于聯(lián)合主鍵來說只是用了一部分,那么這個叫做部分函數(shù)依賴,同時這種依賴叫做平凡函數(shù)依賴。(因?yàn)檫@每一個聯(lián)合主鍵表都會有,所以平凡)- 總結(jié)的說法就是:在對于聯(lián)合主鍵這里就一定會出現(xiàn)的情況(平凡函數(shù)依賴),只有一個主鍵的不會有,所以只要出現(xiàn)了聯(lián)合主鍵就必然有平凡函數(shù)依賴。但這里只是引出一個定義,后面只會研究非主屬性,而不會對于主屬性還研究是否依賴自己
認(rèn)識了平凡和非平凡依賴后開始進(jìn)入正題
- 完全函數(shù)依賴
SC(Sno,Cno,Grade,Cname)中,Grade就是完全函數(shù)依賴于聯(lián)合主鍵,而不是依賴其中一個 - 部分函數(shù)依賴
對于非主屬性部分依賴于主鍵的也就是出現(xiàn)了聯(lián)合主鍵,非主屬性僅僅依賴于某個而已的時候就叫做部分函數(shù)依賴。 - 完全函數(shù)依賴有什么用? 部分依賴有什么問題?
個人理解:舉一個極端情況,假如說出現(xiàn)一個表有聯(lián)合主鍵,有一個非主屬性僅僅依賴于聯(lián)合主鍵(主屬性)中的一個的時候就出現(xiàn)了一個問題就是你的聯(lián)合主鍵標(biāo)識就顯得冗余了,對于這個非主屬性來說你的聯(lián)合主鍵沒啥用,只要一個就可以標(biāo)識了,到時候查詢的時候你的另一個也感覺是用不太到。 - 主碼與候選碼
主碼只能設(shè)置一個(可一個屬性也可聯(lián)合屬性),當(dāng)出現(xiàn)非主屬性函數(shù)依賴的時候就可以考慮是否是聯(lián)合主碼出問題了是否能將其多余的修改成一個主屬性作為主碼,還是說要單拎出來分解出來一個新表。- 另外在候選碼中,他自己本身也能夠唯一標(biāo)識一個元組,但假如說沒有選他做主屬性的時候還能繼續(xù)完善,就是最完美的要到達(dá)主屬性除了自身外還要完全依賴于其他候選碼,注意是候選碼而不是其他主屬性,而是其他所有的候選碼,不管是否被選中為主屬性(BC范式的要求)
范式
第一范式
關(guān)系數(shù)據(jù)庫最基本的要求。
- 滿足每一個屬性都是不可再分(小的斗膽認(rèn)為自己不會寫出這么沙壁的東西)
- 存在的問題
- 函數(shù)依賴
因?yàn)槟銉H僅是滿足了不可再分,很可能很多漏洞還存留著。
- 函數(shù)依賴
第二范式
- 首先是滿足第一范式
- 然后第二范式必然是為了解決第一范式存在的問題,那就是解決部分函數(shù)依賴。
- 滿足非主屬性完全函數(shù)依賴于主碼(主屬性)
- 存在的問題
- 存在傳遞依賴函數(shù),即可能出現(xiàn):一個主碼決定a非主屬性,然而a這個非主屬性又決定b這個非主屬性就叫做傳遞函數(shù)依賴。(primarykey->a->b)
- 即:非主屬性出現(xiàn)了傳遞函數(shù)依賴關(guān)系
到底怎么解決的
主要是通過分解來解決的,將原本第一范式的進(jìn)行分解后到達(dá)了第二范式。
第三范式
- 首先第三范式有點(diǎn)特殊,他是要滿足第一范式的,書上沒有說明要滿足第二范式,但是我認(rèn)為只要能細(xì)分到屬于第三范式即可,無須說我滿足了某某范式這一說。(因?yàn)槲铱吹骄W(wǎng)上好多的答案都不同一,有的說二三范式其實(shí)隸屬于一個范式只是二范式是特殊的三范式等等)
- 三范式解決的必然是二范式中傳遞依賴的
- 三范式必然要滿足完全函數(shù)依賴
- 三范式中的屬性不可再分(無可厚非的必須要滿足第一范式)
- 即三范式:所有的非主屬性定要完全函數(shù)依賴于主屬性,且非主屬性也不存在傳遞依賴關(guān)系
到底如何解決的
主要是通過分解來解決的,將原本第二范式的傳遞依賴進(jìn)行分解后到達(dá)了第三范式。
- 第三范式還存在著某些數(shù)據(jù)庫的插入與刪除異常(其實(shí)到這里一般的小項(xiàng)目就OK了)
- 問題存在主要是第三范式只解決了非主屬性的問題,主屬性的問題還沒解決。
BC范式(BCNF)
- 首先要滿足第一(第三范式基本的也要滿足,但是書上也沒說,和第三范式?jīng)]寫滿足第二范式一樣,網(wǎng)上答案也不統(tǒng)一說法)
- 解決插入刪除異常
- 滿足第一范式后,寫出的所有的依賴關(guān)系,都必須是屬于候選碼(只要是候選碼就行,沒有說明是非得主碼)
- 這里比第三范式說的更明白了,就是一個關(guān)系中列出的所有函數(shù)依賴,左邊的那個決定性的屬性都必須是屬于候選碼(只要是候選碼就行,沒有說明是非得主碼)
- 這里我剛接觸的時候愣了很久才搞明白,就是用我們學(xué)平凡依賴非平凡依賴的時候,列出所有的函數(shù)依賴,然后這里的BS范式分析的就是這些函數(shù)依賴左邊的決定性屬性(或聯(lián)合屬性)必定是我們在這個關(guān)系中的候選碼(只要是候選碼就行,沒有說明是非得主碼)
范式學(xué)習(xí)總結(jié)
- 解決方式都是通過分解屬性之間的聯(lián)系
- 我個人不太喜歡范式說法,為何要定義這么一說要滿足幾幾范式,何必呢,無非是用來衡量數(shù)據(jù)庫好壞的一個方式,其實(shí)我覺得只要設(shè)計(jì)出來的數(shù)據(jù)庫合理,給程序用查詢的速度高效,滿足用戶與程序員即可。
如何分解低范式->高范式
-
分解后必須保持原有的函數(shù)依賴
- 原因很簡單,假如說是用戶提的需求固然不能修改他給的函數(shù)依賴(人家說這個程序一定要雞再有蛋或者先有蛋再有雞那就不能把人家的需求改掉)
-
分解后具有無損連接
- 意思是你未分解前的數(shù)據(jù)元組,在你分解后(假如說分解了兩個表),那么這些表進(jìn)行自然連接后所得的數(shù)據(jù)必須和你的原有的(原本未分解前給的數(shù)據(jù)一模一樣),這樣才叫做無損連接(必須是一模一樣,少了幾條不行,多了也不行,別看名字叫無損連接,數(shù)據(jù)多了也是錯)
-
如何分解:這里就是具體問題具體分析了,一般來說正常思維都不會分解得離譜到哪里去,只要按照規(guī)范化去整,盡可能分解拆分到力所能及的最高范式即可文章來源:http://www.zghlxwxcb.cn/news/detail-523118.html
-
(因?yàn)橛袝r候不是不能完美,而是這個東西他本身就不能太完美。)文章來源地址http://www.zghlxwxcb.cn/news/detail-523118.html
到了這里,關(guān)于數(shù)據(jù)庫—設(shè)計(jì)規(guī)范(依賴、范式、分解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!