1. 程式人生 > >資料庫SQL-資料庫三大正規化簡談

資料庫SQL-資料庫三大正規化簡談

 相信,在學習資料庫知識時,大家都會碰到這個概念問題:資料三大泛式,同時,在面試過程中,可能大部分面試官也會提及這個問題。

       首先,看看維基百科對於三大泛式的定義:

      資料庫規範化,又稱資料庫或資料庫的正規化、標準化,是資料庫設計中的一系列原理和技術,以減少資料庫中資料冗餘,增進資料的一致性。關係模型的發明者埃德加·科德最早提出這一概念,並於1970年代初定義了第一正規化第二正規化第三正規化的概念,還與Raymond F. Boyce於1974年共同定義了第三正規化的改進正規化——BC正規化

    除外還包括針對多值依賴第四正規化連線依賴第五正規化DK正規化第六正規化

      下面,就不扯太多定義,談談本人,從網上及部落格園博文中所理解到的三大泛式。關於三大泛式的定義,在之前有關一篇博文的評論中,我覺得總結的相當好。

       一 屬性的原子性

       二 主鍵列與非主鍵列存在完全依賴關係

       三 非主鍵列間不存在函式依賴關係

接下來,再來具體介紹介紹三大泛式內容。

       A 屬性的原子性

簡而言之,即資料庫表中每一列的值已為不可再進行分割最小單位。感覺這麼一講,還是 TMD 有點沒扯太清。打個簡單比方,比如:在電商網站中,儲存使用者收貨地址資訊(省市縣資訊),在資料庫表中,當然可以設定為一個欄位,即可儲存省市縣全部地址字串資訊。但是,需要想清楚一個問題,資料庫表設計始終要為程式碼設計,因此,如果在後續過程中,需要單獨用到省、市欄位資訊,此時,如若還採取單個欄位儲存省市資訊。那麼,顯示易見,即破壞了第一泛式設計。

      B 主鍵列與非主鍵列存在完全依賴關係

        在資料庫表設計中,相信,大部分表設計,使用者都會設定主鍵,以便作為唯一標識,便於增刪查改中的刪查改之用。而第二泛式提及的主鍵與非主鍵必須存在完全依賴關係,即嚴格表明了一點,為了減少冗餘,必須每一個非主鍵與主鍵列必須完全依整,否則,將破壞第二泛式

       查看下錶,其中為貨品表,包括貨品_ID、貨品_Type、貨品_Name、貨品_Notice 四欄位,貨品_ID + 貨品_Type 組成聯合主鍵,貨品_Notice 明顯即即不完全依賴貨品_ID 欄位,而僅僅依賴貨品_Type 欄位。

   

        非主鍵列間不存在函式依賴關係

 前面提到過,在資料庫中,一般表設計,將包括唯一的主鍵標識以及非主鍵列,那麼,在第二泛式中提到過,主鍵與非主鍵列必須存在完全依賴關係。而第三泛式中,明確表明,非主鍵列不能存在函式依整關係,不然,將會破壞第三泛式。

          同樣,以上一個表設計為例,欄位依舊分別為:貨品_ID、貨品_Type、貨品_Name、貨品_Notice 四欄位,貨品_ID為主鍵(注意此處區別),此時,會發現該表設計的問題,貨品_Notice 與貨物_Type 存在依賴關係,不符合設計要求。

          個人感想

          相信,很多剛出來工作的同學,進入公司時候,在見到公司資料庫表設計時,就會嚴格按照以上提及的三大泛式,講公司表設計不規泛,沒有外來鍵之類。但是,有時候要明白一點,設計歸設計,資料庫表設計始終於歸於一點,最後為程式碼服務。

          所以,我們會看到種種設計,為了避免頻繁連表查詢,會在表中增加冗餘欄位,為了便於序列化,會在單個欄位中儲存 JSON 字串或者 XML 資訊。

          

參考資料:http://www.cnblogs.com/wuguanglei/p/4224893.html

https://zh.wikipedia.org/zh/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A7%84%E8%8C%83%E5%8C%96