範式(數據庫設計範式,數據庫的設計範式)是符合某一種級別的關係模式的集合。構造數據庫必須遵循必定的規則。在關係數據庫中,這種規則就是範式。關係數據庫中的關係必須知足必定的要求,即知足不一樣的範式。數據庫
在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不知足第一範式(1NF)的數據庫就不是關係數據庫。數據庫設計
所謂第一範式(1NF)是指數據庫[表]的每一列都是不可分割的基本數據項,同一列中不能有多個值,即[實體]中的某個屬性不能有多個值或者不能有重複的屬性。設計
例如一個字段NAME
保存了「李白,字太白」,這樣就不符合第一範式,由於存儲了多個值,可改成名
和字
兩個字段,分別保存李白和太白。code
在知足第一範式的基礎上,不容許部分依賴。效率
所謂部分依賴,指的是當主鍵由兩個以上的字段組成的時候。其餘非主屬性不能僅僅依賴主鍵的一部分。好比學號
,課程
,分數
,姓名
這四個字段。咱們把(學號
,課程
)組合起來做爲主鍵,能夠發現,分數
是依賴於所有主鍵的,而姓名
僅僅依賴於學號
,和課程
沒有半毛錢關係,這就叫部分依賴。基礎
不知足第二範式會存在一些問題:引用
數據冗餘:每條記錄都含有相同信息;數據
刪除異常:刪除全部學生成績,就把課程信息全刪除了;查詢
插入異常:學生未選課,沒法記錄進數據庫;異常
更新異常:調整課程學分,全部行都調整。
若是按照第二範式設計,能夠拆分紅
學生表:student(學號, 姓名);
課程表:course(課程號, 學分);
選課關係表:student_course(學號, 課程號, 成績)。
在知足第二範式的基礎上,不能存在依賴傳遞。
好比一張表有學號
,姓名
,課程號
,課程名稱
,這幾個字段。課程號
依賴於學號
,而課程名稱
依賴於課程號
。因此課程名稱
傳遞依賴於學號
。
可能會存在問題:
若是按照第三範式進行設計,能夠拆分紅
學生表:student(學號, 姓名, 課程號);
課程表:course(課程號, 課程名稱)。
在進行數據庫設計時,不能古板的一味迎合範式。不難看出,範式的等級越高,拆分的表就越多,查詢操做也就越複雜,查詢的效率也會受到影響。因此在有些時候適當下降範式標準,增長一些冗餘字段,雖然會增長一些空間佔用,以及對冗餘數據的維護工做,但帶來的效率的提高是很值得的,這就是所謂的反三範式。