转载:
一、图书信息的直观表示方法:
书名
|
出版社
|
出版年份
|
第一作者
|
第二作者
|
…
|
白盒测试
|
科学出版社
|
2007
|
胡老师
|
杨老师
|
…
|
数据库管理
|
魅力出版社
|
2000
|
胡老师
|
李四
|
王五
|
二、范式的学术定义
1. 第一范式:
消除重复的组,从而所有表中的所有记录可以被每个表中的主键唯一标识。也就是:非主键的所有字段必须依赖于主键。
2. 第二范式
所有的非键值必须完全依赖于主键,不允许部分依赖
3. 第三范式
消除传递依赖。
三、图书信息要满足第一范式:
1. 内容相识的数据列必须消除
2. 必须为每一组相关数据分别创建一个数据表
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
|
五、图书信息要满足第三范式:
与主键没有直接关系的数据列必须消除(创建一个表来存放他们)。 如:本例中出版社与书的名字没有必然的联系
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
|
魅力出版社
|
总结:
在实际工作中,往往要等到数据库里已经有了足够多的测试数据之后才会注意到种种冗余的现象,然后才会清楚地知道怎样拆分数据表最合适。