数据库的三范式
原创文章,版权归 胡添发(hutianfa@163.com)所有,转载请注明出处:
http://blog.csdn.net/aidisheng/archive/2008/09/24/2970370.aspx
一、图书信息的直观表示方法:
书名出版社出版年份第一作者
第二作者
二、范式的学术定义
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白盒测试科学出版社20072数据库管理魅力出版社2000?
Authors表IDTitleID(外键)作者11胡老师21杨老师32胡老师42李四52王五
在作者表中,名字还是存在重复,所以可以进一步改进为三个表:
?
Title表ID书名出版社出版年份1白盒测试科学出版社20072数据库管理魅力出版社2000?
Authors表ID姓名1胡老师2杨老师3李四4王五?
Rel_title_author表TitleID (外键)AuthorID (外键)1112212324
五、图书信息要满足第三范式:
与主键没有直接关系的数据列必须消除(创建一个表来存放他们)。? 如:本例中出版社与书的名字没有必然的联系
?
Authors表ID姓名1胡老师2杨老师3李四4?王五?
Rel_title_author表TitleID (外键)AuthorID (外键)1112212324?
?
Publishers表ID名称1科学出版社2魅力出版社?
总结:
在实际工作中,往往要等到数据库里已经有了足够多的测试数据之后才会注意到种种冗余的现象,然后才会清楚地知道怎样拆分数据表最合适。