資料庫正規化設計

2021-06-05 23:00:01 字數 1776 閱讀 8700

在軟體開發過程中,資料庫的設計是非常重要的。可以說,良好的資料庫設計,是對使用者需求的理解的精準定位。它不僅能夠使得軟體開發起來非常便捷,而且還能夠使軟體系統高效執行,同時,為日後的維護或者更換資料庫提供便利。

在最近開發系統的過程中,感覺收穫最大的也是關於資料庫的操作。最初開發機房收費系統的時候,由於沒有經驗,而且懂得的知識也非常少,資料庫的設計根本談不上,就是感覺到資料庫中缺少某些欄位的時候,直接在資料庫表中去修改字段。這樣就為自己徒增了很多任務作量,相關的**需要一處一處去修改。

開發.net版機房收費系統的資料庫設計明顯好多了,由於充分了解了需求,資料庫設計當然比上一次好上很多。不過回頭去看,資料庫的設計還是存在很多的缺陷。表中仍然存在著大量的冗餘字段,增刪改後也會出現發生一些異常。

廢話太多了,開始步入正題了。良好的設計能夠使程式設計師的工作事半功倍。

首先,先來看官方解釋:

第一正規化是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即是實體的某個屬性不能有多個值或者不能有重複的屬性。

第二正規化是指資料庫表中不存在非關鍵字段對任一候選關鍵字段的部分函式依賴。

第三正規化資料庫表中不存在非關鍵字段對任一候選關鍵字段的傳遞函式依賴。

簡單來說,第一正規化是講資料庫表中資料的原子性,資料不可再分,只要是關係型資料庫都必須首先滿足第一正規化。看下圖例子:圖1中三個字段不可再分,故滿足第一正規化;圖2將專業、年級、班級三個字段放在乙個字段裡面,就不符合第一正規化了。

下面再來看機房收費系統中的乙個表設計——學生基本資料表。

圖a中由於每乙個欄位都不可再分,故它是滿足第一正規化的。然而這樣的設計就會產生大量的冗餘字段。如果乙個學生註冊兩個卡,那麼該學生的資訊就需要重複兩次。

第二正規化就解決了上述問題。它強調其屬性必須完全依賴主鍵,實體的屬性不能僅僅依賴主關鍵字的一部分屬性。如果存在部分依賴關係,那麼這個屬性和主關鍵字相應部分應該分離出來形成乙個新的實體,實體與原始體之間是一對多的關係。

像上面例子中,很顯然主鍵是卡號和學號聯合做主鍵,其中姓名、性別、系別、專業、年級、班級都只與學號有關,只依賴學號,而不依賴卡號,這樣就不符合第二正規化了。

我們的根據第二正規化的要求,將其與學生相關的資訊分離出來,修改後,我們可得一下兩個表:

然而,僅僅滿足第二正規化的資料庫是遠遠不夠的,滿足第二正規化,仍然可能會出現傳遞依賴。圖b學生表中系別與專業存在傳遞關係。假如小紅和小明的系別都是數信學院,專業都是數學專業,那麼這樣資料庫中系別就重複了兩次,增加了冗餘字段。

第三正規化保證了同一類事物分在乙個表中,消除了傳遞依賴的現象。我們再根據第三正規化的設計要求,將其學生表在進行分離,得到下面的表:

下面給出圖c的資料庫關係圖:

好的資料庫設計,是軟體開發中非常重要的一步。三正規化設計只是乙個標準,對於基本表的設計,建議大家盡量按照三正規化的要求進行設計;而對於臨時表的設計,我們可以適量的增加一些冗餘字段,畢竟單一表的查詢檢索速度比較快,提高了系統效能。

資料庫設計正規化

目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 第四正規化 4nf 第五正規化 5nf 和第六正規化 6nf 滿足最低要求的正規化是第一正規化 1nf 在第一正規化的基礎上進一步滿足更多要求的稱為第二正規化 2nf 其餘正規化以次類推。一般說來,資料庫只需滿...

資料庫設計正規化

前言 為什麼要寫這篇文章呢,從去年年底開始,就和很多做技術的朋友交流過,從資料庫設計到資料庫架構各個方面的內容。有一些朋友執著於orm,執著於所謂的資料庫設計,卻忘記了一切技術是要為業務服務這個基石。當然這文章裡也有一些自己的理解,想向大家表達。正規化是什麼 正規化是符合某一種級別的關係模式的集合。...

資料庫設計 正規化

本文介紹常用的第一正規化 第二正規化 第三正規化以及bc正規化。在理解正規化前需要先了解一些基本概念。基本概念 碼 乙個屬性或者屬性組,使得整個關係中除過此屬性或者屬性組之外的其餘屬性都完全函式依賴於它,那它就是碼。在乙個關係中可以同時存在多個碼。主碼 從候選碼中挑選的其中乙個稱為主碼。主鍵 從候選...