由於最近要做畢業設計了,所以加強了一下資料庫設計的基礎知識,主要是正規化的應用。在此作些總結吧。
首先是基礎概念,也就是術語:
(1) 實體(entity):就是實際應用中要用資料描述的事物,一般是名詞。
(2) 字段(fields):就是一項資料,也就是我們平常所說的「列」。
(4) 鍵(key):可唯一標識一條記錄的乙個欄位或字段集。
(5) 主鍵(primary key):用於唯一標識乙個表中的一條記錄的鍵。每個主鍵應該具有下列特徵:1. 唯一的。2.最小的(盡量選擇最少鍵的組合)。3.非空。4.不可更新的(不能隨時更改)
(7) 依賴表(dependent table):也稱為弱實體(weak entity)是需要用父表標識的子表。
(8) 關聯表(associative table):是多對多關係中兩個父表的子表。
(9) 實體完整性:每個表必須有乙個有效的主鍵。
(10) 參照完整性:沒有不相匹配的外鍵值。
具體例子:
上圖是規範化的設計。下面展示乙個非規範化的設計。如圖:
那麼非規範化的設計有什麼利弊呢?
缺點:其實潛在的問題是致命的。
1. 更新問題。當有兩條主鍵(id)不一樣,但其他資訊完全相同的資料遇到更新時,其中一條的資料更新了,但另一條沒有更新,結果產生不一致的資料。
2. 插入問題。當插入一條資料時,插入資訊只是表屬性的一部分。例如上例中只插入乙個member的基本資訊(email,password,fname,iname,phone),在非規範化設計中是禁止的,因為該資料資訊不完整。
這些問題導致了在構造關聯式資料庫時一些規則的出現,這些就是正規化。
第一正規化定義:表中所有欄位僅包含單值。
很明顯,第二行的資料違反了第一正規化。因為phone的字段有兩個值。ps:汗乙個,美國人怎麼連密碼都是**???
解決的辦法有:
在討論更高階的正規化之前,必須明白確定因子的概念。
確定因子(determinant):是乙個欄位或一組字段,它控制或確定其他欄位的值。
第二正規化定義:表中的每個非鍵字段由整個主鍵確定,且不能由主鍵自身的一部分確定。因此,2nf的違例只會出現在主鍵是由超過乙個字段構成的表中。
在上面的student_enroll表中id決定了fname,iname,dorm,phone,而section$call_no又決定了fname,iname,dorm,phone,grade。違反了第二正規化,則在更新時,由於jim green有兩個**號碼而無法更新。
解決的辦法有:
第三正規化定義:表中不存在可以確定其他非關鍵字的非鍵字段。
3nf的違例可能發生在具有多個非鍵字段的表中。
上圖的membervisit中,主鍵(id)決定了email,password,fname,iname,phone。email決定了password,fname,iname,phone。所以違反了第三正規化。會導致luce儲存了兩個passwords.。這顯然是不對的。
解決的方法:
bcnf定義:每個確定因子是乙個鍵。這個正規化特別用於處理非鍵字段確定主鍵的一部分主要的情況。
上面的quarterly_bonus表中,乙個非鍵字段ssn確定employee_id,它是鍵的一部分。實際上,ssn和employee_id彼此相互確定。所以違反了bcnf正規化。會導致更新問題,雇員8857在圖中有兩個不同的ssn。
解決方法:
第四正規化定義:在全鍵表中,鍵的一部分可以確定至多乙個其他欄位的多個值。4nf僅用於全鍵表。
為了理解第四正規化,需要引入多值依賴(multivalued dependency,mvd)的概念:指可以控制或確定另乙個欄位的多個值的乙個或一組字段。
上面的skill表中,email是多值依賴的。違反了第四正規化。如果我們刪除了luce的german身份。我們也丟失了他愛好網球的資訊。
解決方法:
這兩個表是沒有聯絡的。每個表僅包含乙個mvd。
檢測正規化違例:
1. 當多個值儲存在乙個單元中時會發生1nf違例。
2. 2nf違例只會發生在具有關聯鍵的表中,且非鍵字段只依賴於主鍵的一部分。
3. 3nf違例發生在乙個非鍵字段確定另乙個非鍵字段的情況下,表可能有乙個任何大小的鍵。
4. bcnf違例出現在非鍵字段確定主鍵的一部分的情況下。這些違例只能發生在主鍵是有關聯鍵組成的表中。
5. 4nf違例發生在表的主鍵至少由3個鍵連線而成且沒有非鍵字段的情況下,此外,鍵的一部分確定鍵的另一部分的多個值。
單向雜湊函式的具體例子
一 md4 md5 md4是由rivest於1990年設計的單向雜湊函式,能夠產生128bit的雜湊值。不過隨著dobbertin提出尋找md4雜湊的碰撞方法,現在已經不安全了。md5是由rivest於1991年設計的單向雜湊函式,能夠產生128位元的雜湊值。md5的強抗碰撞性已經被攻破,也就是說,...
eventfd 的分析與具體例子
linux 2.6.27後新增了乙個新的特性,就是eventfd,是用來實現多程序或多執行緒的之間的事件通知的,也可以由核心通知使用者空間應用程式事件。eventfd的建立是通過eventfd函式實現的,返回值即是該eventfd所對應的檔案描述符,函式的原型如下所示 include inteven...
紅茶和綠茶的區別 具體那些是紅茶和綠茶
綠茶 又稱不發酵茶。以適宜茶樹新梢為原料,經殺青 揉捻 乾燥等典型工藝製成。按其乾燥和殺青方法不同,一般分為炒青 烘青 曬青和蒸青綠茶,綠茶形成了 清湯綠葉,滋味收斂性強 等特點。綠茶是歷史最早的茶類,距今三千多年,也是我國產量最大的茶類,產區主要分布於浙江 安徽 江西等省。代表茶有西湖龍井 信陽毛...