轉載:
一、圖書信息的直觀表示方法:
書名
|
出版社
|
出版年份
|
第一作者
|
第二作者
|
…
|
白盒測試
|
科學出版社
|
2007
|
胡老師
|
楊老師
|
…
|
數據庫管理
|
魅力出版社
|
2000
|
胡老師
|
李四
|
王五
|
二、范式的學術定義
1. 第一范式:
消除重復的組,從而所有表中的所有記錄可以被每個表中的主鍵唯一標識。也就是:非主鍵的所有字段必須依賴于主鍵。
2. 第二范式
所有的非鍵值必須完全依賴于主鍵,不允許部分依賴
3. 第三范式
消除傳遞依賴。
三、圖書信息要滿足第一范式:
1. 內容相識的數據列必須消除
2. 必須為每一組相關數據分別創(chuàng)建一個數據表
3. 每條數據記錄必須用一個主鍵來標識
Title表
|
書名
|
出版社
|
出版年份
|
第一作者
|
第二作者
|
…
|
白盒測試
|
科學出版社
|
2007
|
胡老師
|
楊老師
|
…
|
數據庫管理
|
魅力出版社
|
2000
|
胡老師
|
李四
|
王五
|
Title表
|
ID
|
書名
|
出版社
|
出版年份
|
作者
|
1
|
白盒測試
|
科學出版社
|
2007
|
胡老師
|
2
|
白盒測試
|
科學出版社
|
2007
|
楊老師
|
3
|
數據庫管理
|
魅力出版社
|
2000
|
胡老師
|
4
|
數據庫管理
|
魅力出版社
|
2000
|
李四
|
5
|
數據庫管理
|
魅力出版社
|
2000
|
王五
|
四、圖書信息要滿足第二范式:
1. 只要數據列里的內容出現重復,就應該把數據表拆分為多個表
2. 拆分形成的數據表必須用外鍵關聯起來
在本例中,Title表中的書名是重復的,原因是因為要表現與作者的關系才重復的,所以要消除它,就需要把作者的信息拆分出來:
Title表
|
ID
|
書名
|
出版社
|
出版年份
|
1
|
白盒測試
|
科學出版社
|
2007
|
2
|
數據庫管理
|
魅力出版社
|
2000
|
Authors表
|
ID
|
TitleID(外鍵)
|
作者
|
1
|
1
|
胡老師
|
2
|
1
|
楊老師
|
3
|
2
|
胡老師
|
4
|
2
|
李四
|
5
|
2
|
王五
|
在作者表中,名字還是存在重復,所以可以進一步改進為三個表:
Title表
|
ID
|
書名
|
出版社
|
出版年份
|
1
|
白盒測試
|
科學出版社
|
2007
|
2
|
數據庫管理
|
魅力出版社
|
2000
|
Authors表
|
ID
|
姓名
|
1
|
胡老師
|
2
|
楊老師
|
3
|
李四
|
4
|
王五
|
Rel_title_author表
|
TitleID (外鍵)
|
AuthorID (外鍵)
|
1
|
1
|
1
|
2
|
2
|
1
|
2
|
3
|
2
|
4
|
五、圖書信息要滿足第三范式:
與主鍵沒有直接關系的數據列必須消除(創(chuàng)建一個表來存放他們)。 如:本例中出版社與書的名字沒有必然的聯系
Title表
|
ID
|
書名
|
PublisherID (外鍵)
|
出版年份
|
1
|
白盒測試
|
1
|
2007
|
2
|
數據庫管理
|
2
|
2000
|
Authors表
|
ID
|
姓名
|
1
|
胡老師
|
2
|
楊老師
|
3
|
李四
|
4
|
王五
|
Rel_title_author表
|
TitleID (外鍵)
|
AuthorID (外鍵)
|
1
|
1
|
1
|
2
|
2
|
1
|
2
|
3
|
2
|
4
|
Publishers表
|
ID
|
名稱
|
1
|
科學出版社
|
2
|
魅力出版社
|
總結:
在實際工作中,往往要等到數據庫里已經有了足夠多的測試數據之后才會注意到種種冗余的現象,然后才會清楚地知道怎樣拆分數據表最合適。