函數(shù)依賴關(guān)系
完全函數(shù)依賴:
A和B能夠推斷出來C,但是單獨(dú)的A或B無(wú)法推斷出來C,那么稱C完全依賴于A,B
部分函數(shù)依賴:
A和B能夠推斷出C,通過A能夠推斷出C,或者通過B也能推斷出C,那么稱C部分依賴于A,B
傳遞函數(shù)依賴:
A能夠推斷出B,通過B能夠得到C,但是通過C得不到A,那么說C傳遞依賴于A
了解了上面的函數(shù)依賴之后,然后再來了解數(shù)據(jù)庫(kù)設(shè)計(jì)三范式就比較清楚明了
第一范式
第一范式比較好理解,即列滿足原子性,即列是不可分割的.
錯(cuò)誤示范
image.png
正確示范:
image.png
第一范式是所有數(shù)據(jù)庫(kù)的最基本要求.
第二范式:
第二范式是在第一范式的基礎(chǔ)上建立起來的
不能存在非主鍵字段部分函數(shù)依賴與主鍵字段
image.png
上圖主鍵為學(xué)號(hào)+姓名聯(lián)合主鍵,主鍵是要能夠唯一標(biāo)識(shí)一行數(shù)據(jù),當(dāng)一個(gè)列不能唯一標(biāo)識(shí)一行數(shù)據(jù),可以采用聯(lián)合主鍵
但是上圖中,姓名并不完全依賴于學(xué)號(hào)+課程,他可以通過學(xué)號(hào)推斷出來,所以出現(xiàn)了非主鍵字段部分依賴于主鍵字段,所以不滿足
可以拆分成如下,去掉了部分函數(shù)依賴:


第三范式:
第三范式是在滿足第二范式基礎(chǔ)上出現(xiàn)的第三范式
不能存在 非主鍵字段傳遞函數(shù)依賴于主鍵字段
image.png
上圖中,存在傳遞函數(shù)依賴,即
學(xué)號(hào)-->系名-->系主任,但是系主任推斷不出學(xué)號(hào),所以存在傳遞函數(shù)依賴,需要繼續(xù)拆分
image.png
image.png
三范式小結(jié):
數(shù)據(jù)庫(kù)范式越高,數(shù)據(jù)冗余越低,但是伴隨著需要join連接,必然導(dǎo)致性能下降,所以一味地追求范式并不是很好的決定,數(shù)據(jù)庫(kù)范式是時(shí)間換空間.犧牲查詢時(shí)間,節(jié)省了空間
因?yàn)槟阆胂?就比如第二范式那塊,拆分成的兩個(gè)表一個(gè),一個(gè)表就不帶系名了,然后兩個(gè)表通過關(guān)聯(lián)能夠得到最初的那個(gè)大表,這樣就節(jié)省了存儲(chǔ)空間.節(jié)省了存儲(chǔ)系名的那個(gè)空間.
因?yàn)樵谠缙诨ヂ?lián)網(wǎng)剛起步階段,磁盤很貴,不像現(xiàn)在這么便宜,所以大家追求的是時(shí)間換空間,但是現(xiàn)在不一樣了,磁盤很便宜,而且分布式技術(shù)的成熟,使得大家更看重,典型的比如數(shù)據(jù)倉(cāng)庫(kù)的事實(shí)表和維度表,就是空間換時(shí)間,允許一定的數(shù)據(jù)冗余,換來查詢性能的提升,所以在數(shù)倉(cāng)中并不是很看中三范式,甚至有些反三范式.





