1. 程式人生 > >數據庫的四種範式

數據庫的四種範式

數據庫 多個 完全 等等 第二範式 有著 學生 滿足 理解

看完各路大神的答案後頓有所悟,總結如下:
<br>1.先要知道幾個概念:
碼:一個表中,可以唯一決定一個元組的屬性“集合”。而主鍵則是可以唯一決定元組的‘某個屬性’。
例如:在成績表中(學號,課程號)合起來叫一個碼,而分開看學號是主鍵,課程號也是主鍵。
非主屬性:不屬於碼的屬性。
主屬性:屬於碼的屬性。
候選鍵:指每個都不一樣的、非空的那幾個屬性,有著潛在的主鍵意義。
比如一個表中的課程號學號,系別號等等。。<br>
2.通俗的講範式:<br>1)第一範式:屬性不可拆分。
如:地址這個屬性是可拆分成城市地區等等,不可以把地址作為一個屬性
解決方案:屬性拆分開來,將一個地址屬性改成多個屬性,按照城市地區..設置多個屬性。
2)第二範式:每個表中的非主屬性完全依賴於碼。
特殊情況:若碼只有一個屬性,則必滿足第二範式。
如:(學號,課程號)這個表中的碼被“學生名字”部分函數依賴。即包含有學號→學生名字這種依賴關系。不符合2NF
解決方案:將部分函數依賴的部分碼和依賴這些碼的屬性拿出來單獨成表,在原表中用外鍵代替以前的多個屬性。<br>
個人理解:將部分單獨拿出來,用一個外鍵在原表中代替,可以大大減少原表中的屬性條數。
3)第三範式:消除非主屬性之間的依賴關系,只保留非主屬性與碼的依賴關系。
(消除傳遞函數依賴的另一說法,本質是一樣的)
如:學號,課程號,系別,系主任。系別和系主任是非主屬性,學號和課程號是主屬性。但是系別和系主任這兩個非主屬性之間有函數依賴關系:系別→系主任。必造成傳函依賴:學號→系別→系主任。不符合3NF 解決方案:將這個非主屬性與其依賴的碼都拿出來單獨建表,並設置被依賴的屬性為主鍵,在原表中則用外鍵表示。
個人理解:將相互內在關聯的非主屬性用一個外鍵在原表中表示,可以大大減少數據冗余。
4)BC範式:每個表中只有一個候選鍵。
如:學號,學生名字,學生QQ。我們設置學號作主鍵,但是學生QQ、學號這兩個都是候選鍵,一張表中有多個候選鍵,不符合BC範式。
解決方案:保留一個候選鍵作為主鍵,拿出其他的候選鍵單獨成表,將原表中的主鍵放入該表中。在原表中不顯示這個拿出來的候選鍵,從而 保證每個表中只有1個候選鍵。
個人理解:主鍵越少越好。一個表中的候選鍵越少越好。
但是這個BC範式有些苛刻了,很多情況比如成績單表(學生 課程 成績) ,學生、課程為候選鍵,我們這樣直接建表也是可以的。
設計到第三範式就行了!BC範式太苛刻了,大多數情況用不到。</span>

數據庫的四種範式