数据库三个范式实例讲解

原创文章,版权归 胡添发(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

魅力出版社

 

总结:

在实际工作中,往往要等到数据库里已经有了足够多的测试数据之后才会注意到种种冗余的现象,然后才会清楚地知道怎样拆分数据表最合适。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值