前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是第一,第二,第三范式

什么是第一,第二,第三范式

作者头像
全栈程序员站长
发布2022-08-31 19:45:02
3680
发布2022-08-31 19:45:02
举报

大家好,又见面了,我是你们的朋友全栈君。

我们在数据库表设计时,经常说,某某表要遵循第三范式。下面通过实例介绍第一,第二,第三范式

第一范式

所谓第一范式,就是数据表的列不可再分。

看下面数据表,对于选课列明显是可以再分的,所以它是违反第一范式的。

学号

姓名

选课

10001

张三

数学,语文,英语

10002

李四

语文,英语

10003

王五

语文,英语,历史

第二范式

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

看下面的学生选课表:

学号

课程

成绩

课程学分

10001

数学

100

6

10001

语文

90

2

10001

英语

85

3

10002

数学

90

6

10003

数学

99

6

10004

语文

89

2

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

我们把它拆成如下2张表:

学生选课表:

学号

课程

成绩

10001

数学

100

10001

语文

90

10001

英语

85

10002

数学

90

10003

数学

99

10004

语文

89

课程信息表:

课程

课程学分

数学

6

语文

3

英语

2

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

再看这样一个学生信息表:

学号

姓名

性别

班级

班主任

10001

张三

一班

小王

10002

李四

一班

小王

10003

王五

二班

小李

10004

张小三

二班

小李

上表中,主键为:(学号),所有字段 (姓名,性别,班级,班主任)都依赖与主键(学号),不存在对主键的部分依赖。所以是满足第二范式。

第三范式

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

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

把这个表拆分成如下2个表,

学生信息表:

学号

姓名

性别

班级

10001

张三

一班

10002

李四

一班

10003

王五

二班

10004

张小三

二班

班级信息表:

班级

班主任

一班

小王

二班

小李

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

更高级别的范式

对应上面的班级信息表,完全可以设计成这样:

班级

班主任

班级人数

一班

小王

40

二班

小李

45

这显然是符合第三范式的,所有列都依赖主键(班级),也不存在传递依赖。但是列(班级人数) 显然可以通过统计方法获得,出现在这张表,会造成维护困难或者不一致的情况。这就需要更高级别范式的约束。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142350.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一范式
  • 第二范式
  • 第三范式
  • 更高级别的范式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档