本文以Java程式員的眼光來解釋三範式,並附上例子,和這樣設計會出現哪些問題。來更加通俗的講述一下3大範式。最後附上BC範式的一點理解。
第一範式,每一個列不可再分。
對應我們設計就是不能出現重複的列。這個是關聯式資料庫的基礎沒有人會犯這個錯誤(資料庫也不讓)。
下面舉一個我們可能會犯錯的例子。
學生表,(姓名,班級,年齡,性別,家庭住址,班主任姓名,班主任職稱,所選課程,課程學分)。
這裡如果是教育局查看所有所有的表,可能會出現,統計一下北京通州區的學生數量,統計一下北京海澱區的學生數量。這樣沒有辦法統計了。所以在這個背景下,我們設計應該是。學生表(姓名,班級,年齡,性別,家庭所在市,家庭所在區,班主任姓名,班主任職稱,所選課程,課程學分)。
理解:設計資料庫的時候,根據業務最好把東西拆分成合適的粒子。我們還出現一個2的情況,就是欄位不夠了,也不能隨便加資料庫欄位,我就把一個備用欄位,中間用,“,”作為分隔字元,放了好多東西,最後要分類統計,就2了。
第二範式,在第一範式的基礎上,非主屬性依賴於主屬性。
還是上面的例子。
主屬性,候選碼,都是唯一的意思(也就是資料庫中的主鍵)。如果學生姓名是唯一的,學生姓名也就是碼,那麼就有了主屬性。如果每個學生只選擇一門課程。那麼課程也是唯一依賴于姓名。但是實際生活中,學生很容易重名,學生也要選擇多門課程。所以以上違背第二範式。改變為,學生表(學號,姓名,班級,年齡,性別,家庭所在市,家庭所在區,班主任姓名,班主任職稱,所選課程號) ,課程表(課程號,課程名稱,課程學分)。
理解:程式中必須設定主鍵,一對多關聯性必須差分開,多對多也是一樣。有的時候為了連表方便也把名稱和主鍵都放在另一個表裡。這樣就省去連表了,但是會出現一種情況
教師的名稱改變了,但是你學生表的老師名稱沒有改變。
第三範式,消除非主屬性傳遞依賴。
學生表(學號,姓名,班級,年齡,性別,家庭所在市,家庭所在區,班主任姓名,班主任職稱,所選課程號)
這時候,班主任依賴於學號,班主任名稱依賴於班主任,間接依賴於學號,這就是傳遞依賴應該變為。
學生表(學號,姓名,班級,年齡,性別,家庭所在市,家庭所在區,班主任編號,所選課程號)
教師表(教師編號,姓名,職稱)
理解:程式中除了主鍵其他資訊不能出現在其他表中。(也就是任意兩個表,不能出現重複的非主鍵欄位)
BC範式,消除主屬性傳遞依賴
假設學校腦抽,讓錄指紋方便打卡。學生表(學號,姓名,班級,年齡,性別,家庭所在市,家庭所在區,指紋)
這裡就會出現指紋是唯一的,指紋依賴於學號,那麼就出現了主屬性依賴。
如果學生退學了,指紋資訊也消失了,這個系統如果想要建立一個指紋庫,那麼不符合需求了。
這是候差分成,學生表(學號,姓名,班級,年齡,性別,家庭所在市,家庭所在區,指紋ID)。指紋表(指紋ID,指紋)
理解:1對1關係,最好也進行差分。
以上是個人理解,如果有錯誤,望讀者指出,謝謝。