数据库三范式
第一范式
对于一张表,要求表中有
1、主键:能唯一确定一行记录的属性,要求该属性是唯一的且不能为空
2、原子性:要求每一个字段是原子性不能再拆分,例如联系方式中放了手机号与邮箱,就不满足原子性
错误示例
学生编号 | 学生姓名 | 联系方式 |
---|---|---|
1001 | 王五 | 3312039987@qq.com,13978303856 |
1001 | 李四 | 609852698@qq.com,1478953322 |
1002 | 大麻子 | 70932698@qq.com,15978562369 |
注意:这张表中,学生编号重复,即违反了主键;然后联系方式中写了邮箱和电话号码,可拆分成两列,违反了原子性
修改后
学生编号(pk) | 学生姓名 | 邮箱 | 电话 |
---|---|---|---|
1001 | 王五 | 3312039987@qq.com | 13978303856 |
1001 | 李四 | 609852698@qq.com | 1478953322 |
1002 | 大麻子 | 70932698@qq.com | 15978562369 |
关于第一范式结论
1
、
每
一
行
必
须
唯
一
,
也
就
是
每
个
表
必
须
有
主
键
,
这
是
我
们
数
据
库
表
设
计
的
最
基
本
要
求
\color{#FF0000}1、每一行必须唯一,也就是每个表必须有主键,这是我们数据库表设计的最基本要求
1、每一行必须唯一,也就是每个表必须有主键,这是我们数据库表设计的最基本要求
2、主键通常用数值型表示
3、关于列不可在分,根据具体情况来定,即根据业务来定,如果是在国外开发的话,可能就需要将姓名拆分为“姓”和“名”了。
第二范式
第二范式建立在第一范式基础之上,要求数据库中所有非主键字段完全依赖主键,不能产生部分依赖;( 严 格 意 义 上 说 , 尽 量 不 要 使 用 联 合 主 键 \color{#FF0000}严格意义上说,尽量不要使用联合主键 严格意义上说,尽量不要使用联合主键)
示例一:数据仍然可能重复
学生编号 | 学生姓名 | 教师编号 | 教师姓名 |
---|---|---|---|
1001 | 张三 | 001 | 王老师 |
1002 | 李四 | 002 | 赵老师 |
1003 | 王五 | 003 | 王老师 |
1001 | 张三 | 002 | 赵老师 |
示例二:确认主键,学生姓名、教师姓名出现冗余[此时使用的是联合主键]
学生编号(pk) | 学生姓名 | 教师编号(pk) | 教师姓名 |
---|---|---|---|
1001 | 张三 | 001 | 王老师 |
1002 | 李四 | 002 | 赵老师 |
1003 | 王五 | 003 | 王老师 |
1001 | 张三 | 002 | 赵老师 |
综合分析
1、以上虽然确定了主键,但是词表会出现大量的冗余,主要涉及到的冗余字段为“学生姓名”和“教师姓 名”。
2、出现冗余的原因是,学生姓名部分依赖了主键的一个字段“学生编号”,而没有依赖教师编号;而教师姓名部分依赖了主键的一个字段教师编号,这既是第二范式的部分依赖。
解决方案如下
分析:学生与老师是多对多的关系
学生编号(pk) | 学生姓名 |
---|---|
1001 | 张三 |
1002 | 李四 |
1003 | 王五 |
教师编号(pk) | 教师姓名 |
---|---|
001 | 王老师 |
002 | 赵老师 |
不存在非主键字段部分依赖主键字段这种情况了
学生编号(pk)fk->学生表的学生编号 | 教师编号(pk)fk->教师表的教师编号 |
---|---|
1001 | 001 |
1002 | 002 |
1003 | 001 |
1001 | 002 |
第三范式
建立在第二范式基础上,要求非主键字段不能产生传递依赖于主键字段
学生编号(pk) | 学生姓名 | 班级编号 | 班级姓名称 |
---|---|---|---|
1001 | 张三 | 01 | 一年级一班 |
1002 | 李四 | 02 | 一年级二班 |
1003 | 王五 | 03 | 一年级三班 |
1004 | 麻六 | 03 | 一年级三班 |
综合分析
1、从表中看出,班级名称字段存在冗余,因为班级名称可以通过学生编号得出,也可以通过班级编号得出。
解决方案
1、将冗余字段拿出来单独建表,
2、如下表所示,学生信息表中班级编号设为外键fk
学生编号 | 学生姓名 | 班级编号 |
---|---|---|
1001 | 张三 | 01 |
1002 | 李四 | 02 |
1003 | 王五 | 03 |
1004 | 麻六 | 03 |
班级编号 | 班级名称 |
---|---|
01 | 一年级一班 |
02 | 一年级二班 |
03 | 一年级三班 |