数据库范式的理解

数据库中常见的三大范式有:第一范式、第二范式、第三范式。

第一范式

数据表的列具有原子性,不可再分。

比如下表就不满足第一范式,因为选课这一列明显是可以再分的。

学号姓名选课
10001张三数学、语文、英语
10002李四语文、英语
10003王五数学、英语、历史

第二范式

第二范式是指,首先满足第一范式,并且表中非主键列不存在对主键的部分依赖。

看下面的一张学生选课表:

学号课程成绩课程学分
10001数学1005
10001语文903
10001英语824
10002数学705
10003数学935
10004语文813

上面的表就不满足第二范式,表中主键为 (学号,课程),我们可以表示为 (学号,课程) -> (成绩,课程学分), 表示所有非主键列 (成绩,课程学分)都依赖于主键 (学号,课程)。 但是,表中还存在另外一个依赖:(课程)->(课程学分)。这样非主键列 ‘课程学分’依赖于部分主键列 ‘课程’, 所以上表是不满足第二范式的。将上表做拆分如下:

学生选课表:

学号课程成绩
10001数学100
10001语文90
10001英语82
10002数学70
10003数学93
10004语文81

课程信息表:

课程课程学分
数学5
语文3
英语4

那么上面2个表,学生选课表主键为(学号,课程),课程信息表主键为(课程),表中所有非主键列都完全依赖主键。不仅符合第二范式,还符合第三范式。 

第三范式

第三范式定义是,满足第二范式,并且表中的列不存在对非主键列的传递依赖。

学生信息表:

学号姓名性别班级班主任
10001张三高一(1)班小沈
10002李四高一(2)班小钱
10003王五高一(8)班小陈
10004葛六高一(8)班小陈

上面的学生信息表,虽然满足第二范式,所有字段都依赖主键(学号),但是,表中存在一个传递依赖,(学号)-> (班级)->(班主任)。也就是说,(班主任)这个非主键列依赖与另外一个非主键列 (班级)。所以不符号第三范式。将上表做拆分如下:

学生信息表:

学号姓名性别班级
10001张三高一(1)班
10002李四高一(2)班
10003王五高一(8)班
10004葛六高一(8)班

班级信息表

班级班主任
高一(1)班小沈
高一(2)班小钱
高一(8)班小陈

这样,对主键的传递依赖就消失了。上面的2个表都符合第3范式。

 

转载于:https://my.oschina.net/edwardge/blog/1934120

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值