原创文章,版权归 胡添发(hutianfa@163.com)所有,转载请注明出处:
http://blog.csdn.net/aidisheng/archive/2008/09/24/2970370.aspx
一、图书信息的直观表示方法:
书名 | 出版社 | 出版年份 | 第一作者 | 第二作者 | … |
白盒测试 | 科学出版社 | 2007 | 胡老师 | 杨老师 | … |
数据库管理 | 魅力出版社 | 2000 | 胡老师 | 李四 | 王五 |
二、范式的学术定义
1. 第一范式:
数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
第一范式:无重复的列。
2. 第二范式
所有的非主键值必须完全依赖于主键,不允许部分依赖
3. 第三范式
属性不依赖于其他非主属性(消除传递依赖),要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
三、图书信息要满足第一范式:
1. 不允许同一列中不能有多个值,内容相似的数据列必须消除
2. 必须为每一组相关数据分别创建一个数据表
3. 每条数据记录必须用一个主键来标识
一个列有多个值:
Book表 | |||||
书名 | 出版社 | 出版年份 | 作者 | ||
白盒测试 | 科学出版社 | 2007 | 胡老师,杨老师 | ||
数据库管理 | 魅力出版社 | 2000 | 胡老师,李四,王五 |
或者有相似的多个列:
Book表 | |||||
书名 | 出版社 | 出版年份 | 第一作者 | 第二作者 | … |
白盒测试 | 科学出版社 | 2007 | 胡老师 | 杨老师 | … |
数据库管理 | 魅力出版社 | 2000 | 胡老师 | 李四 | 王五 |
不管是第一作者还是第二作者,都是作者,是相同的数据列,所以必须要消除:
Book表 | ||||
ID | 书名 | 出版社 | 出版年份 | 作者 |
1 | 白盒测试 | 科学出版社 | 2007 | 胡老师 |
2 | 白盒测试 | 科学出版社 | 2007 | 杨老师 |
3 | 数据库管理 | 魅力出版社 | 2000 | 胡老师 |
4 | 数据库管理 | 魅力出版社 | 2000 | 李四 |
5 | 数据库管理 | 魅力出版社 | 2000 | 王五 |
四、图书信息要满足第二范式:
所有的非主键值必须完全依赖于主键,不允许部分依赖
一些判断依据:
1. 只要数据表中的内容出现重复的行,就应该把数据表拆分为多个表
2. 拆分形成的数据表必须用外键关联起来
在本例中,Book表中的书名是重复的,原因是因为要表现与作者的关系才重复的,所以要消除它(图书名称依赖图书id,但作者姓名并不依赖图书id),就需要把作者的信息拆分出来:
Book表 | |||
ID | 书名 | 出版社 | 出版年份 |
1 | 白盒测试 | 科学出版社 | 2007 |
2 | 数据库管理 | 魅力出版社 | 2000 |
Authors表 | ||
ID | BookID(外键) | 作者 |
1 | 1 | 胡老师 |
2 | 1 | 杨老师 |
3 | 2 | 胡老师 |
4 | 2 | 李四 |
5 | 2 | 王五 |
在作者表中,名字还是存在重复,所以可以进一步改进为三个表:
Book表 | |||
ID | 书名 | 出版社 | 出版年份 |
1 | 白盒测试 | 科学出版社 | 2007 |
2 | 数据库管理 | 魅力出版社 | 2000 |
Authors表 | |
ID | 姓名 |
1 | 胡老师 |
2 | 杨老师 |
3 | 李四 |
4 | 王五 |
Rel_book_author表 | |
BookID (外键) | AuthorID (外键) |
1 | 1 |
1 | 2 |
2 | 1 |
2 | 3 |
2 | 4 |
五、图书信息要满足第三范式:
属性不依赖于其他非主属性(消除传递依赖),要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
一些判断依据:与主键没有直接关系的数据列必须消除(创建一个表来存放他们)。 如:本例中出版社与书的名字没有必然的联系。
Book表 | |||
ID | 书名 | 出版社 | 出版年份 |
1 | 白盒测试 | 科学出版社 | 2007 |
2 | 数据库管理 | 魅力出版社 | 2000 |
Book表 | |||
ID | 书名 | PublisherID (外键) | 出版年份 |
1 | 白盒测试 | 1 | 2007 |
2 | 数据库管理 | 2 | 2000 |
Authors表 | |
ID | 姓名 |
1 | 胡老师 |
2 | 杨老师 |
3 | 李四 |
4 | 王五 |
Rel_book_author表 | |
BookID (外键) | AuthorID (外键) |
1 | 1 |
1 | 2 |
2 | 1 |
2 | 3 |
2 | 4 |
Publishers表 | |
ID | 名称 |
1 | 科学出版社 |
2 | 魅力出版社 |
总结:
在实际工作中,往往要等到数据库里已经有了足够多的测试数据之后才会注意到种种冗余的现象,然后才会清楚地知道怎样拆分数据表最合适。