如何設計資料庫 2

2021-07-03 07:38:42 字數 3516 閱讀 5726

資料規範化

•          僅有好的rdbms並不足以避免資料冗餘,必須在資料庫的設計中建立好的表結構。表設計後,很可能結構不合理,出現資料重複儲存,簡稱資料的冗餘,這對資料的增刪改查帶來很多後患,所以我們需要審核是否合理,就像施工圖設計後,還需要其他機構進行審核圖紙是否設計合理一樣。

•          如何審核呢?需要一些有關資料庫設計的理論指導規則,這些規則業界簡稱資料庫的正規化。dr e.f.codd 最初定義了規範化的三個級別,正規化是具有最小冗餘的表結構。這些正規化是:

–         第一正規化(1st nf -first  normal fromate)

–         第二正規化(2nd nf-second  normal fromate)

–         第三正規化(3rd nf- third  normal fromate)

•          如果每列都是不可再分的最小資料單元(也稱為最小的原子單元),則滿足第一正規化(1nf)。第一正規化的目標是確保每列的原子性。

•          如果乙個關係滿足1nf,並且除了主鍵以外的其他列,都依賴於該主鍵,則滿足第二正規化(2nf)。第二正規化要求每個表只描述一件事情,確保表中的每列,都和主鍵相關。

•          如果乙個關係滿足2nf,並且除了主鍵以外的其他列都不傳遞依賴於主鍵列,則滿足第三正規化(3nf)。第三正規化確保每列都和主鍵列直接相關,而不是間接相關。

下面我們來看個形象的例子吧!假設某建築公司要設計乙個資料庫。公司的業務規則概括說明如下:

•         公司承擔多個工程專案,每一項工程有:工程號、工程名稱、施工人員等

•         公司有多名職工,每一名職工有:職工號、姓名、性別、職務(工程師、技術員)等

•         公司按照工時和小時工資率支付工資,小時工資率由職工的職務決定(例如,技術員的小時工資率與工程師不同)

•         公司定期制定乙個工資報表,如圖-1所示

工程號

工程名稱

職工號

姓名

職務

小時工資率

工時

實發工資a1

花園大廈

1001

齊光明工程師 65

13845.00

1002

李思岐技術員 60

16960.00

1004

葛宇巨集 律師

60 19

1140.00

小計 2945.00 a2

立交橋1001

齊光明工程師 65

15975.00

1003

鞠明亮 工人

55 17

935.00

小計 1910.00 a3

臨江飯店

1002

李思岐技術員 60

181080.00

1004

葛宇洪 律師

60 14

840.00

小計 1920.00

圖-1 某公司列印的工資報表

工程號

工程名稱

職工號

姓名

職務

小時工資率

工時a1

花園大廈

1001

齊光明工程師 65

13 a1

花園大廈

1002

李思岐技術員 60

16 a1

花園大廈

1004

葛宇洪 律師

60 19

a2立交橋

1001

齊光明工程師 65

15 a2

立交橋1003

鞠明亮 工人

55 17

a3臨江飯店

1002

李思岐技術員 60

18 a3

臨江飯店

1004

葛宇洪 律師

60 14

圖-2 某公司的專案工時表

1.表中包含大量的冗餘,可能會導致資料異常:

•          更新異常 

例如,修改職工號=1001的職務,則必須修改所有職工號=1001的行

•          新增異常 

若要增加乙個新的職工時,首先必須給這名職工分配乙個工程。或者為了新增一名新職工的資料,先給這名職工分配乙個虛擬的工程。(因為主關鍵字不能為空)

•          刪除異常 

例如,1001號職工要辭職,則必須刪除所有職工號=1001的資料行。這樣的刪除操作,很可能丟失了其它有用的資料

2.採用這種方法設計表的結構,雖然很容易產生工資報表,但是每當一名職工分配乙個工程時,都要重複輸入大量的資料。這種重複的輸入操作,很可能導致資料的不一致性。

我們用第二正規化規範一下:

我們再用第三正規化規範一下,是不是明晰了很多?!

規範化和效能的關係

•          為滿足某種商業目標,資料庫效能比規範化資料庫更重要

–         通過在給定的表中新增額外的字段,以大量減少需要從中搜尋資訊所需的時間

–         通過在給定的表中插入計算列(如成績總分),以方便查詢

•          進行規範化的同時,還需要綜合考慮資料庫的效能。資料庫的三大正規化和資料庫的效能有時是矛盾的。

打個比方:大家都知道,環境保護非常重要,西方總是拿環保問題和中國刁難,說中國為了發展不顧環境保護、生態自然等。可中國目前的經濟實力不夠強大,如果人都吃不飽,空談環保還有什麼用呢?所以我們只能是在保持地區經濟發展的前提下,盡量注重環保問題。這就是一種折中處理問題的典型。本例同樣如此:為了滿足三大正規化,我們在規範化**時就會拆分出越來越明細的**。但客戶喜歡綜合的資訊,為了滿足客戶,我們又需要把這些表通過連線查詢還原為客戶喜歡的綜合資料。這和從一張表中讀出資料相比,大大影響了資料庫的查詢效能。所以有時為了效能,需要做適當折中,適當犧牲規範化的要求,來提高資料庫的效能。再如:在成績表中新增一列-「成績總分」,屬於資料冗餘,因為總分在查詢時可由各門成績求出來。但頻繁查詢成績總分,並希望儲存下來,所以有時表中就乾脆新增總分這一列。

**:

如何設計資料庫 2 ?(芮)

資料規範化 僅有好的rdbms並不足以避免資料冗餘,必須在資料庫的設計中建立好的表結構。表設計後,很可能結構不合理,出現資料重複儲存,簡稱資料的冗餘,這對資料的增刪改查帶來很多後患,所以我們需要審核是否合理,就像施工圖設計後,還需要其他機構進行審核圖紙是否設計合理一樣。如何審核呢?需要一些有關資料庫...

如何設計資料庫

表與表之間的關係 例如下圖 假設使用者下單需要哪些表?每張表設計什麼字段,要用什麼型別 例如 建立個user表 create table t user id int 11 not null auto increment comment 使用者表id username varchar 50 not n...

如何設計資料庫 1 ?

為什麼需要設計資料庫 這裡我們思考兩個問題 修建茅屋需要設計嗎?修建大廈需要設計嗎?結論是 當資料庫比較複雜 如資料量大,表較多,業務關係複雜 時,我們需要先設計資料庫 因為,良好的資料庫設計能夠 q節省資料的儲存空間 q能夠保證資料的完整性 q方便進行資料庫應用系統的開發 糟糕的資料庫設計 q資料...