学生编号 姓名 性别 电子邮件 电话
张三 男
李四 女
例2,学生班级信息
学生编号 姓名 班级
小明 高三1班
小叶高三2班
以上的表就不符合,第一范式:班级字段可以再分,所以变更为正确的是:
学生编号 姓名 年级 班级
小明 高三 1班
小叶高三 2班
例3,员工信息表
员工编号 姓名 工作年限
小明 2009~2011
小叶2006~2012
以上的表就不符合,第一范式:工作年限可以再分,所以变更为正确的是:
员工编号 姓名 工作年份 离职年份
小明 2009 2011
小叶 2006 2012
例4,学生成绩表
学生编号 姓名 课程成绩
小明 80,70,90
小叶 60,70,85
以上的表就不符合,第一范式:课程成绩可以再分,所以变更为正确的是:
学生编号 姓名 语文 数学 外语
小明 80 70 90
小叶 60 70 85
例5数据库范式,联系人信息表
姓名 性别 电话
小明 男 0101-,
小叶 女 0101-,
以上的表就不符合,第一范式:电话可以再分,所以变更为正确的是:
姓名 性别 座机 手机
小明 男 0101-
小叶 女 0101-
例6,公司信息表
公司编号 名称 地址
谷歌 美国加利福尼亚州圣克拉拉县山景市
百度 中国北京市海淀区上地十街10号百度大厦
以上的表就不符合,第一范式:地址可以再分,所以变更为正确的是:
公司编号 名称 国籍 地址
谷歌美国 加利福尼亚州圣克拉拉县山景市
百度 中国 北京市海淀区上地十街10号百度大厦
对于例6地址的拆分可根据需求进行,不一定非要拆分。如果需知道哪个国家并按其分类,那么显然第一个表格是不容易满足需求的,也不符合第一范式。因此是否符合第一范式的要求在一定程度上取决于后期对数据的查询和使用上,当然,第一范式是前人总结的通用方法,遵循它会得到意想不到的好处。
2NF:有主键,非主键字段依赖主键
首先是满足 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键。
主键很重要,要记住在设计表的时候无论如何也要添加主键,没有主键的表会给你带来噩梦般的体验,会给系统开发、功能维护、数据维护带来不必要的麻烦。举个例子,上面例5,联系人信息表就没有添加主键,如下数据你想删除小明的信息该如何操作,根据姓名吗?不行,因为有重名的情况,只能通过姓名+电话两个字段组合为一个唯一的条件进行删除。
姓名 性别 电话
小明 男 0101-,
小叶 女 0101-,
小朱 女 0101-,
小明 男 0101-,
而有了主键,情况会是怎样的呢?你只需要根据联系人编号即可删除,一步到位。
联系人编号 姓名 性别 电话
1 小明 男 0101-,
2 小叶 女 0101-,
3 小朱 女 0101-,
4 小明 男 0101-,
切记数据库范式,在任何时刻,一张表一定要有主键,如果你无法确定业务中哪个字段作为主键,那么你就建立一个ID字段作为主键,多一个ID字段不会影响什么。
例1,学生信息表(主键学号)
学号 姓名 性别 年龄 课程名称 学分
2008 张三 男 15 语文 45
2008 张三 男 15 数学 55
2009 李四 女 16 语文 45
2009 李四 女 16 数学 55
以上的表就不符合,第二范式:主键(学号)无法唯一确定课程名称和学分,也就是说部分非主键字段不依赖主键,所以变更为正确的是:
学生信息表
学号 姓名 性别 年龄
2008 张三 男 15
2008 张三 男 15
课程表
课程名称 学分
语文 45
数学 55
学生选课表
学号 课程名称
2008 语文
2008 数学
2009 语文
2009 数学
例2,学生借书表
学生证号 学生证办理时间 借书证号 借书证办理时间
2008 2010年9月1号 2010年10月1号
2009 2010年9月2号 2011年10月1号
以上的表就不符合,第二范式:借书证号和借书证办理时间这些非主键字段不依赖学生证号这个主键,所以变更为正确的是:
学生证表
学生证号 学生证办理时间
2008 2010年9月1号
2009 2010年9月2号
借书证表
借书证号 借书证办理时间
2010年10月1号
2011年10月1号
例3,订单表
订单编号 产品编号 定购日期 价格
001 2010年10月1号 100
以上的表就不符合,第二范式:"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列,所以变更为正确的是:
订单表
订单编号 定购日期 价格
2010年10月1号 100
3NF:非主键字段不能相互依赖
首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。通俗解释:任意一个字段都只依赖表中的同一个字段。
例1,家庭成员表
户主 儿子 女儿 女儿的小熊 女儿的海绵宝宝
Jack Tom Lucy Bear
Jobs july Lily Bear2
以上的表就不符合,第三范式:其中 儿子,女儿等非主键列都完全依赖于主键(户主),所以符合 2NF,不过问题是 女儿的小熊,女儿的海绵宝宝直接依赖的是 女儿字段(非主键列),而不是直接依赖于主键,它通过传递才依赖于主键,所以不符合 3NF。 所以变更为正确的是:
户主信息表
户主 儿子 女儿
Jack Tom Lucy
Josb July Lily
女儿信息表
女儿 女儿的小熊 女儿的海绵宝宝
Lucy Bear
Lily Bear2
例2,订单表(主键是)
101 2011年 100 xx联合公司 中央大街100号 纽约
102 2012年 100 xx联合公司 中央大街100号 纽约
103 2014年 200 yy联合公司 白宫 纽约
以上的表就不符合,第三范式:其中 ,等非主键列都完全依赖于主键(),所以符合 2NF,不过问题是 ,, 直接依赖的是 (非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。 所以变更为正确的是:
订单表
101 2011年 100
102 2012年 100
103 2014年 200
客户信息表
100 xx联合公司 中央大街100号 纽约
200 yy联合公司 白宫 纽约
例3,学生信息表(主键是学号)
学号 姓名 所在系 系名称 系地址
101 小明 001 数学系 1号楼
102 小叶 002 文学系 5号楼
103 小炫 003 物理系 6号楼
以上的表就不符合,第三范式:其中学号,姓名,所在系等非主键列都完全依赖于主键(学号),所以符合 2NF,不过问题是系名称,系地址直接依赖的是所在系(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。 所以变更为正确的是:
学生表
学号 姓名 所在系
101 小明 001
102 小叶 002
103 小炫 003
院系信息表
系编号 系名称 系地址
001 数学系 1号楼
002 文学系 5号楼
003 物理系 6号楼
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
通过对每个范式的定义介绍,加上几个在实践中的反例进行讲解,可在一定程度上加快理论的理解,缩短理论和实践之间的距离,可快速上手3范式在开发中的应用。
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh