上圖表的設計明顯不符合第一正規化,因為列下面又出現了復合列,破壞了資料庫中的每一列都必須不可拆分的最小單元的原則。實際上在現有的relational dbms
中,這種結構的表也是建立不出來的,關係型資料庫不允許把資料庫表的一列再分成兩列或者多列,所以在關係型資料庫中建立的表均滿足最基礎的第一正規化。
建立:id
region
1中國上海市
2中國浙江省
3加拿大魁北克省
如果業務需要的話,則region
還可以繼續拆分為:country
和province
id
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運營部
負責業務運營
員工表:employee
,employee
表中列出員工所屬部門編號之外,部門名稱、部門描述等字段就不能再加入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...