資料庫設計之三正規化

2021-08-21 05:35:16 字數 3610 閱讀 9433

上圖表的設計明顯不符合第一正規化,因為列下面又出現了復合列,破壞了資料庫中的每一列都必須不可拆分的最小單元的原則。實際上在現有的relational dbms中,這種結構的表也是建立不出來的,關係型資料庫不允許把資料庫表的一列再分成兩列或者多列,所以在關係型資料庫中建立的表均滿足最基礎的第一正規化。

建立:id

region

1中國上海市

2中國浙江省

3加拿大魁北克省

如果業務需要的話,則region還可以繼續拆分為:countryprovinceid

country

province1中國

上海市2

中國浙江省

3加拿大

魁北克省

簡而言之,第二正規化(2nf)就是非主屬性完全依賴於主鍵。

第二正規化要求資料庫表中的每一行都可以被唯一區分!為實現區分通常要為表新增一唯一屬性列,用來儲存每一行的唯一標識。此唯一屬性列被稱為主關鍵字、主鍵或主碼。

選課表:select_cource(學號、學生姓名、學生年齡、課程名稱、成績、課程學分值)

student_no

student_name

student_age

cource_name

cource_score

cource_credits

乙個學生可以選多門課,一門課可以對應多個學生,所以此表中唯一確定每一行的主鍵應為:(學號,課程名稱)組合關鍵字。

存在如下關係:

(學號,課程名稱)➡(學生姓名、學生年齡、成績、學分)

這個資料庫表不滿足第二正規化,因為:

(學號)➡(學生姓名、學生年齡)

(課程名稱)➡(課程學分值)

即存在組合關鍵字中的字段決定非關鍵字的情況。

不符合第二正規化的話,會出現如下問題:

1. 資料冗餘:

同一門課程,比如高數,可以被n個學生選修,高數課的學分大學裡一般都是5個學分,則表中「學分」欄位就會重複n-1次;同乙個學生選修了m門課程,則「學生姓名」和「年齡」就重複了m-1次。

student_no

student_name

student_age

cource_name

cource_score

cource_credits

1張三

22

高等數學

9052李四

23大學物理853

3王五22高等數學

705

1張三

22

資料結構884

1張三

22

線性代數772

2. 更新異常:

若調整某門課程(如高數)的課程學分值,資料表中所有行的「學分」都要更新,否則出現同一門課程學分值不同的情況。

student_no

student_name

student_age

cource_name

cource_score

cource_credits1張三

22高等數學

90562李四

23大學物理853

3王五22高等數學

70561張三

22資料結構884

1張三22線性代數772

3. 插入異常:

假設要開設一門新的課程,暫時還沒有學生選修此課程。由於沒有「學號」關鍵字,則學生姓名、成績和年齡無法記錄資料庫中。

student_no

student_name

student_age

cource_name

cource_score

cource_credits1張三

22高等數學905

2李四23大學物理853

3王五22高等數學705

1張三22資料結構884

1張三22線性代數772

null

null

null

大學英語

null3

4. 刪除異常:

假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫中刪除。但是,與此同時,課程名稱和課程學分值也被刪除了。

student_no

student_name

student_age

cource_name

cource_score

cource_credits1張三

22高等數學905

2李四23大學物理853

3王五22高等數學705

1張三22資料結構884

1張三22線性代數772

若上表中記錄是2012級學生選課記錄,學期結束時,如果需要清除資料,則直接將表中資料全部清除了,但是,高等數學、大學物理、資料結構、線性代數等這些課程2013級新同學還是要選修的,此時已經刪除了,沒得選了。

5. 重新設計表:

student(學號、學生姓名、學生年齡)

cource(課程名稱、課程學分值)

select_cource(學號、課程名稱、成績)

6. 另外,所有單主鍵的資料庫表都符合第二正規化,因為它的主鍵不是組合字段。

第三正規化要求乙個資料庫表中不包含其他表中已包含的非主鍵資訊。

第三正規化消除了資料冗餘、插入異常、更新異常、刪除異常。

例如:部門資訊表:dept_info

dept_id

dept_name

dept_description

1財務部

負責公司財務

2技術部

負責產品技術開發

3運營部

負責業務運營

員工表:employeeemployee表中列出員工所屬部門編號之外,部門名稱、部門描述等字段就不能再加入employee表中。如果不存在dept_info表,則根據第三正規化,應該構建它,否則就會有大量的資料冗餘。

emp_id

emp_name

dept_id

dept_name1張三

2技術部2李四

3運營部3王五

3運營部

4香克斯

1財務部

資料庫設計之三大正規化

為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...

資料庫設計之三大正規化

背景 表設計後,很可能結構不合理,出現資料重複儲存,簡稱資料的冗餘,這對資料的增刪改查帶來很多後患,所以我們需要審核是否合理,如何審核呢?需要一些有關資料庫設計的理論指導規則,這些規則業界簡稱資料庫的正規化。兩個重要概念 1 部分函式依賴 1 存在資料冗餘 2 新增資料會有異常 3 更新資料會有異常...

MySQ資料庫設計之三正規化

目錄 1.資料庫設計之三正規化的介紹 2.第一正規化的介紹 3.第二正規化的介紹 4.第三正規化的介紹 5.e r模型的介紹 6.總結 正規化 對設計資料庫提出的一些規範,目前有跡可尋的共有8種正規化,一般遵守3正規化即可。如圖所示的表結構 contact name idage jason 1001...