数据库三范式(2020-09-21)

数据库三范式

第一范式

对于一张表,要求表中有
1、主键:能唯一确定一行记录的属性,要求该属性是唯一的且不能为空
2、原子性:要求每一个字段是原子性不能再拆分,例如联系方式中放了手机号与邮箱,就不满足原子性

错误示例
学生编号学生姓名联系方式
1001王五3312039987@qq.com,13978303856
1001李四609852698@qq.com,1478953322
1002大麻子70932698@qq.com,15978562369

注意:这张表中,学生编号重复,即违反了主键;然后联系方式中写了邮箱和电话号码,可拆分成两列,违反了原子性

修改后
学生编号(pk)学生姓名邮箱电话
1001王五3312039987@qq.com13978303856
1001李四609852698@qq.com1478953322
1002大麻子70932698@qq.com15978562369

关于第一范式结论

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->教师表的教师编号
1001001
1002002
1003001
1001002

第三范式

建立在第二范式基础上,要求非主键字段不能产生传递依赖于主键字段

学生编号(pk)学生姓名班级编号班级姓名称
1001张三01一年级一班
1002李四02一年级二班
1003王五03一年级三班
1004麻六03一年级三班

综合分析

1、从表中看出,班级名称字段存在冗余,因为班级名称可以通过学生编号得出,也可以通过班级编号得出。

解决方案

1、将冗余字段拿出来单独建表,
2、如下表所示,学生信息表中班级编号设为外键fk

学生编号学生姓名班级编号
1001张三01
1002李四02
1003王五03
1004麻六03
班级编号班级名称
01一年级一班
02一年级二班
03一年级三班
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值