說明:資料庫中的某些概念真的很讓人頭疼,概念的東西本來就是很枯燥的,再加上枯燥的學習,那就更加枯燥了。概念這東西,你不理解也能生產東西,經驗多了就行,但是為了更深入的學習,你還必須理解。這裡,我拋開書本的概念,儘量以我簡單的理解,介紹一下這些概念:
- 什麼是函式依賴?
- 什麼是完全與部分函式依賴?
- 什麼是平凡和非平凡函式依賴?
- 什麼是屬性集的閉包?
- 3正規化的理解?
(1)什麼是函式依賴?
解釋:從這個"函式依賴"短語來看,2個詞語,函式+依賴。
函式:學程式設計的都知道,但是這裡並不僅僅指的指令的集合。讓我們回到第一次接觸"函式"這個詞語的初中或高中時代吧。函式,是一種對映關係,也就是常見的X—>Y的關係,在數學上有很多的函式(Y=X+3),知道了這個關係,我們會有X得出Y,這就是函式,表示2個事物之間的某種對應關係。
依賴:人生分為4階段,第一階段,我依賴於爸媽,第二階段,我依賴於老婆,第三階段,爸媽依賴與我,第四階段,我依賴於我的孩子。這個"依賴"是常用漢語的意思。但在專業術語裡面,也就是這麼個意思。
函式依賴:有這麼個關係實體,學生(學號,姓名,年級,性別,年齡),我知道了一個學號,就可以知道有關這個學號的其他資訊。就像,你們知道了我,就可以知道我爸媽是誰,我老婆是誰,以及我未來的孩子是誰(這個,只有到未來了)。
說白了:生活中的某個事物(人)具有一些特殊的屬性(指紋),我們可以通過這個特殊的屬性(指紋)知道它的一些其他的資訊,這種關聯我把它看做函式依賴。
(2)什麼是完全與部分函式依賴?
解釋:完全和部分,是針對於某個集體而言的。這個集體,指的是主鍵是多個屬性的組合,而不是單個屬性的主鍵。理解了上面的函式依賴,那麼這裡的完全與部分就不用過多的解釋了。
例如:常見的選課表([學號,課程號],成績)[]裡面是主鍵。那麼完全函式依賴就是:非主鍵的屬性(成績)必須,全部依賴於主鍵所有的屬性([學號,課程號]),少一個都不可以。說白了,學號+課程號—>成績,只知道其中(學號,課程號)的一個,就不可以。只知道學號,不知道課程號,是沒有辦法知道某人的某個課程的成績的。這,就是完全函式依賴。
而,部分函式依賴,非主鍵的屬性依賴於主鍵中部分的屬性就可以了。
(3)什麼是平凡和非平凡函式依賴?
解釋:所謂的平凡,就是很普通的意思,那麼非平凡就是不普通的意思。唉,你可別小看這個意思,它卻讓你容易理解概念的東西。那麼怎麼理解這個"平凡"呢。"平凡"的對立面可以說是特殊,特別,特別就是你平常不見的事物,就很特別,就不平凡。
例如:這個函式依賴(也就是關係):(學號,課程號)——>課程號,由學號和課程號推出課程號,這不是逗人玩兒嗎?誰會這麼二呀。已知課程號,你推出課程號,有意思嗎?這就是我認為的重複性生產,太平凡的一件事兒了。所以,這就是平凡函式依賴。
而 (學號,課程號)——>所在系號,從沒有推出有,這就是很特殊的一面,就是不平凡的。
說白了,對於一個函式依賴,由左邊——>右邊,如果右邊的屬性,在左邊出現過,那麼就是平凡函式依賴。反之,右邊的屬性沒有在左邊出現過,那麼就是非平凡函式依賴。
(4)什麼是屬性集的閉包?
解釋:屬性集的閉包,首先是屬性集的擁有,其次是閉包,封閉包含。
舉個例子吧:有這個關係
SC(Sno, Sname, Sex, Birthday, Cno, Cname, Grade, Tno, Tname)
滿足函式依賴集:
{Sno→Sname, Sno→Sex, Sno→Birthday, Cno→Cname, (Sno, Cno)→Grade, Tno→Tname}.
從這個函式依賴中,我們可以知道主鍵是(Sno, Cno, Tno)這三個屬性的組合。
那麼我問:屬性集(Sno, Tno)的閉包是:?
從函式依賴集可知:Sno→Sname, Sno→Sex, Sno→Birthday而Tno→Tname
所以,閉包應該是,2個集的並集{Sno, Sname, Sex, Birthday, Tno, Tname}
屬性集的閉包,說白了,就是有屬性集中的每個屬性,可以通過函式依賴推出的所有屬性的集合。
(5)3正規化的理解?
正規化,我的理解就是制定二維表的標準。
我們常說的1NF是指:表中的每一個屬性都是原子屬性(不可分割的資料項)。第一正規化很容易滿足。
2NF:在1NF的前提下,每一個非主屬性對於主鍵都是完全函式依賴的。換句話說,如果一個主鍵是單屬性的話,那麼它肯定是完全函式依賴的。
3NF:在2NF的基礎上,每一個非主屬性對於主鍵不存在函式傳遞依賴。這個函式傳遞依賴很容易理解,所以我就沒有解釋。
備註:以上純屬個人的理解,有些文字語言沒有書本上概念的嚴謹,還需參考書本理解。