范式來自于英文Normal form纺腊,簡稱NF畔咧。要想設(shè)計(jì)一個好的關(guān)系,必須使得關(guān)系滿足一定的約束條件揖膜,此約束已經(jīng)形成了規(guī)范誓沸,分成幾個等級,一級比一級要求的嚴(yán)格壹粟。滿足這些規(guī)范的數(shù)據(jù)庫是簡潔的拜隧、結(jié)構(gòu)清晰的。同時不會發(fā)生插入趁仙、刪除洪添、更新操作異常。
第一范式:是指在關(guān)系模型中雀费,對于添加的一個規(guī)范要求干奢,所有的域應(yīng)該都是原子性的。即數(shù)據(jù)庫中的每一列都是不可分割的原子數(shù)據(jù)項(xiàng)坐儿,而不能是集合律胀、數(shù)組,記錄等原子數(shù)據(jù)項(xiàng)貌矿。即實(shí)體中的某個屬性有多個值時炭菌,必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個域值只能是實(shí)體的一個屬性或者屬性的一部分逛漫。簡而言之黑低,第一范式就是無重復(fù)的域。
例如:考慮這樣一個表:【聯(lián)系人】(姓名,性別克握,電話)
如果在實(shí)際場景中蕾管,一個聯(lián)系人有家庭電話和公司電話,那么這種表結(jié)構(gòu)設(shè)計(jì)就沒有達(dá)到 1NF菩暗。要符合 1NF 我們只需把列(電話)拆分掰曾,即:【聯(lián)系人】(姓名,性別停团,家庭電話旷坦,公司電話)。1NF 很好辨別佑稠,但是 2NF 和 3NF 就容易搞混淆秒梅。
第二范式:
2NF要求的是對記錄的唯一性,要求記錄有唯一標(biāo)識舌胶,即實(shí)體的唯一性捆蜀,即不存在部分依賴。沒有包含主鍵的列必須完全依賴于主鍵幔嫂,而不能只依賴于主鍵的一部分辆它。
例如:表:學(xué)號、課程號履恩、姓名娩井、學(xué)分;
這個表明顯說明了兩個事務(wù):學(xué)生信息, 課程信息;由于非主鍵字段必須依賴主鍵,這里學(xué)分依賴課程號似袁,姓名依賴與學(xué)號,所以不符合二范式咐刨。
可能出現(xiàn)的問題:
數(shù)據(jù)冗余:每條記錄都含有相同信息
刪除異常:刪除所有學(xué)生成績昙衅,就把課程信息全刪除了;
插入異常:學(xué)生未選課定鸟,無法記錄進(jìn)數(shù)據(jù)庫而涉;
更新異常:調(diào)整課程學(xué)分,所有行都調(diào)整联予。
正確做法:
學(xué)生:Student(學(xué)號, 姓名)啼县;
課程:Course(課程號, 學(xué)分);
選課關(guān)系:StudentCourse(學(xué)號, 課程號, 成績)沸久。
第三范式:
在2NF基礎(chǔ)上季眷,任何非主屬性不依賴于其它非主屬性(在2NF基礎(chǔ)上消除傳遞依賴)。即不能存在:
非主鍵列A依賴于非主鍵列B卷胯,非主鍵列B依賴于主鍵的情況子刮。
考慮一個訂單表【Order】(OrderID,OrderDate,CustomerID挺峡,CustomerName葵孤,CustomerAddr,CustomerCity)主鍵是(OrderID)橱赠。其中 OrderDate尤仍,CustomerID,CustomerName狭姨,CustomerAddr宰啦,CustomerCity 等非主鍵列都完全依賴于主鍵(OrderID),所以符合 2NF送挑。不過問題是 CustomerName绑莺,CustomerAddr,CustomerCity 直接依賴的是 CustomerID(非主鍵列)惕耕,而不是直接依賴于主鍵纺裁,它是通過傳遞才依賴于主鍵,所以不符合 3NF司澎。
通過拆分【Order】為【Order】(OrderID欺缘,OrderDate,CustomerID)和【Customer】(CustomerID挤安,CustomerName谚殊,CustomerAddr,CustomerCity)從而達(dá)到 3NF蛤铜。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆嫩絮,區(qū)分它們的關(guān)鍵點(diǎn)在于,2NF:非主鍵列是否完全依賴于主鍵围肥,還是依賴于主鍵的一部分剿干;3NF:非主鍵列是直接依賴于主鍵,還是直接依賴于非主鍵列穆刻。